kleiner Klima-Sensor

kleiner Klima-Sensor

Im neu gebauten Lagerkeller wollen wir den Verlauf von Temperatur und Luftfeuchtigkeit kennen. Weniger wichtig sind uns dabei die absoluten Werte, eher der Verlauf. Nimmt die Luftfeuchtigkeit bei langen Regenperioden zu oder trocknet er aus bei Hitze im Sommer, das wollen wir feststellen.

Dazu reichen Sensoren aus der Restekiste. Ein kleines Board mit einem DHT22 und Steckplatz für einen ESP-01. Beides habe ich zahlreich rumliegen aus früheren Basteleien. 

Im neuen Keller habe ich noch keinen Strom, also muss der Sensor mit Batterie versorgt werden. Ein ESP-01S ist nicht auf Sparsamkeit designed und so braucht er den deepSleep Modus. Mit den 8 rausgeführten Pins ist dieser nicht realisierbar und es muss eine Litze vom GPIO16 zum Reset-Pin gelegt werden. Details seht ihr hier: deepSleep

Das DHT22 Board hat den Vorteil dass mit jeder Spannungsquelle zwischen 3.3 bis 12 Volt drangegangen werden kann.
Es hat den Nachteil, dass eine PowerLED verbaut ist, die auch Strom verbraucht, selbst wenn der ESP-01 im deepSleep Modus ist. Also kratzen wir die LED, oder den Widerstand davor, einfach ab.

Mit einem LiPo und den Leitungen sieht das ganze Paket dann so aus:

Ein paar Zeilen C-Code mit PlatformIO auf den ESP-01 übertragen, lösen die Messung aus, senden die Messwerte an meine InfluxDB und mit Grafana wird später ein Dashboard erstellt.

Leider funktioniert es nicht wie gedacht. Jedesmal wenn ich das Board mit Strom versorge schickt es die Messwerte. Danach kommt nie mehr ein Messwert. Auch nicht wenn ich das Board mit dem kleinen Taster resette. 

Ich ändere den Code und füge ein kurzes Blinken der blauen LED auf dem ESP-01 ein. Gleicher Effekt, nur beim erstmaligen Stromanschluss läuft das Board und schickt Daten.

Debugging ist aufwendig, das ESP-01 hat keinen rausgeführten USB-Anschluss den man anschliessen könnte und serielle Meldungen verfolgen könnte. Ich schicke ein blaues Blinken los, wenn sich der ESP-01 ins WLAN einloggt, wieder nichts.

Der DHT22 ist am PIN2 angeschlossen, man sieht auch schön die Leitung auf der Unterseite des Boards. PIN2 ist TX am ESP-01. Hmm, beim aufwachen aus dem deepSleep wird darüber ein log ausgegeben. Der stört wohl meine Messung. Beim erstmaligen Start erfolgt kein dump, nur beim Aufwachen aus dem deepSleep.

Dann nehme ich halt nicht PIN2 sondern PIN0. Ich zerstöre die Datenautobahn auf dem Board und installiere einen Ersatzverkehr auf PIN0. Im Code noch den DHT-Pin von 2 auf 0 ändern und ausprobieren:

Perfekt, das war’s.

 

Der kleine Sensor liegt auf der Treppe im Keller und sendet alle 2 Minuten seine Messdaten. 

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include "DHTesp.h"
// Peter F aus H im November 2023
// DHT22 an ESP-01 mit deepSleep() für Akkubetrieb
// pf@nc-x.com
// deep sleep parameter
const char* ssid = "#Weiherhuette2"; // WLAN-Name,
const char* password = "58129659096740086690"; // WLAN-Passwort
DHTesp dht; // DHT Sensor definieren
#define LED 2
float korr_temp = -3;
float korr_hum = 5;
// influx Datenbank
// > create database klima
// > use klima
// > create user esp8266 with password 'airbnb' with all privileges
// > grant all privileges on klima to esp8266
// > exit
#include <InfluxDbClient.h>
#define INFLUXDB_URL "http://192.168.22.148:8086"
#define INFLUXDB_DB_NAME "klima"
#define INFLUXDB_USER "esp8266"
#define INFLUXDB_PASSWORD "airbnb"
InfluxDBClient influx_client(INFLUXDB_URL, INFLUXDB_DB_NAME);
Point sensor("Ostfluegel"); // measurement in Influx

void ledticktack() {
  digitalWrite(LED, LOW);
  //Serial.println(F("Tick"));
  delay(100);
  digitalWrite(LED, HIGH);
  //Serial.println(F("Tack"));
  delay(100);
}

/*****************************************************************
* Messdaten in die INfluxDB schreiben
******************************************************************/
void sende2influx(float t, float h,float dew) {
  if (isnan(t) ||isnan(h)) {
    Serial.println("DHT22 konnte nicht ausgelesen werden");
    sensor.clearFields();
    sensor.addField("keller_valid",0);
    sensor.addField("keller_signal", WiFi.RSSI());
    Serial.println(influx_client.pointToLineProtocol(sensor));
  }
  else {
    sensor.clearFields();
    sensor.addField("keller_temp", t+korr_temp);
    sensor.addField("keller_humidity", h+korr_hum);
    sensor.addField("keller_dewPoint", dew);
    sensor.addField("keller_signal", WiFi.RSSI());
    sensor.addField("keller_valid",1);
    Serial.println(influx_client.pointToLineProtocol(sensor));
    if (!influx_client.writePoint(sensor)) {
      Serial.print("InfluxDB write failed: ");
      Serial.println(influx_client.getLastErrorMessage());
    };
  };
};

void setup() {
  delay(100); //100ms. Warten damit die Seriele Kommunikation aufgebaut wurde.
  pinMode(LED, OUTPUT);
  WiFi.begin(ssid, password); //Initialisieren der Wifi Verbindung.
  while (WiFi.status() !=WL_CONNECTED) { //Warten bis die Verbindung aufgebaut wurde.
    // Serial.print(".");
    //ledticktack();
    delay(200);
  }
  dht.setup(0, DHTesp::DHT22);
  // Authentifizierung Influx-Datenbank
  influx_client.setConnectionParamsV1(INFLUXDB_URL, INFLUXDB_DB_NAME, INFLUXDB_USER,  INFLUXDB_PASSWORD);
  floattempValue=dht.getTemperature(); // -4 Temperatur vom Sensor DHT22 lesen
  floathumidityValue=dht.getHumidity(); // +8 relative Luftfeuchtigkeit vom Sensor DHT22 lesen
  floatdewPointValue=dht.computeDewPoint(tempValue, humidityValue, false);
  sende2influx(tempValue,humidityValue,dewPointValue);
  //schläft für n sekunden wenn Leitung zwischen RST und DO angeschlossen ist.
  //120e6 sind 2 Minuten.
  Serial.flush(); // waits for the transmission of outgoing serial data to complete
  //ledticktack();
  ESP.deepSleep(120e6);
  delay(100);
}
 
void loop() {
  // leer wegen deepSleep
}

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.