Kedves Blogolvasó
Ezt a posztot azért készítettem el, mert szerettem volna egy olcsó precíz talaj menti hőmérőt készíteni a kertbe. A BME280 szenzorok ára úgy elszállt, hogy már ennyit nem akartam áldozni rá. Ezért lett az SHT20 és ESP-01 páros a nyerő. Elkövettem azt a hibát, hogy előbb választottam ki az eszközöket, mint sem megnéztem volna a támogatottságát. Sajnos az SHT20 sem ESPeasy, sem tasmota, sem ESPhome alatt nem támogatott még. Maradt a svájci bicska: SHT20 és ESP-01 – Arduino IDE alatt.
A koncepció az, hogy 18650-es akksiról működjön, és a mért adatokat MQTT-n keresztül küldje a HA alá. Természetesen nem szeretném 3 naponta tölteni, ezért az ESP-01 Deep Sleep képessé lett átalakítva.
SHT20 és ESP-01 Kapcsolási rajz:
Természetesen nem ússzuk meg könyvtárak letöltése nélkül a dolgot, de az Arduino ide már csak ilyen. Szükségünk lesz a PubSubClient lib-re, és a DFRobot_SHT20 lib-re. Nálam alapértelmezett, hogy az ESP8266 környezet már fel van telepítve, akinél nincs az tegye meg az Alaplap kezelőben. Ezt megtehetjük a könyvtár kezelőből is. Vagy manuálisan a könyvtár megfelelő helyre másolásával. Az SHT20 lib-et amúgy is másolni kell, mert nincs a könyvtárkezelő repo-jában.
Könyvtárkezelő: Ctrl+Shift+L
Ha ezzel megvagyunk nincs más dolgunk, mint az alábbi kódot bemásolni, és kiegészíteni a számunkra megfelelő elérési utakkal és autentikációs adatokkal:
#include <Wire.h> #include "DFRobot_SHT20.h" #include <ESP8266WiFi.h> #include <PubSubClient.h> DFRobot_SHT20 sht20; const char* ssid = "WIFI SSID"; const char* password = "WIFI_PASSWORD"; const char* mqttServer = "IP OR DOMAIN"; const int mqttPort = 1883; const char* mqttUser = "MQTT_USERNAME"; const char* mqttPassword = "MQTT_PASSWORD"; WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); Serial.println("SHT20 Teszt"); sht20.initSHT20(); delay(100); sht20.checkSHT20(); Wire.begin(0,2); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); client.setServer(mqttServer, mqttPort); client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP8266Client", mqttUser, mqttPassword )) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Az üzenet megérkezett a topicba: "); Serial.println(topic); Serial.print("Message:"); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } } void loop() { client.loop(); float humd = sht20.readHumidity(); float temp = sht20.readTemperature(); float dews = log(humd/100) + (17.62 * temp) / (243.12 + temp); float dewp = ((243.12 * dews) / (17.62 - dews)); char humidity[8]; dtostrf(humd, 6, 2, humidity); char temperature[8]; dtostrf(temp, 6, 2, temperature); char dewpoint[8]; dtostrf(dewp, 6, 2, dewpoint); client.publish("garden-sht20/temperature", temperature); client.subscribe("garden-sht20/temperature"); delay(2*1000); client.publish("garden-sht20/humidity", humidity); client.subscribe("garden-sht20/humidity"); delay(2*1000); client.publish("garden-sht20/dewpoint", dewpoint); client.subscribe("garden-sht20/dewpoint"); delay(5*1000); ESP.deepSleep(900E6); }
A Topic neveket nyilván mindenki olyanra írja át mint amilyenre szeretné. Ebben nincsenek megkötések. A harmatpont számítás nem a sajátom, kérem nézze el nekem mindenki, hogy nem osztom meg a forrást. Azt hiszem egy fejlesztői fórumból nyúltam le, de hogy honnan, arra már nem emlékszem.
Érdemes az eredményeket ellenőrizni az MQTT Explorer-el. Az MQTT explorer letölthető az alábbi linken. Nálam mindig ez az első lépés.
Ha ezzel megvagyunk, és érkeznek az üzenetek a topic-ok alá akkor jöhet a Home Assistant beállítás. A külső eszközöket a configuration.yaml fájlba kell beírni.
Nálam ez így néz ki:
sensor SHT20_Temp: platform: mqtt name: "Talajmenti hőmérséklet" state_topic: "garden-sht20/temperature" qos: 0 unit_of_measurement: "C" sensor SHT20_Humi: platform: mqtt name: "Talajmenti páratartalom" state_topic: "garden-sht20/humidity" qos: 0 unit_of_measurement: "%" sensor SHT20_Dew: platform: mqtt name: "Talajmenti harmatpont" state_topic: "garden-sht20/dewpoint" qos: 0 unit_of_measurement: "C"
Ezután frissíteni kell a configot a HA-ban (ilyenkor újratölti elviekben). Ha így nem jelennek meg az Entitások, akkor Core restart.
Remélem mindenkinek érthető volt a leírás. Sajnos nem 0 km-es kezdőkre íródott, de azért ha az alapok megvannak, akkor nem nehéz szerintem reprodukálni, vagy átalakítani a kódot. Ami pedig a kialakítást illeti, szerintem járható út az is, hogy a 18650-es akksit egy foglalatba rakjuk, és egy TP4056 töltővel töltjük. Így nem kell kivenni a foglalatból az akksit, hanem elég csak a töltőre feldugni. Azzal sem kell foglalkozni, hogy az ESP-t kivegyük a foglalatból, hiszen az AMS 3.3V egyenfeszültséget ad számára. Mindenesetre linkelek pár hasznos alkatrészt.
TP4056 Li-ion akkumulátor töltő
AMS1117 feszültség stabilizátor