Termometru și higrometru
În vederea realizării măsurării parametrilor de temperatură și umidității relative într-o locație și transmiterea către un server, ce are instalate serviciile: MQTT, Telegraf, InfluxDB și Grafana se poate folosi cu succes următoarea placă de dezvoltare de la Wemos este compatibilă cu placa Wemos D1 R2 & MINI din mediul Arduino sau din PlatformIO:
pe lângă aceasta mai avem nevoie de un senzor DHT22 necesar măsurării mărimilor de temperatură și umiditate:
Placa de dezvoltare citește datele transmise de către senzorul DHT22 la pinul D2 respectiv GPIO4 sau pinul 4 în Arduino.
După conectarea plăcii la AP prin WiFi acesta va transmite/publica la un server MQTT parametrii citiți de la senzorul DHT22.
Telegraf preia parametrii publicați în topicul "sensors/esp8266/umiditate" și "sensors/esp8266/temperatura".
Parametrii publicați sunt de forma (se observă în clientul MQTTfx):
TempCamera Temp=24.0
UmidCamera Umid=32.0
după preluare, Telegraf va crea în InfluxDB două tabele (measurements) TempCamera și UmidCamera în baza de date espduino (a se citi pagina de instalare și configurare a Telegraf):
Codul folosit este următorul:
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
//
//Definesc constantele
//
//pentru senzor
#define DHTPIN 4 //Pinul unde este conectată ieșire digitală de la senzorul DHT22
#define DHTTYPE DHT22 // definim modelul DHT22 (AM2302)
//
// pentru WIFI
const char* ssid = "xxx";//SSID unde mă conectez
const char* wifiPassword = "xxx";//parola aferentă SSID-ului
//
//pentru serverul MQTT
const char* mqttServer = "xxx.xxx.x.xx";//adresa serverului MQTTT
const int mqttPort = 1883;//portul de acces la serverul MQTT
const char* mqttUser = "esp8266";//utilizatorul ce are acces la serverul MQTT
const char* mqttPassword = "parola";//parola utilizatorului
const char* topic_umiditate = "sensors/esp8266/umiditate";//topicul pentru umiditate
const char* topic_temperatura = "sensors/esp8266/temperatura";//topicul pentru temperatura
//
//Definesc funcțiile
void setup_wifi();
void reconect();
//
//Definesc obiectele
DHT_Unified dht(DHTPIN, DHTTYPE); //definesc obiectul dht
WiFiClient espClient;//definesc obiectul espClient
PubSubClient client(espClient);//definesc obiectul client
//
//
float T, H;//definesc variabile necesare temperaturii și umidității
//
void setup() {
// codul din acestă funcție este rulat numai odată după alimentarea microcontrolerului
Serial.begin(115200); //inițializez comunicația serială folosită numai pentru debug
//
delay(10); //o mica intarziere
dht.begin();// inițializez senzorul DHT22
setup_wifi();//apelez funcția
client.setServer(mqttServer, mqttPort);//inițilizez conexiunea la serverul MQTT
//
Serial.println("Conexiune seriala stabilita...");
}
//
void loop() {
// codul din funcția loop se rulează la infinit:
sensors_event_t event;
dht.temperature().getEvent(&event);
T = event.temperature;
dht.humidity().getEvent(&event);
H = event.relative_humidity;
//
Serial.print("Temperatura: ");
Serial.print(T);
Serial.print(" C; ");
//
Serial.print("Umiditatea: ");
Serial.print(H);
Serial.println(" %;");
//
if (!client.connected()) {
reconect();//dacă utilizatorul nu s-a conectat la MQTT, reincerc
}
//
String MSG_T = "TempCamera Temp=";//construiesc tabela și câmpul - pentru InfluxDb
String MSG_H = "UmidCamera Umid=";//construiesc tabela și câmpul - pentru InfluxDb
String StrT = String(T).c_str();//transform în String datele de tip float
String StrH = String(H).c_str();//transform în String datele de tip float
String Temp = MSG_T+StrT;//concatenez mesajul pentru temperatura
String Umid = MSG_H+StrH;//concatenez mesajul pentru umiditate
client.publish(topic_temperatura, Temp.c_str(), true);//public temperatura
client.publish(topic_umiditate, Umid.c_str(), true);//public umiditatea
delay(1000);
}
//
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Ma conectez la ");
Serial.println(ssid);
//
WiFi.begin(ssid, wifiPassword);//inițializez conexiunea wifi
//
while (WiFi.status() != WL_CONNECTED) {
delay(500);//aștept jumătate de secundă
Serial.print(".");
}
//
Serial.println("");
Serial.println("S-a stabilit conexiune WiFi");
Serial.println("Adresa IP: ");
Serial.println(WiFi.localIP());
}
//
void reconect(){
while(!client.connected()) {
Serial.println("Astept sa ma conectez la serverul MQTT...");
if (client.connect("ESP8266Client", mqttUser, mqttPassword)) {//trimit id-ul, utilizatorul și parola pentru conectare la MQTT
Serial.println("m-am conectat");
}
else {
Serial.println("eroare, nr= ");
Serial.print(client.state());//scot nr erorii, in caz de aparitie se va invetiga motivul
Serial.println(" incerc din nou in 5 secunde");
delay(5000);//astept 5 secunde
}
}
}
Pentru realizarea unui grafic în Grafana trebuie să interogăm baza de date astfel:
iar rezultatul final în Grafana este următorul unde putem constata că senzorul de temperatură nu este "strălucit", prin apariția spike-urilor (este necesar o filtare software) iar variația de temperatură este dată de lampa de pe birou :):
Spike-urile erau de la tensiunea de alimentare, după ce am scos alimenatrea de la USB și am rămas numai pe baterie acestea au dispărut, cum zice englezul "work smooth":