Das zwanzigste Türchen

Hoy se trata de MQTT (Message Queue Server Telemetry Transport), un protocolo muy utilizado en el sector del hogar inteligente. Queremos eso Envidia Equípese con este protocolo de la oferta de hoy para que pueda conectarse fácilmente a los sistemas domésticos inteligentes. También conoceremos esa conexión. Seremos la envidia con el im Libro Smarthome Conecte el Smarthome Central como se describe.

Un mensaje MQTT consta de un tema y los datos asociados. El tema está estructurado jerárquicamente como una ruta de directorio. Los niveles individuales están separados por barras. Se pueden utilizar comodines. El funcionamiento de MQTT en detalle se describe en el capítulo 6 del libro Smarthome.

Los datos se representan como un objeto en formato JSON (Java Script Object Notation). La ventaja de este formato es que todos los datos se transmiten como cadenas legibles. Los valores medidos y las unidades se representan como propiedades de un objeto. Para el Envy definiremos las siguientes propiedades.

  • sensor Nombre del sensor (configurable)
  • t Valor de temperatura de SHT30
  • do Unidad de temperatura "° C" o "° F" (configurable)
  • H Humedad del SHT30
  • hu Unidad para la corrección de humedad "%"
  • G Concentración de gas de MQ2
  • Gu Unidad para la concentración de gas fijada "ppm"

Como se menciona en la lista, el nombre del sensor y la unidad de temperatura deseada deben ser configurables. También debería ser posible configurar el tipo de gas a examinar. Para que el Envy pueda conectarse a la WLAN y luego al broker MQTT, necesitamos los datos de acceso para la WLAN, la dirección del broker, los datos de acceso al broker, el tema MQTT y la tasa de repetición de la medición (por ejemplo, una medición por minuto). Todos estos valores también deben ser configurables.

Dado que el Envy no tiene elementos de entrada o visualización, la configuración se puede llevar a cabo usando constantes que están codificadas en el programa o, más elegantemente, usando un navegador. La biblioteca WebConfig está disponible para configuración a través del navegador, que puede proporcionar un formulario web configurable libremente a través de un servidor web. Esta biblioteca también se describe en el libro Smarthome de la página 168.

Dado que no es posible iniciar sesión en la WLAN sin configuración, en este caso primero iniciaremos un punto de acceso que entrega el sitio web de configuración a través de la dirección 168.178.4.1. Allí podemos ingresar los datos de acceso y reiniciar el Envy. Si el Envy tiene una configuración y puede iniciar sesión en la WLAN, no se inicia ningún punto de acceso. Se puede acceder a la página de configuración a través de la dirección que recibe el Envy cuando se conecta a la WLAN.

Dado que este procedimiento siempre se puede utilizar cuando un ESP8266 debe proporcionar valores medidos a través de MQTT, se desarrolló una biblioteca en conexión con el libro Smarthome que proporciona un archivo de inclusión que asume todas las tareas descritas anteriormente. La biblioteca está en Material para el libro pero también puede ser de GitHub descargado. La función de este archivo auxiliar también se describe en el libro que comienza en la página 176.

Esto nos lleva a nuestro boceto para el Envy. Deben instalarse las siguientes bibliotecas.

  • ClosedCube_SHT31D.h para SHT30 de la gestión de la biblioteca Arduino
  • MQUnifiedsensor.h para el sensor de gas de la gestión de la biblioteca Arduino
  • ESP8266_MQTT_Conf.h del archivo ZIP de GitHub
  • ArduinoJson.h para el formato JSON de la administración de la biblioteca Arduino
  • PubSubClient.h para el protocolo MQTT de la gestión de la biblioteca Arduino

Una vez instaladas todas estas bibliotecas, se puede compilar el boceto.

#include "ESP8266_MQTT_Conf.h" //Includedatei enthält alles für WiFi, Konfiguration und MQTT
#include <Wire.h> //Notwendig für SHT30
#include "ClosedCube_SHT31D.h" //Bibliothek für SHT30
#include <MQUnifiedsensor.h> //Bibliothek für Gassensor

//Parameter für den Gassensor
/************************Hardware Related Macros************************************/
#define Board ("ESP8266")
#define Pin (A0) //Analog input
/***********************Software Related Macros************************************/
#define Type ("MQ-2") //MQ2
#define Voltage_Resolution (3.3)
#define ADC_Bit_Resolution (10) // For arduino UNO/MEGA/NANO
#define RatioMQ2CleanAir (9.83) //RS / R0 = 9.83 ppm


// Spezifische Einträge für das Konfigurationsformular
String param = "["
"{"
"'name':'thema',"
"'label':'MQTT Thema Temp.',"
"'type':"+String(INPUTTEXT)+","
"'default':'envy'"
"},"
"{"
"'name':'sensor',"
"'label':'Name des Sensors',"
"'type':"+String(INPUTTEXT)+","
"'default':'SHT30'"
"},"
"{"
"'name':'typ',"
"'label':'Welches Gas?',"
"'type':"+String(INPUTSELECT)+","
"'default':'1',"
"'options':["
"{'v':0,'l':'Wasserstoff'},"
"{'v':1,'l':'LPG'},"
"{'v':2,'l':'Kohlenmonoxyd'},"
"{'v':3,'l':'Alkohol'},"
"{'v':4,'l':'Propan'}"
"]},"
"{"
"'name':'fahrenheit',"
"'label':'Fahrenheit',"
"'type':"+String(INPUTCHECKBOX)+","
"'default':'0'"
"}"
"]";


//SHT Sensor Instanz
ClosedCube_SHT31D sht;
//MQ2 Sensor Instanz
MQUnifiedsensor MQ2(Board, Voltage_Resolution, ADC_Bit_Resolution, Pin, Type);

// Einstellwerte für verschiedene Gase
const float gase [5] [2] {
{987,99, -2,162}, // Wasserstoff
{574.25, -2.222}, // GLP
{36974, -3.109}, // Kohlenmonoxyd
{3616.1, -2.675}, // Alcohol
{658.71, -2.168} // Propan
  };

// Daten an den MQTT Broker senden
void publishData () {
// Daten von SHT30 lesen die hohe Wiederholbarkeit verringert das Rauschen.
// Der Parameter 50 gibt den Timeout an
SHT31D result = sht.readTempAndHumidityPolling(SHT3XD_REPEATABILITY_HIGH, 50);
//Messwerte in Variable übernehmen
float humidity = result.rh;
float temperature = result.t;
String unit = "°C";
temperature = temperature - 6; //Korrektur wegen Erwärmung durch Gassensor und Controller. //Falls Fahrenheit gewählt wurde, die Temperatur umrechnen
if (conf.getBool("fahrenheit")) {
temperature= temperature * 1.8 +32;
unit="°F";
  }
// Messwerte vom Gassensor
MQ2.update (); // Actualización die Spannung am Analogeingang wird gemessen
gas flotante = MQ2.readSensor (); // Die Gaskonzentration en ppm ermitteln
tampón de carbón [1000]; // Buffer para el JSON Zeichenkette
// Der temporäre Speicher für das JSON Dokument wird angelegt
// Wir reservieren 500 Zeichen
StaticJsonDocument <500> doc;
// Das JSON Objekt wird mit Daten befüllt
doc ["sensor"] = conf.getValue ("sensor"); // Nombre de los sensores
doc ["t"] = temperatura; // Temperatura
doc ["tu"] = unidad; // Einheit
doc ["h"] = humedad; // Feuchte
doc ["hu"] = "%";
doc ["g"] = gas; // Gaskonzentration
doc ["gu"] = "ppm";
// Aus dem Objekt wird die JSON Zeichenkette im Buffer gebildet
uint16_t n = serializeJson (doc, búfer);
// Kontrollausgabe
Serial.println (búfer);
// Der Messwert wird mit dem Thema an den Broker gesendet
if (! client.publish (conf.getValue ("thema"), buffer, n)) {
Serial.print ("Fehler beim Senden an MQTT Server =");
Serial.println (client.state ());
  }
Serial.printf("Temperatur = %f %s Feuchtigkeit = %f %% Gaskonzentration = %f ppm\n",temperature,unit.c_str(),humidity,gas);
}


void setup() {
Serial.begin(74880); //Damit auch Bootmeldungen des ESP8266 angezeigt werden
//I2C Bus starten
Wire.begin();
//Start des SHT30
sht.begin(0x44);
//Seriennummer des SHT30 anzeigen
Serial.print("Serial #");
Serial.println(sht.readSerialNumber());
//Die Setupfunktion in der Include Datei aufrufen
//WLAN und Konfiguration werden vorbereitet
//Verbindung zum MQTT Broker wird hergestellt
//Der Parameter param enthält zusätzliche Formulareinträge
//für das Konfigurationsformular, true bedeutet dass wir einen
//Sensor haben
ESP_MQTT_setup(param,true);
//Callbackfunktion zum Senden der Daten registrieren
onPublish = publishData;
//Das Regressionsmodell für die Gaskonzentration wird gewählt
MQ2.setRegressionMethod(1); //_PPM = a*ratio^b
int gas = conf.getInt("typ");
//Die Parameter für das in der Konfiguration gewählte
//Gas werden gesetzt
MQ2.setA(gase[gas][0]); MQ2.setB(gase[gas][1]);
//Gas Sensor Bibliothek initialisieren
MQ2.init();
//Gassensor kalibrieren
Serial.print("Calibrating please wait.");
float calcR0 = 0;
for(int i = 1; i<=10; i ++)
{
MQ2.update(); // Update data, the arduino will be read the voltage on the analog pin
calcR0 += MQ2.calibrate(RatioMQ2CleanAir);
Serial.print(".");
}
MQ2.setR0(calcR0/10);
Serial.println(" done!.");

if(isinf(calcR0)) {Serial.println("Warning: Conection issue founded, R0 is infite (Open circuit detected) please check your wiring and supply"); while(1);}
if(calcR0 == 0){Serial.println("Warning: Conection issue founded, R0 is zero (Analog pin with short circuit to ground) please check your wiring and supply"); while(1);}
}

void loop() {
//Schleifenfunktion der eingebundenen Hilfsdatei aufrufen
//Sorgt dafür, dass die Messwerte in regelmäßigen
//Zeitabständen ermittelt und an den Broker gesendet werden
ESP_MQTT_loop();
}

Descargar boceto

La advertencia del compilador de que una biblioteca puede no ser compatible con la placa puede ignorarse.

Dado que muchas funciones se implementan en el archivo de inclusión, el código sigue siendo manejable. La función más importante es la función de devolución de llamada publishData (), a la que siempre se llama cuando se van a transmitir nuevos datos de los sensores al broker. Los sensores se preparan en la función de configuración y luego se llama a la configuración del archivo de inclusión. En el bucle principal, solo se llama a la función de bucle del archivo de inclusión. Justo al principio se define el parámetro constante de cadena, que contiene la descripción del formulario de las configuraciones especiales para el Envy.

Ahora podemos subir el boceto al Envy. Para eso necesitamos uno Adaptador FDTI donde conectamos GND, TX y RX a los mismos pines del Envy.


Una vez que se ha cargado el boceto, se puede iniciar el programa. Dado que todavía no hay ninguna configuración, se inicia un punto de acceso. Nos conectamos a este punto de acceso con un teléfono inteligente (no se requiere contraseña) y llamamos a la dirección en un navegador http://192.168.4.1 en. Ahora debería mostrarse la página de configuración.

 

Una vez guardada la configuración y reiniciado el Envy, este envía un telegrama de datos al broker MQTT en el intervalo de medición configurado. La figura muestra los mensajes que recibe el broker.


Ahora que el Envy proporciona sus valores medidos como mensajes MQTT, queremos mostrar los valores medidos en el centro de casa inteligente en el AZ-Touch. Cómo llegar al centro de hogar inteligente y cómo usarlo, puede averiguarlo en el libro de hogar inteligente. Solo quiero mostrar una configuración adecuada para mostrar los datos del Envy. Para ello, se requiere un centro de hogar inteligente funcional.

¡¡Nota IMPORTANTE!!

Cuando se terminó el libro, el MOD AZ-Touch y la pantalla de 2,8 pulgadas aún no existían. Por lo tanto, hay pequeños cambios en los bocetos de SmarthomeZentrale_x.ino en Material para el libro necesario. Excepto por el Sketch SmarthomeZentrale_8.ino en la carpeta "Nuevo", que ya contiene todos los cambios para el AZ-Touch MOD con pantalla de 2,8 pulgadas. Los cambios a realizar se describen en el archivo ReadMe.txt.

Agregamos una nueva página en blanco en la sede de Smarthome. En esta página estamos agregando tres widgets de barra de color con un ancho de 4 unidades y una altura de 14 unidades. Las figuras muestran los valores establecidos:


Dado que los valores límite no se ajustan, también ajustaremos la configuración específica de los widgets. Las figuras muestran los valores establecidos:


La página de visualización del Envy debería verse así:

 

 

Diviértase con el AZ Envy.

Especialidades

6 comentarios

Norbert

Norbert

Hallo,
die SmarthomeZentrale ist interessant, leider kann die sich nicht mit dem MQTT-Server verbinden, da der User und Password fehlt.
Gibt es da eine Lösung ?

Gruß Norbert

Jan

Jan

Alles klar – vielen Dank für die Info – probiere die Beispiele mal aus…

Grüße, Jan

Bernd Albrecht

Bernd Albrecht

Die Frage bezieht sich auf den Sensor MQ-2, der auch separat im Sortiment von AZ-Delivery verkauft wird. Auf der Produktseite gibt es dazu weiterführende Dokumentation.
https://www.az-delivery.de/en/products/gas-sensor-modul?pos=1&_sid=d98f89d48&ss=r
Kurz und knapp: Der Sensor liefert (nur) einen analogen Wert, der ungefähr einer bestimmten Gaskonzentration entspricht. Der Messtechniker nennt so etwas „Schätzeisen“. Wenn Sie nur den analogen Wert messen ( analogRead(A0) ) und einen Schwellenwert für einen Alarm festlegen, dann wird auch bei Rauch dieser Alarm ausgelöst.
Erfahrungswert: Bei einem 10-bit ADC (max. Wert 1023) liegt der Wert für normales Raumklima bei 70 – 110. Wenn Sie den Schwellenwert dann auf 200 festlegen, wird Alarm ausgelöst, wenn ein Schnapsglas in der Nähe verschüttet wird oder der offene Kamin nicht richtig zieht.

Jan

Jan

Hallo,
wie kann ich mir den Rauch(Smoke) ausgeben lassen?
Ihr bietet nur die Gase an…

Danke,

Jan

Gerald Lechner

Gerald Lechner

Hallo Thomas,
Du hast nichts falsch gemacht. Beim Upload der Files auf GitHub ist etwas schief gelaufen und damit war das ZIP File bis auf die Readme Datei leer. Das ist jetzt behoben. Bitte nochmals runterladen.
Sorry Gerald

Thomas Ücok

Thomas Ücok

Hallo,

die ESP8266_MQTT_Conf.h befindet sich nicht in dem GITHub Download. Oder mache ich da etwas
falsch ?

Gruß

Thomas Ücok

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas