Benutzer-Werkzeuge

Webseiten-Werkzeuge


iot:aussenthermometer:programmversion_0.2

Außenthermometer - Programmversion 0.2

In dieser Programmversion wurde der Code entfernt, der die Daten an Opensensemap sendet. Stattdessen werden die Messwerte an meinen eigenen Server übertragen. Davon abgesehen liegt der Fokus auf einem zuverlässigen Betrieb. Das heißt, dass der ESP32 niemals im Code hängen bleiben soll, wenn irgendetwas nicht wie geplant funktioniert. Beispielsweise legt sich der Außensensor sofort wieder schlafen, wenn keine Verbindung zum WLAN etabliert werden kann. Diese Programmversion läuft sehr stabil: seit Mitte Dezember bis Juli (Stand: Juli) blieb sie nicht einmal hängen.

// Außenthermometer
// Läuft auf einem Lolin D32 
// Misst Temperatur, Luftfeuchtigkeit und Luftdruck
// Berechnet den Taupunkt und den Hitzeindex
// Sendet die Daten an meinen eigenen Server

// Bibliotheken
#include <WiFi.h>
#include <Wire.h>
#include <SPI.h>  
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>


// Sensor Objekt
Adafruit_BME280 bme; // I2C

uint64_t chipid; 

// WLAN SSDI und Passwort
const char* ssid       = "XXXXXXXXXXXXXX";         // Name des WLAN
const char* password   = "XXXXXXXXXXXXXXXXXXXX";   // Passwort des WLAN

// Webserver XXXXXXXXXXXXXXX
char server[] = "XXXXXXXXXXXXXXXXX";
const int port = 80;

WiFiClient client;

const int sensorbox = 1;                           // Eindeutige ID des Außenthermometers. Wird von adddata.php ausgewertet
float temperature;                                 // Temperatur
float humidity;                                    // Luftfeuchtigkeit
float pressure;                                    // Luftdruck
float dewpoint;                                    // Taupunkt
float heatindex;                                   // Hitzeindex
float voltage;                                     // Spannung der Batterie
int rssi;                                          // Signalqualität des WiFi
int wifiCounter = 0;                               // Zählt die Verbindungsversuche zum WiFi
String data;                                       // String, der an den Webserver übertragen wird

#define uS_TO_S_FACTOR 1000000                     // Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  600                         // Time ESP32 will go to sleep (in seconds) */


void setup () {
  // Serielle Schnittstelle
  Serial.begin(115200);
  delay(1000); //Take some time to open up the Serial Monitor

  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds");

  // Chip ID 
  chipid = ESP.getEfuseMac();                      //The chip ID is essentially its MAC address(length: 6 bytes).
  Serial.printf("ESP32 Chip ID = %04X",(uint16_t)(chipid>>32));//print High 2 bytes
  Serial.printf("%08X\n",(uint32_t)chipid);//print Low 4bytes.

  // Initialisiert Wire
  Wire.begin(25, 26);           // SDA, SCL
  
  // Verbindung zum WLAN Router aufbauen
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {                      // Es wird 5 Sekunden eine Verbingung gesucht, danach wird abgebrochen
    if (wifiCounter <= 19) {
      wifiCounter ++;
      delay(500);
      Serial.print(".");
    }
    else {
      Serial.println("Connection to wifi failed!");
      Serial.println("Going to sleep now");
      delay(100);
      esp_deep_sleep_start();                                  // Wenn keine Verbindung zum WLAN hergestellt werden kann, geht der ESP32 in den Tiefschlaf
    }
  }
  
  Serial.println(" Connected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
 
  // BME280 initialisieren 
  bool status;
  status = bme.begin();  
  if (!status) {
      Serial.println("Could not find a valid BME280 sensor, check wiring!");
      while (1);
  }
  bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );
  
  // BME 280 abfragen 
  temperature = bme.readTemperature();
  humidity = bme.readHumidity();
  pressure = bme.readPressure() / 100.0F;

  // Taupunkt berechnen
  float a = 17.271; 
  float b = 237.7; 
  float dewpointTmp = (a * temperature) / (b + temperature) + log(humidity/100); 
  dewpoint = (b * dewpointTmp) / (a - dewpointTmp);
  Serial.print("Dewpoint: ");
  Serial.print(dewpoint);
  Serial.println(" °C");

  // Hitzeindex berechnen
  float c1 = -8.784695;
  float c2 = 1.61139411;
  float c3 = 2.338549;
  float c4 = -0.14611605;
  float c5 = -1.2308094e-2;
  float c6 = -1.6424828e-2;
  float c7 = 2.211732e-3;
  float c8 = 7.2546e-4;
  float c9 = -3.582e-6;
  heatindex = c1 + c2 * temperature + c3 * humidity + c4 * temperature * humidity + c5 * sq(temperature) + c6 * sq(humidity) + c7 * sq(temperature) * humidity + c8 * temperature * sq(humidity) + c9 * sq(temperature) * sq(humidity);
  Serial.print("Heatindex: ");
  Serial.print(heatindex);
  Serial.println(" °C");
  
  // Batteriespannung lesen
  voltage = analogRead(35) / 4096.0 * 7.445;
  Serial.print("Battery voltage: ");
  Serial.print(voltage);
  Serial.println(" volts");

  // Signalqualität WiFi
  rssi = (WiFi.RSSI() + 100) * 2;
  Serial.print("WiFi signal: ");
  Serial.print(rssi);
  Serial.println(" %");

  // String erzeugen
  data = "sensorbox=" + String(sensorbox)
       + "&temperature=" + String(temperature) 
       + "&humidity=" + String(humidity) 
       + "&pressure=" + String(pressure) 
       + "&dewpoint=" + String(dewpoint)
       + "&heatindex=" + String(heatindex)
       + "&rssi=" + String(rssi)
       + "&voltage=" + String(voltage);

  Serial.print("Data String: "); Serial.println(data);
  
  // Daten an den Webserver senden 
  Serial.print("Connecting to: ");
  Serial.println(server);
  
  if (client.connect(server, port)) {
    Serial.print("Connected to: ");
    Serial.println(server);
    client.print("GET /adddata.php?");
    client.print(data);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println(); 
    client.stop();
  }
  else {
    Serial.println("connection failed");
  }
  
  // Schickt den ESP32 in den Tiefschlaf
  Serial.println("Going to sleep now");
  delay(100);
  esp_deep_sleep_start();

}


void loop() {

}
iot/aussenthermometer/programmversion_0.2.txt · Zuletzt geändert: 18.05.2023 12:34 von 127.0.0.1