ESP32 Development Board mit BME280 und DeepSleep-Modus

Das erste Übertragen eines simplen Sketches auf das ESP32 Dev. Board hat gut funktioniert. Da bekam ich dann gleich Lust darauf weiterzumachen. Jetzt wird ein etwas älterer Sketch leicht angepasst um auf dem neuen Board zu laufen. Der Temperatursensor BME280 wird angeschlossen und der DeepSleep-Modus wird auch noch aktiviert.

Im ersten Schritt wird der BME280 mit dem ESP verbunden. Dazu wird neben der Spannungsversorgung noch die I2C-Schnittstelle bemüht. Mit SDA (I2C Data) und SCL (I2C Clock) wird der BME280 zur Kommunikation mit dem ESP32 ertüchtigt.

ESP32 Development Board BME280
3.3V VCC
GND GND
D22 (P22) SCL
D21 (P21) SDA

In der Regel wird der BME280 als BreakOut ohne Stiftreihe ausgeliefert. Diese sollte aber beiliegen und auch eingelötet werden. Dann kann man die Verbindungen leicht mit kleinen Breadboardkabeln herstellen.

Ein kleiner Hinweis zu dem Expansionboard. Neben den PINs der Developmentplatine sieht man von innen nach außen eine schwarze Kontaktreihe für GND, eine rote Kontaktreihe für Vcc (über Jumper konfigurierbar) und eine gelbe Kontaktreihe für das Signal auf dem danebenliegenden PIN auf dem Dev. Board. Zur Übersichtlichkeit benutze ich aber die separaten Stromanschlüsse links unten auf dem Board.

Jetzt geht es um den Sketch. Es ist der gleiche Sketch, wie in meinen vorherigen Beiträgen zum S2mini. Nur die Adresse der internen LED wurde wieder angepasst.

/*
MoWeSta Beispielcode für Solo Beginner
Anpassung für ESP Development Board
*/

#include <WiFi.h>

#include <MySQL_Connection.h>
#include <MySQL_Cursor.h> //Einbinden der Bibliothek des ESP32, speziell hier für das WiFi

#include <Adafruit_BME280.h> //Einbinden der Bibliothek des Sensors
//#include <Adafruit_Sensor.h>

//#define SEALEVELPRESSURE_HPA (1013.25) // Standardreferenzwert zur Ermittlung des Drucks


#define led 2 //BUILD_IN LED am Pin 2
#define sleeptime 10 //Schlafzeit in Sekunden

Adafruit_BME280 bme; // Für die Kommunikation mittels I2C
WiFiServer server(80); // Portdefinition für den Server, der später auf einer Webseite die Daten anzeigt
String textfeld; // Speicher für die Daten der Webseitenansicht

void setup() { // Starten der einzelnen Komponenten
Serial.begin(115200); // Für die serielle Kommunikation
//definieren das der Pin der LED als Ausgang dient
pinMode(led, OUTPUT);
digitalWrite(led, HIGH); //aktivieren der LED
delay(1000);
if (!bme.begin(0x76)) { // Überprüfung ob der Sensor angeschlossen ist, alternative Adresse ist 0x75
Serial.println("BME280 nicht gefunden!");
while (1);
}

Serial.println("Verbindung zum Netzwerk wird aufgebaut"); // Einbinden ins Heimnetzwerk
WiFi.begin("[deine SSID]", "[dein Password]"); // Name und Password des Netzwerks, beides jeweils in Anführungszeichen ohne die eckige Klammer
while (WiFi.status() != WL_CONNECTED) { // Einfache Statusanzeige
delay(500);
Serial.print(".");
}

Serial.println("Erfolgreich verbunden - IP Addresse:"); // IP Adresse zum Verbinden anzeigen
Serial.println(WiFi.localIP());
server.begin(); // Server starten
}

void loop(){ // Hier wird das eigentliche Programm in einer Schleife (loop) ausgeführt

Serial.println(bme.readTemperature());
Serial.println(bme.readPressure() / 100.0F);
Serial.println(bme.readHumidity());

Serial.println("Going to sleep...");
Serial.flush();
esp_sleep_enable_timer_wakeup(sleeptime * 1000000); //Board soll schlafen und nach [sleeptime] Sekunden aufwachen
esp_deep_sleep_start(); //Aktivierung Schlafzyklus



}

Auch das funktioniert auf Anhieb, was die Ausgabe im Seriellen Monitor zeigt:

18:50:06.502 -> ..ets Jul 29 2019 12:21:46
18:50:07.537 ->
18:50:07.537 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
18:50:07.583 -> configsip: 0, SPIWP:0xee
18:50:07.583 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
18:50:07.583 -> mode:DIO, clock div:1
18:50:07.583 -> load:0x3fff0030,len:4832
18:50:07.583 -> load:0x40078000,len:16460
18:50:07.583 -> load:0x40080400,len:4
18:50:07.583 -> load:0x40080404,len:3504
18:50:07.583 -> entry 0x400805cc
18:50:09.020 -> Verbindung zum Netzwerk wird aufgebaut
18:50:09.602 -> .Erfolgreich verbunden - IP Addresse:
18:50:09.602 -> 192.168.1.51
18:50:09.602 -> 25.10
18:50:09.651 -> 958.41
18:50:09.651 -> 41.84
18:50:09.651 -> Going to sleep...

Leider kommt es hier aber schon wieder zu einem Problem. Nach 2 Sleepphasen kommt keine Verbindung zum Netzwerk mehr zustande. Zunächst bin ich davon ausgegangen, dass 10 Sekunden Intervalldauer zu kurz sind. Aber auch eine Verlängerung auf 30 Sekunden brachte nichts. Im nächsten Schritt habe ich mir dann überlegt, dass man die WiFi-Verbindung wieder ordentlich schließen sollte. Das passiert mit dem Befehl WiFi.disconnect(true). Das brachte aber auch nichts. Seltsamerweise kommt nach einem RESET aber sofort wieder eine Verbindung zustande. Das gibt mir zu denken. Da muss doch irgendein Cache nicht sauber aufgeräumt sein. 

Ein weiterer Befehl, der das WiFi ausschaltet WiFi.mode(WIFI_OFF) verbesserte die Situation etwas. Prinzipiell bleibt aber das Problem bestehen.

Aktuell sehen die fraglichen Programmteile so aus:

  WiFi.disconnect(false);  // Reconnect the network
WiFi.mode(WIFI_STA); // Switch WiFi on

delay(1000);

Serial.println("Verbindung zum Netzwerk wird aufgebaut");
Serial.println("Going to sleep...");
Serial.flush();

WiFi.disconnect(true); //wifi-Verbindung beenden
WiFi.mode(WIFI_OFF); // Switch WiFi off
esp_sleep_enable_timer_wakeup(sleeptime * 1000000); //Board soll schlafen und nach [sleeptime] Sekunden aufwachen
esp_deep_sleep_start(); //Aktivierung Schlafzyklus
0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments