====== 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 #include #include #include #include // 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() { }