AdSense

Sonntag, 30. August 2020

Home Automation mit Raspberry PI und ESP8266, Teil 2: Ein einfacher Sensor (ESP8266)

(English version) Als ersten Teil möchte ich auf meine Temperatur- und Luftfeuchte-Sensoren eingehen. Ich nutze hierfür einen ESP8266, welcher einen Si7021-Sensor ausliest. Den Si7021 habe ich mit einem 4-poligen Kabel mit dem ESP8266 an den Pins D1-D4 verbunden, wie man es hier im Bild sehen kann:

Zusätzlich muss noch der Pin D0 mit RST verbunden werden, damit das Deep Sleep funktioniert, welches wir noch brauchen werden. Da ich außerdem relativ instabile Handyladegeräte für die Sensoren benutzt habe, habe ich noch einen Kondensator parallel zu G und 3V geschalten. 

Das Ganze kommt dann in ein 3D-gedrucktes Gehäuse, welches man hier auf Thingiverse finden kann: https://www.thingiverse.com/thing:4583759. Mit dem kleinen Bügel wird der Sensor im Gehäuse fixiert, danach kommt der ESP oben drauf und der Deckel fixiert dann alles. An der offenen Stelle ist nun genau genug Platz für den Anschluss des Handyladegeräts.



Der Code ist vergleichbar mit meinem anderen Post zu dem Thema, https://physudo.blogspot.com/2019/07/wlan-thermometer-mit-dem-dht22-und.html. Zuerst wird im Setup-Teil das WLan verbunden, sollte das nicht klappen resettet sich der ESP automatisch nach 100 Sekunden. Außerdem wird der Si7021-Sensor initialisiert.

In Loop wird dann, falls das WLan verbunden ist (ansonsten wird der ESP auch resettet), die Temperatur und Luftfeuchte gemessen. Sollte hier etwas schief gehen wird auch der ESP neu gestartet. Anschließend wird alles per http Request an den Raspberry gesendet, wie im vorigen Post beschrieben (https://physudo.blogspot.com/2020/08/home-automation-mit-raspberry-pi-und.html).

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
const char* ssid     = "WIFI SSID";
const char* password = "WIFI PASSWORD";

#include "Adafruit_Si7021.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();

void setup()
{
  Serial.begin(9600);

  Serial.print("Your are connecting to;");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  int resetCtr = 0;
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    resetCtr ++;
    Serial.print(".");
    if (resetCtr > 200)
    {
      ESP.restart();
    }
  }

  pinMode(D0, WAKEUP_PULLUP);
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
  digitalWrite(D3, HIGH);
  digitalWrite(D4, LOW);
  delay(500);

  while (!sensor.begin())
  {
    Serial.println("Did not find Si7021 sensor!");
  }

  digitalWrite(D3, LOW);
}



void loop() {
  if (WiFi.status() != WL_CONNECTED)
  {
    ESP.restart();
  }

  if (WiFi.status() == WL_CONNECTED)
  {
    Serial.println("");
    Serial.println("Your ESP is connected!");
    Serial.println("Your IP address is: ");
    Serial.println(WiFi.localIP());

    digitalWrite(D3, HIGH);
    delay(500);
    float t = sensor.readTemperature();
    Serial.print("Temperature: ");
    Serial.println(t);
    float h = sensor.readHumidity();
    Serial.print("Humidity: ");
    Serial.println(h);
    if (isnan(t))
    {
      t = sensor.readTemperature();
    }
    if (isnan(h))
    {
      h = sensor.readHumidity();
    }
    digitalWrite(D3, LOW);

    if (isnan(t))
    {
      ESP.restart();
    }
    if (isnan(h))
    {
      ESP.restart();
    }
    

        
    HTTPClient http;
    char requestString[255] = "";
    sprintf(requestString, "http://raspberrypi/SendValues.php?name=Temperatursensor_1&split=1&data=%f,%f", t, h);    
    http.begin(requestString);
    int httpCode = http.GET();
    Serial.println(httpCode);

    if (httpCode > 0)
    {
      String payload = http.getString();
      Serial.println(payload);
    }

    http.end();

    ESP.deepSleep(300e6); 
    delay(300000);
    ESP.reset();
  }
  else
  {
    Serial.println("");
    Serial.println("WiFi not connected");
    delay(1000);
  }
}

1 Kommentar: