SHT20 és ESP-01 – Arduino IDE alatt

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:

SHT20 és ESP-01 - Arduino IDE alatt

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.

 

ESP-01s

SHT20

18650 akkumulátor foglalat

Bontott 18650 akkumulátor

TP4056 Li-ion akkumulátor töltő

AMS1117 feszültség stabilizátor

(Statisztika: 80 megtekintés)