¿Cómo podemos ayudarte?

Sensor ultrasonico con servidor mqtt

Acerca del proyecto

En este post vamos a usar el sensor hcsr04 para medir la distancia y este dato lo vamos a enviar a un servidos mqtt para poderlo procesar y gráficar en una web, para ello nos guiaremos con el montaje de este sensor de post pasados y de la conexión de la placa wemos d1 a mosquitto.

Conocimiento previo

Para realizar este proyecto se requiere conocimiento previo de los siguientes temas, si aun no has trabajado con lo que se menciona en la siguiente tabla, allí están los links a los post para que puedas dar un repaso adicional o puedas recordar el conocimiento necesario para poder realizar este proyecto.

Proyecto Descripción
Datasheet hcsr04 Con el datasheet encontrara las características y el funcionamiento del sensor.
Arduino hcsr04 Podres ver a detalle la conexión del sensor con arduino.
Mosquitto server Antes de iniciar debemos conocer el servidor quien sera el encargado de recibir la información, sus características y como instarlo en los diferentes sistemas operativos.

Materiales

Software

Para el desarrollo de este proyecto vamos a requerir los siguientes programas, librerías e instaladores, a continuación encontrara los link para que los descargue y los post donde podrá realizar la instalación.

Software Descripción Link
Wemos D1
PubSubClient Esta biblioteca proporciona un cliente para realizar mensajes simples de publicación/suscripción con un servidor que admita MQTT. pubsubclient por Nick O'Leary
WiFiEsp La líbreria WiFiEsp permite que la placa arduino se conecte a intenet. WiFiEsp por bportaluri
Otros instaladores
Instalar mosquitto Tenemos unos post en donde explicamos la instalación de mosquitto con el protocolo mqtt, y en donde se realizan las primeras pruebas, recomiendo realizar este post antes de continuar.

Componentes electrónicos

Material Cantidad Descripción
Wemos D1 1 Cualquier placa arduino podemos trabajar
HC-SR04 1 Sensor de ultrasonido.
Cables de conexión Los que necesite Generalmente cables macho a macho

Pasos de conexión wemos D1 a mqtt

Configurar mosquitto

Para poder trabajar con mosquitto mqtt debemos realizar una configuración sobre el archivos mosquitto.conf el cual se encuentra en windows en la ruta "C:\Program Files\mosquitto" o linux "etc/mosquitto", donde se instalo el mosquitto.

En este archivo vamos a buscar y descomentar las siguientes lineas, si no estan las puede agregar al final:

allow_anonymous true
listener 1883

Estas lienas permiten habilitar las conexiones externas al servidor, en otros post explicamos como generar conexiones seguras.

Vamos a validar los siguiente antes de continuar, todo esto esta en los post de instalacion del entorno.

  • Verificar que el firewall acepte conexiones de salida ye entrada en el puerto 1883
  • Despues de hacer la configuración reiniciar el servidor
  • Realizar los ejemplos que menciono en el post Mosquitto enviar y recibir mensajes.

Ahora vamos a crear el topic en donde recibiremos las conexiones, para ello abrimos una terminal de comandos y colocamos lo siguiente:

mosquitto_sub -h localhost -t distancia -v

El topic donde recibimos los datos es distancia, puede colocar cualquier nombre.

Circuito

En el siguiente circuito esta la forma de conectar el sensor al wemos d1, aunque en la imagen se muestra la placa arduino la conexión es la misma.

Arduino hcsr04
9 Trig
8 Echo
5V VCC
GND GND

Código

Expliquemos el código paso a paso, para poderlo analizar mejor antes de entrar a verlo al detalle.

  • Primero vamos a incluir las librerías necesarias para realizar la comunicación, el link de descarga son los mencionados en los materiales, estas librerías se deben cargar al programa arruino.
  • Vamos a declarar una serie de variables en donde guardaremos el nombre de la red, contraseña y nombre del servidor.
  • Después inicializaremos los objetos correspondientes WiFiEspClient, PubSubClient, y softwareserial.
  • Ahora la primera acción que vamos a realizar es iniciar con el wifi, en donde validaremos si esta conectado y comunicándose el modulo, luego vamos a realizar la conexión al modulo con el nombre de la red y la contraseña.
  • Después de tener conexión al wifi indicamos cual es el servidor en donde esta mosquitto con el fin de abrir una conexión permanente para poder enviar información al topic.
  • Finalmente enviamos la cadena de texto con el dato que necesitamos enviar.
//Cargamos las librerias
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

//Creamos las variables para el acceso al WIFI 
//y al servidor mosquitto
const char* ssid = "NOMBRE_DE_LA_RED";
const char* password = "CONTRASEÑA";
const char* mqtt_server = "192.168.20.21";

//Inicializamos los objetos el cliente y el publicador
WiFiClient espClient;
PubSubClient client(espClient);

long lastMsg = 0;
char msg[50];
int value = 0;


//Se declaran los pines para el sensor
int const TRIG = D9;
int const ECHO = D8;


//Variables de calculo
float _distance;
float _time;


//Creamos la función que nos permitira realizar
//la conexión del wifi
void setup_wifi() {
    delay(10);
    Serial.println();
    Serial.print("Conectado a: ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }
    randomSeed(micros());
    Serial.println("");
    Serial.println("WiFi conectado");
    Serial.println("Direccion IP: ");
    Serial.println(WiFi.localIP());
}

//Creamos la función que permite realizar la conexión
//al servidor mosquitto
void reconnect() {
    Serial.println("reconnect");
    //Validamos si existe una conexión al servidor, 
    //de lo contrario intentamos conectarlo de nuevo
    while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    //Creamos un clinete ID ramdon
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    //Intentamos conectarnos
    if (client.connect(clientId.c_str())) {
        Serial.println("connected");
        //Enviamos un mensaje de prueba
        client.publish("outTopic", "hello world");
    } else {
        //Si la conexión fallo, intentamos de nuevo
        Serial.print("failed, rc=");
        Serial.print(client.state());
        Serial.println(" try again in 5 seconds");
        // Wait 5 seconds before retrying
        delay(5000);
    }
    }
}

void setup() {
    
    //Activación del pin como salida: para el pulso ultrasónico
    pinMode(TRIG, OUTPUT); 
    //Activación del pin como entrada: tiempo del rebote del ultrasonido
    pinMode(ECHO, INPUT); 
    Serial.begin(9600);
    Serial.println("setup");
    //Iniciamos la conexión del wifi
    setup_wifi();
    //Indicamos a que servidor nos conectamos
    client.setServer(mqtt_server, 1883);
}

void loop() {
    //Validamos la conexión si esta correcta
    if (!client.connected()) {
    reconnect();
    }
    
    //Dejamos el cliente el loop para que no cierre 
    //la conexión actual
    client.loop();

    float distanceSensor = readDistance();
    Serial.println("distancia");
    Serial.println(distanceSensor);
    snprintf (msg, 50, "%4.2f", distanceSensor);
    Serial.print("Publish message: ");
    Serial.println(msg);
    //Enviamos el mensaje
    client.publish("distancia", msg);

    delay(2000);
}

float readDistance(){
    digitalWrite(TRIG,LOW); 
    delayMicroseconds(5);
    //Envío del pulso ultrasónico
    digitalWrite(TRIG, HIGH); 
    delayMicroseconds(10);

    //Obtenemos el tiempo de rebote
    _time = pulseIn(ECHO, HIGH); 

    //Calculamos la distancia
    _distance = _time / 2 / 29.1;
    return _distance;
}

Prueba funcionamiento

Comentarios

Para dejar el comentario solo necesitamos tu correo que registraste en la pagina, pero si aun no te haz registrado se creara el usuario automaticamente.

Detalle contenido

base
Generic placeholder image
Oscar Fernandez Alzate

05, Mayo 2021

161
Categorías