Dies ist eine alte Version des Dokuments!
Der NodeMCU
Das ESP8266 WiFi-Modul kann in 2 verschiedenen Modi betrieben werden:
der STA - Modus
der Mikrocontroller kann mit einem bereits bestehenden Wi-Fi-Netzwerk (Access Point) verbunden werden. Man benötigt die
ESP8266WiFi.h
Bibliothek. Die Netzwerkverbindung mit mit Wifi.begin(ssid, password)
gestartet. Außerdem wird die IP - Adresse standardmäßig über DHCP vergeben.
Oftmals ist es notwendig, wenn der Mikrocontroller z.B. durch eine Firewall muss, dass eine feste IP- Adresse und sogar eine fest vorgegebene MAC- Adresse definiert wird.
Mit der Funktion config()
wird die Verbindung mit einer festen IP-Adresse versehen.
config(local_ip, gateway, subnet, dns)
- local_ip : IP-Adresse, die wir der zuweisen möchten
- Gateway : IP-Adresse des Gateways / Router
- Subnet : Subnetzmaske
- dns : IP-Adresse des DNS-Servers (Domain Name Server).
Mit
uint8_t newMACAddress[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xf2};
wifi_set_macaddr(STATION_IF, &newMACAddress[0]);
kann man die MAC - Adresse neu definieren.
der AP - Modus
er arbeitet selbst als Access Point und andere Stationen können miteinander kommunizieren. Es ist dann allerdings kein Zugriff auf das Internet möglich.
Einfacher Aufbau einer Internet-Verbindung und Abfrage
- Welche IP-Adresse hat der Mikrocontroller?
- Dem Mikrocontroller wird eine MAC -Adresse zugewiesen: Informiere dich im Internet, welche Bedeutung eine MAC - Adresse hat und wie sie aufgebaut ist.
- Wie lautet das WLAN und das Passwort?
- Was passiert in Zeile 24- 27?
- Vergleiche die Zeile 35 mit 42;
- Informiere dich im Internet über den httpCode. Welche Bedeutung hat der httpCode 400?
- In Zeile 46 - 59 sind mehrere if - else - Verschachtelungen. Kennzeichne farblich zusammengehörende Klammern.
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> HTTPClient sender; WiFiClientSecure wifiClient; // WLAN-Daten const char* ssid = "TP-LINK_AP_AF32"; const char* password = "geheim"; uint8_t newMACAddress[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xf2}; void setup() { Serial.begin(9600); // Beginn Netzwerk und WLAN - Konfiguration WiFi.mode(WIFI_STA); wifi_set_macaddr(STATION_IF, &newMACAddress[0]); IPAddress ip(10, 144, 5, 2); IPAddress dns(10, 144, 1, 1); IPAddress gateway(10, 144, 1, 2); IPAddress subnet(255, 255, 0, 0); WiFi.config(ip, dns, gateway, subnet); // ende der Netzwerkkonfiguration WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(200); Serial.print("."); } Serial.println("Mit dem WLAN verbunden!"); Serial.println(); wifiClient.setInsecure(); // sichere Verbindung wird nicht überprüft } void aufruf(){ // String getData = "?vorname=klaus&wert1=23,5&wert2=78"; String vorname = "Klaus"; String temperatur = "23.5"; String luftfeuchtigkeit = "78"; //GET Data + Link String getData = "?vorname=" + vorname + "&wert1=" + temperatur + "&wert2=" + luftfeuchtigkeit ; String Link = "https://www.info-checker.de/raumklima/uhrzeit.php"; Link = Link + getData; if (sender.begin(wifiClient, Link)) { int httpCode = sender.GET(); if (httpCode > 0) { if (httpCode == 200) { String antwort = sender.getString(); Serial.println(antwort); }else{ Serial.print("HTTP-Error: " + String(httpCode)); } } sender.end(); }else { Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!"); } } void loop() { aufruf(); delay(2000); }
Messwerterfassung und Verbindungsaufbau mit einem WEB-Server
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <Wire.h> #include "SSD1306Ascii.h" #include "SSD1306AsciiWire.h" #include "DHT.h" #define DHTPIN 12 //Der Sensor wird an PIN 12 angeschlossen #define DHTTYPE DHT22 // Es handelt sich um den DHT22 Sensor DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit „dth“ angesprochen float temperatur; float luftfeuchtigkeit; String Str_luftfeuchtigkeit=""; String Str_temperatur =""; SSD1306AsciiWire oled; HTTPClient sender; WiFiClientSecure wifiClient; // WLAN-Daten const char* ssid = "Name"; const char* password = "geheim"; int anzahl=0; String getData =""; String Link=""; String AnalogData=""; String station ="Station"; void setup() { Serial.begin(9600); Wire.begin(); Wire.setClock(400000L); oled.begin(&Adafruit128x32, 0x3C); oled.setFont(System5x7); oled.clear(); dht.begin(); //DHT22 Sensor starten // folgendes ist nur wichtig, wenn man dem Mikrocontroller eine feste IP und MAC zuweisen möchte // neue MAC - Adresse https://randomnerdtutorials.com/get-change-esp32-esp8266-mac-address-arduino/ uint8_t newMACAddress[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; WiFi.mode(WIFI_STA); // For Soft Access Point (AP) Mode //wifi_set_macaddr(SOFTAP_IF, &newMACAddress[0]); // For Station Mode wifi_set_macaddr(STATION_IF, &newMACAddress[0]); Serial.print("[NEW] ESP8266 Board MAC Address: "); Serial.println(WiFi.macAddress()); IPAddress ip(192, 168, 178, 53); IPAddress dns(192, 168, 178, 1); IPAddress gateway(192, 168, 178, 1); IPAddress subnet(255, 255, 255, 0); WiFi.config(ip, dns, gateway, subnet); // ende der Netzwerkkonfiguration WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("-"); } Serial.println("WLAN- Verbindung aufgebaut."); Serial.println(WiFi.localIP()); wifiClient.setInsecure(); // Zertifkat wird nicht abgefragt //OLED anschließen https://www.14core.com/wiring-nodemcu-esp8266-12e-with-i2c-16x2-lcd-screen/ } void anfrage(){ // DHT abfragen luftfeuchtigkeit = dht.readHumidity(); temperatur = dht.readTemperature(); Str_luftfeuchtigkeit= String(luftfeuchtigkeit); Str_temperatur = String(temperatur); // Analogen Eingang abfragen: int analog_wert=analogRead(A0); AnalogData = String(analog_wert); //Wert in String umwandeln //GET Data getData = "?Wert1=" + AnalogData + "&Wert2=" + Str_luftfeuchtigkeit+ "&Wert3=" + Str_temperatur ; Link = "https://www.info-checker.de/raumklima/MesswertAbspeichern.php" + getData; if (sender.begin(wifiClient, Link)) { int httpCode = sender.GET(); if (httpCode > 0) { // Anfrage wurde gesendet und Server hat geantwortet // Info: Der HTTP-Code für 'OK' ist 200 if (httpCode == 200) { // Hier wurden die Daten vom Server empfangen // String vom Webseiteninhalt speichern String payload = sender.getString(); // Hier kann mit dem Wert weitergearbeitet werden // ist aber nicht unbedingt notwendig Serial.println(payload); }else{ // Falls HTTP-Error Serial.print("HTTP-Error: " + String(httpCode)); } } // Wenn alles abgeschlossen ist, wird die Verbindung wieder beendet sender.end(); }else { Serial.printf("HTTP-Verbindung konnte nicht hergestellt werden!"); } } // ende void anfrage() void loop() { anfrage(); oled.clear(); oled.print("Luft: "); oled.println(AnalogData); oled.print("Feuchte: "); oled.println(Str_luftfeuchtigkeit); oled.print("Temperatur: "); oled.println(Str_temperatur); delay(120000); // alle 2 Minuten } // ende loop()