
Ziele des Projekts
Mit einem ESP-01(S):
- Zeit auf einem 4-zeilgen LCD mit I²C-Schnittstelle anzeigen (nur ESP-01S)
- Messwerte BME280 auf einem 4-zeiligen LCD mit I²C-Schnittstelle anzeigen (nur ESP-01S)
- Messwerte eines DHT-Sensors im Webbrowser anzeigen
- Messwerte eines BME280-Sensors im Webbrowser anzeigen
Board installieren
- ESP-01(S)
Zeit auf einem 4-zeiligen LCD mit I²C-Schnittstelle anzeigen
Achtung
Das Programm funktioniert nur mit einem ESP-01S.
Benötigte Bauteile
- ⇒4-zeiliges LCD mit I²C-Schnittstelle
- Adapter für ESP-01
- MB102 Steckbrett Stromversorgungs-Modul
Der Schaltplan

Benötigte Bibliotken


Das Programm
- die Variable SekundenAnzeigen entscheidet darüber, ob die Sekunden angezeigt werden
true -> Sekunden anzeigen
false -> Sekunden verbergen - Der ESP-01 hat nur zwei digitale Pins, sie müssen als I²C-Pins definiert werden:
#define SDA_PIN 0
#define SCL_PIN 2 - der ESP-01 verwendet eine statische IP-Adresse, einen lokalen DNS-Server und einen öffentlichen DNS-Server
die IP-Adressen müssen an das lokale Netz angepasst werdenIPAddress ip(192, 168, 1, 100);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(192, 168, 1, 1);
IPAddress secondaryDNS(9, 9, 9, 9);
In der Regel reicht die Angabe des Router als DNS-Server aus, der zweite DNS-Server dient als Backup. - die Netzwerkverbindung wird im Stationsmodus hergestellt,
setSleepschaltet den Powersafe-Modus des WiFi-Moduls aus,setAutoReconnectversucht eine abgebrochene Verbindung neu aufzubauen:
WiFi.setSleep(false);
WiFi.setAutoReconnect(true); - der Rückgabewert der Aktualisierung der Zeit mit
ntp.update()ist im Erfolgsfall true.
Bei einem Misserfolg versucht das Programm die WiFi-Verbindung neu aufzubauen. Der Wert der Variable Start wird auf true gesetzt, im loop-Teil wird die Zeit sofort aktualisiert.ntp.isValid()gibt true zurück, wenn die ermittelte Zeit gültig ist. Ist das nicht der Fall, versucht das Programm die WiFi-Verbindung neu aufzubauen. Die Variable Start wird auf true gesetzt und die Zeit wird sofort aktualisiert.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
#include "LCDIC2.h" #include "ESP8266WiFi.h" #include "WiFiUdp.h" #include "NTP3.h" WiFiUDP wifiUdp; NTP3 ntp(wifiUdp); // SSID und Passwort des Routers char Router[] = "Router_SSID"; char Passwort[] = "xxxxxxxx"; // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); #define SDA_PIN 0 #define SCL_PIN 2 // ip und gateway müssen an das lokale Netz angepasst werden IPAddress ip(192, 168, 1, 100); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); // DNS-Server normalerweise identisch mit der IP des Routers IPAddress primaryDNS(192, 168, 1, 1); // öffentlicher sekundärer DNS-Server (Cloudflare) IPAddress secondaryDNS(9, 9, 9, 9); // beim Start des loop-Teils wird die Zeit einmalig synchronisiert volatile bool Start = true; unsigned long Zeitmessung = 0; int Sekunden; bool SekundenAnzeigen = true; void setup() { // I2C mit den angegegeben Pins starten Wire.begin(SCL_PIN, SDA_PIN); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); WiFi.begin(Router, Passwort); WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); /* Zeitzone CEST: Central European Summertime Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden */ ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120); // CET: Central European Time // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60); // ntp starten ntp.begin(); ntp.updateInterval(1000); WiFi.setAutoReconnect(true); WiFi.setSleep(false); Zeitmessung = millis() + 1000; } void loop() { // Start = true // -> Zeit einmalig beim Start synchronisieren // danach zur vollen Minute if (Start) { Start = false; ZeitAnzeigen(); } // Sekunden weiter zählen if (Zeitmessung < millis()) { Zeitmessung += 1000; Sekunden++; // nach 60 Sekunden Zeit aktualisieren if (Sekunden == 60) { Sekunden = 0; ZeitAnzeigen(); } if(SekundenAnzeigen) { lcd.setCursor(5, 3); lcd.print(":"); if(Sekunden < 10) lcd.print("0"); lcd.print(String(Sekunden)); } } } void ZeitAnzeigen() { if (ntp.update()) { // überprüfen ob die Zeit gültig ist if (ntp.isValid()) { Sekunden = ntp.seconds(); if(SekundenAnzeigen) { lcd.setCursor(5, 3); lcd.print(":"); if(Sekunden < 10) lcd.print("0"); lcd.print(String(Sekunden)); } lcd.setCursor(0, 0); switch(ntp.weekDay()) { case 0: lcd.print("Sonntag"); break; case 1: lcd.print("Montag"); break; case 2: lcd.print("Dienstag"); break; case 3: lcd.print("Mittwoch"); break; case 4: lcd.print("Donnertag"); break; case 5: lcd.print("Freitag"); break; case 6: lcd.print("Samstag"); break; } lcd.print(", "); // Datum lcd.setCursor(0, 1); lcd.print(ntp.formattedTime("%d.%m.%Y")); // Zeit lcd.setCursor(0, 3); lcd.print(ntp.formattedTime("%H:%M")); } // Zeit ist nicht gültig else { WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); Start = true; } } // WiFi ist nicht verbunden else { WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); Start = true; } } |
Messwerte BME280 auf einem 4-zeiligen LCD mit I²C-Schnittstelle anzeigen
Achtung
Das Programm funktioniert nur mit einem ESP-01S.

Benötigte Bauteile
- ⇒4-zeiliges LCD mit I²C-Schnittstelle
- ⇒BME280
- Adapter für ESP-01
- MB102 Steckbrett Stromversorgungs-Modul
Der Schaltplan

Benötigte Bibliotheken



Das Programm
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
#include "LCDIC2.h" #include "ESP8266WiFi.h" #include "WiFiUdp.h" #include "Adafruit_BME280.h" #include "NTP3.h" Adafruit_BME280 bme; WiFiUDP wifiUdp; NTP3 ntp(wifiUdp); // SSID und Passwort des Routers char Router[] = "Router_SSID"; char Passwort[] = "xxxxxxxx"; // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); #define SDA_PIN 0 #define SCL_PIN 2 // ip und gateway müssen an das lokale Netz angepasst werden IPAddress ip(192, 168, 1, 120); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); // DNS-Server normalerweise identisch mit der IP des Routers IPAddress primaryDNS(192, 168, 1, 1); // öffentlicher sekundärer DNS-Server (Cloudflare) IPAddress secondaryDNS(9, 9, 9, 9); // beim Start des loop-Teils wird die Zeit einmalig synchronisiert volatile bool Start = true; unsigned long Zeitmessung = 0; int Sekunden; void setup() { // I2C mit den angegegeben Pins starten Wire.begin(SCL_PIN, SDA_PIN); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); WiFi.begin(Router, Passwort); WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); lcd.clear(); lcd.setCursor(0, 0); lcd.print("WiFi gestartet!"); lcd.setCursor(0, 1); // BME280 starten Hex-Adressen ox76 oder 0x77 if(bme.begin(0x76)) lcd.print("BME280 gestartet!"); else lcd.print("BME nicht vorhanden "); /* Zeitzone CEST: Central European Summertime Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden */ ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120); // CET: Central European Time // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60); // ntp starten ntp.begin(); ntp.updateInterval(10000); WiFi.setAutoReconnect(true); WiFi.setSleep(false); Zeitmessung = millis() + 1000; } void loop() { // Start = true // -> Zeit einmalig beim Start synchronisieren // danach zur vollen Minute if (Start) { Start = false; lcd.clear(); ZeitAnzeigen(); MessungAnzeigen(); } // Sekunden weiter zählen if (Zeitmessung < millis()) { Zeitmessung += 1000; Sekunden++; // nach 60 Sekunden Zeit aktualisieren if (Sekunden == 60) { ZeitAnzeigen(); MessungAnzeigen(); } } } void ZeitAnzeigen() { if (ntp.update()) { // überprüfen ob die Zeit gültig ist if (ntp.isValid()) { Sekunden = ntp.seconds(); lcd.setCursor(0, 0); // Zeit lcd.setCursor(0, 0); lcd.print(ntp.formattedTime("%d.%m.%Y ")); lcd.print(ntp.formattedTime("%H:%M")); } // Zeit ist nicht gültig else { WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); Start = true; } } // WiFi ist nicht verbunden else { WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); Start = true; } } void MessungAnzeigen() { String Temperatur = String(bme.readTemperature(), 1); String Luftfeuchtigkeit = String(bme.readHumidity(), 1); String Luftdruck = String(int(bme.readPressure() / 100.0)); // float verwendet den . als Dezimaltrennzeichen // . mit replace durch , ersetzen Temperatur.replace(".", ","); Luftdruck.replace(".", ","); Luftfeuchtigkeit.replace(".", ","); lcd.setCursor(0, 1); lcd.print(Temperatur + "\337C "); lcd.setCursor(0, 2); lcd.print(Luftdruck + " hPa "); lcd.setCursor(0, 3); lcd.print(Luftfeuchtigkeit + "%"); } |
Messwerte eines DHT-Sensors im Webbrowser anzeigen

Benötigte Bauteile
- ⇒DHT-Sensor
- Adapter für ESP-01
- MB102 Steckbrett Stromversorgungs-Modul
Der Schaltplan


Benötigte Bibliotheken


Achtung
Der ESP-01 muss zwingend mit 3,3V verbunden werden!
Das Programm
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
#include "ESP8266WebServer.h" ESP8266WebServer Server(80); #include "DHT.h" #include "NTP3.h" #include "WiFiUdp.h" WiFiUDP wifiUdp; NTP3 ntp(wifiUdp); // Pin des DHT-Sensors int SENSOR_DHT = 2; #define SensorTyp DHT22 // Sensor DHT einen Namen zuweisen DHT dht(SENSOR_DHT, SensorTyp); // Router-SSID/Passwort anpassen char Router[] = "Router_SSID"; char Passwort[] = "xxxxxxxx"; // Info IP-Adressen anzeigen // true -> anzeigen, false -> verbergen bool InfoAnzeigen = true; // ip und gateway müssen an das lokale Netz angepasst werden IPAddress ip(192, 168, 1, 120); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); // DNS-Server normalerweise identisch mit der IP des Routers IPAddress primaryDNS(192, 168, 1, 1); // öffentlicher sekundärer DNS-Server (Cloudflare) IPAddress secondaryDNS(9, 9, 9, 9); void setup() { dht.begin(); // WiFi starten // Stations-Modus WiFi.mode(WIFI_STA); WiFi.setSleep(false); WiFi.setAutoReconnect(true); WiFi.begin(Router, Passwort); WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); /* Zeitzone CEST: Central European Summertime Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden */ ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120); // CET: Central European Time // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60); // ntp starten Zeitserver deutscher NTP-Pool // Standard: pool.ntp.org ntp.begin("de.pool.ntp.org"); ntp.updateInterval(10000); WiFi.setAutoReconnect(true); WiFi.setSleep(false); // Webserver starten // / -> Aufruf der URL, SeiteBauen -> Aufruf der Funktion Server.begin(); Server.on("/", SeiteBauen); } void loop() { // auf Anfragen warten Server.handleClient(); } void SeiteBauen() { // Daten lesen String Temperatur = String(dht.readTemperature()); String Luftfeuchtigkeit = String(dht.readHumidity()); // . durch , ersetzen Temperatur.replace(".", ","); Luftfeuchtigkeit.replace(".", ","); // Seite "zusammenbauen" String Seite = ""; // refresh -> Seite automatisch aktualisieren Zeit in Sekunden Seite += "<head><meta http-equiv=\"refresh\" content=\"60\"></head>"; Seite += "<h1 style=\"font-size: 24pt; color: green; background: #e9fdd4;padding: 10px;\">"; Seite += "Messwerte DHT</h1>"; Seite += "<p style=\"font-size: 16pt; color: black;\">"; Seite += "Letzte Messung: "; if (ntp.update()) { Seite += ntp.formattedTime("%H:%M:%S Uhr"); Seite += "</p>"; } Seite += "<p style=\"font-size: 16pt; color: blue;\">"; Seite += "Temperatur: " + Temperatur + " °C</p>"; Seite += "<p style=\"font-size: 16pt; color: green;\">"; Seite += "Luftfeuchtigkeit: " + Luftfeuchtigkeit + "%</p>"; // Button aktualisieren Seite += "<hr><input style=\"font-size:16pt; font-weight:bold;"; Seite += "background-color:#55A96B;"; Seite += "display:block; cursor:pointer;\"type=\"button\""; // Javascript -> Seite neu laden Seite += " onClick=\"location.reload()\" value=\"aktualisieren\">"; Seite += "<hr>"; // IP-Adressen anzeigen if (InfoAnzeigen) { Seite += "<p style=\"font-size: 16pt; color: black;\">"; Seite += "Verbunden mit: " + WiFi.SSID() + "<br>"; Seite += "Signalstärke: " + String(WiFi.RSSI()) + "<br>"; Seite += "IP-Adresse ESP: " + String(WiFi.localIP().toString()) + "</p>"; } // Seite anzeigen Server.send(200, "text/html", Seite); } |
Messwerte eines BME280-Sensors im Webbrowser anzeigen
Benötigte Bauteile
- ⇒BME280
- Adapter für ESP-01
- MB102 Steckbrett Stromversorgungs-Modul
Der Schaltplan

Benötigte Bibliotheken


Das Programm
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
#include "ESP8266WebServer.h" ESP8266WebServer Server(80); #include "WiFiUdp.h" #include "Adafruit_BME280.h" // Name des BME280 Adafruit_BME280 bme; #include "NTP3.h" WiFiUDP wifiUdp; NTP3 ntp(wifiUdp); #define SDA_PIN 0 #define SCL_PIN 2 // Router-SSID/Passwort anpassen char Router[] = "Router_SSID"; char Passwort[] = "xxxxxxxx"; // Info IP-Adressen anzeigen bool InfoAnzeigen = true; // ip und gateway müssen an das lokale Netz angepasst werden IPAddress ip(192, 168, 1, 120); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); // DNS-Server normalerweise identisch mit der IP des Routers IPAddress primaryDNS(192, 168, 1, 10); // öffentlicher sekundärer DNS-Server (Schweiz) IPAddress secondaryDNS(9, 9, 9, 9); void setup() { Wire.begin(SCL_PIN, SDA_PIN); // BME280 starten 0x76 oder 0x77 bme.begin(0x76); // WiFi starten // Stations-Modus WiFi.mode(WIFI_STA); WiFi.begin(Router, Passwort); WiFi.config(ip, gateway, subnet, primaryDNS, secondaryDNS); /* Zeitzone CEST: Central European Summertime Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden */ ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120); // CET: Central European Time // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60); // ntp starten Zeitserver deutscher NTP-Pool // Standard: pool.ntp.org ntp.begin("de.pool.ntp.org"); ntp.updateInterval(1000); WiFi.setAutoReconnect(true); WiFi.setSleep(false); // Webserver starten // / -> Aufruf der URL, SeiteBauen -> Aufruf der Funktion Server.begin(); Server.on("/", SeiteBauen); } void loop() { // auf Anfragen warten Server.handleClient(); } void SeiteBauen() { // Daten lesen /* Daten erfassen die Daten liegen als Zahlen im Format float vor für die weitere Verarbeitung werden sie direkt in eine String umgewandelt */ String Temperatur = String(bme.readTemperature(), 1); String Luftfeuchtigkeit = String(bme.readHumidity(), 1); String Luftdruck = String(int(bme.readPressure() / 100.0)); // float verwendet den . als Dezimaltrennzeichen // . mit replace durch , ersetzen Temperatur.replace(".", ","); Luftdruck.replace(".", ","); Luftfeuchtigkeit.replace(".", ","); // Seite "zusammenbauen" String Seite = ""; // refresh -> Seite automatisch aktualisieren Zeit in Sekunden Seite += "<head><meta http-equiv=\"refresh\" content=\"60\"></head>"; Seite += "<h1 style=\"font-size: 24pt; color: green; background: #e9fdd4;padding: 10px;\">"; Seite += "Messwerte BME280</h1>"; Seite += "<p style=\"font-size: 16pt; color: black;\">"; Seite += "Letzte Messung: "; if (ntp.update()) { Seite += ntp.formattedTime("%H:%M:%S Uhr"); Seite += "</p>"; } // Farben als HEX-Code // https://www.uni-muenster.de/IT.GuidoWessendorf/rgbtab.html // # vor den Code setzen Seite += "<p style=\"font-size: 16pt; color: blue;\">"; Seite += "Temperatur: " + Temperatur + " °C</p>"; Seite += "<p style=\"font-size: 16pt; color: green;\">"; Seite += "Luftfeuchtigkeit: " + Luftfeuchtigkeit + "%</p>"; Seite += "<p style=\"font-size: 16pt; color: firebrick;\">"; Seite += "Luftdruck: " + Luftdruck + " hPa</p>"; // Button aktualisieren Seite += "<hr><input style=\"font-size:16pt; font-weight:bold;"; Seite += "background-color:#55A96B;"; Seite += "display:block; cursor:pointer;\"type=\"button\""; // IP für den Button aktualisieren (location.href) // muss mit dem Wert für IPAdress übereinstimmen (. statt ,) Seite += " onClick=\"location.reload()\" value=\"aktualisieren\">"; Seite += "<hr>"; // IP-Adressen anzeigen if (InfoAnzeigen) { Seite += "<p style=\"font-size: 16pt; color: black;\">"; Seite += "Verbunden mit: " + WiFi.SSID() + "<br>"; Seite += "Signalstärke: " + String(WiFi.RSSI()) + "<br>"; Seite += "IP-Adresse ESP: " + String(WiFi.localIP().toString()) + "</p>"; } // Seite anzeigen Server.send(200, "text/html", Seite); } |
Letzte Aktualisierung: