Die einzelnen Pins werden über ihre GPIO-Nummer angesprochen.
Hier die Zuordnung:
// Pinzuordnung am esp8266 // D0 = 16; // D1 = 5; // D2 = 4; // D3 = 0; // D4 = 2; // D5 = 14; // D6 = 12; // D7 = 13; // D8 = 15; // D9 = 3; // D10 = 1;
Der NodeMCU ESP8266 wird wie ein Arduino mit der gleichen Software programmiert.
Wichtig ist die Installation der benötigten Treiber, die die Software aber mitbringt.
weitere Infos
Der NodeMCU ESP8266 kann auf ein Ereignis wie einen Tastendruck reagieren.
Als einfaches Beispiel wird der Taster zwischen Digitaleingang D1 und +3,3V Ausgang des NodeMCU angeschlossen. Zwischen Taster und 3V-Versorgung wird ein 10K-Widerstand angeschlossen, der dann auf Ground angeschlossen wird.
Schaltungsbeispiel:
Programmcode:
// // Pinzuordnung am esp8266 // static const uint8_t D0 = 16; // static const uint8_t D1 = 5; // static const uint8_t D2 = 4; // static const uint8_t D3 = 0; // static const uint8_t D4 = 2; // static const uint8_t D5 = 14; // static const uint8_t D6 = 12; // static const uint8_t D7 = 13; // static const uint8_t D8 = 15; // static const uint8_t D9 = 3; // static const uint8_t D10 = 1; // Filename: esp8266_digi1_abfragen int ledPin = 16; //interne led int tasterPin = 5; // digitaleingang d1 int zaehler = 0; void setup(){ pinMode(ledPin,OUTPUT); pinMode(tasterPin,INPUT); Serial.begin(9600); } void loop(){ // IF Schleifen Beginn if (digitalRead(tasterPin)==LOW){ digitalWrite(ledPin, HIGH); Serial.println("Eingang LOW"); } else { digitalWrite(ledPin, LOW); Serial.println("Eingang HIGH"); zaehler++; } Serial.print("Anzahl: "); Serial.println(zaehler); //delay(10000); // wartezeit // reset des zaehlers und ausgabe fue den benutzer //zaehler = 0; //Serial.print("Reset: "); //Serial.println(zaehler); // IF Schleifen Ende delay(1000); // wartezeit } // void loop ende
Der SerialMonitor zeigt:
Eingang LOW Anzahl: 0 Eingang LOW Anzahl: 0 Eingang LOW Anzahl: 0 Eingang LOW Anzahl: 0 Eingang LOW Anzahl: 0 Eingang HIGH Anzahl: 1 Eingang HIGH Anzahl: 2 Eingang HIGH Anzahl: 3 Eingang HIGH Anzahl: 4 Eingang HIGH Anzahl: 5 Eingang HIGH Anzahl: 6 Eingang HIGH Anzahl: 7 Eingang HIGH Anzahl: 8 Eingang HIGH Anzahl: 9 Eingang LOW Anzahl: 9 Eingang LOW Anzahl: 9 Eingang LOW Anzahl: 9 Eingang LOW Anzahl: 9 Eingang LOW Anzahl: 9 Eingang LOW Anzahl: 9 Eingang LOW Anzahl: 9 Eingang LOW Anzahl: 9 Eingang LOW
esp8266_daten_per_wlan_an_raspi2_senden.ino
//////////////////////////////// // ESP8266 - Firmware 0.1 // Post Values to Webserver //////////////////////////////// // Code by: // https://blog.silvertech.at //////////////////////////////// #include <ESP8266WiFi.h> const char* ssid = "hallonetz"; const char* password = "xyz"; const char* host = "192.168.178.28"; //Web Server // SensorID const char* SensorID = "ESPabcde"; //Get One Wire Data const char* TmpWert = "123"; void setup() { //Serial Start Serial.begin(9600); delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { delay(15000); Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request // esp8266.php?wert1=xa&wert2=yb String url = "/esp8266.php?"; url += "wert1="; url += SensorID; url += "&wert2="; url += TmpWert; Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); Serial.println("Werte an WebServer uebergeben"); delay(10); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); //Serial.print(line); } Serial.println(); Serial.println("closing connection"); }
Infos folgen noch…
Am NodeMCU ESP8266 wird ein Ultraschallsensor HC-SR04 angeschlossen.
Trigger geht an D1 (GPIO5)
Echo geht an D2 (GPIO4)
VCC geht an VIN
GND geht an GND
Der Programmcode esp8266_ultraschall_4.ino:
// // http://www.instructables.com/id/Distance-Measurement-Using-HC-SR04-Via-NodeMCU/ // http://thaiopensource.org/%E0%B8%A1%E0%B8%B2%E0%B9%80%E0%B8%A5%E0%B9%88%E0%B8%99-ultrasonic-sensor-%E0%B8%81%E0%B8%B1%E0%B8%9A-nodemcu-dev-kit-%E0%B8%81%E0%B8%B1%E0%B8%99/ // esp8266_ultraschall_4.ino // defines pins numbers #define TRIGGER_PIN 5 #define ECHO_PIN 4 void setup() { Serial.begin (9600); pinMode(TRIGGER_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(BUILTIN_LED, OUTPUT); } void loop() { //long duration, distance; float duration, distance; digitalWrite(TRIGGER_PIN, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); // Added this line digitalWrite(TRIGGER_PIN, LOW); duration = pulseIn(ECHO_PIN, HIGH); distance = (duration/2) / 29.1; Serial.print(distance); Serial.println(" cm"); delay(1000); }
Für eine Mittelwertbildung einer bestimmten Anzahl Messwerte kommt folgender Code zum Einsatz:
// // http://www.instructables.com/id/Distance-Measurement-Using-HC-SR04-Via-NodeMCU/ // http://thaiopensource.org/%E0%B8%A1%E0%B8%B2%E0%B9%80%E0%B8%A5%E0%B9%88%E0%B8%99-ultrasonic-sensor-%E0%B8%81%E0%B8%B1%E0%B8%9A-nodemcu-dev-kit-%E0%B8%81%E0%B8%B1%E0%B8%99/ // esp8266_ultraschall_5.ino // defines pins numbers #define TRIGGER_PIN 5 #define ECHO_PIN 4 float duration, distance; float summeallermesswerte = 0; int zaehler = 0; float mittelwert = 0; int durchlaeufe = 9; // hier die gewünschte Anzahl eintragen void setup() { Serial.begin (9600); pinMode(TRIGGER_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(BUILTIN_LED, OUTPUT); } void loop() { for (int i=0; i<durchlaeufe; i++){ // for-schleifen-beginn // Ausgabe des aktuellen Durchlauf //Serial.print("I: "); //Serial.println(i); //long duration, distance; //float duration, distance; digitalWrite(TRIGGER_PIN, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); // Added this line digitalWrite(TRIGGER_PIN, LOW); duration = pulseIn(ECHO_PIN, HIGH); distance = (duration/2) / 29.1; Serial.print(distance); Serial.println(" cm"); summeallermesswerte = summeallermesswerte + distance; //Serial.print("Summe: "); //Serial.print(summeallermesswerte); //Serial.println(" cm"); zaehler = zaehler + 1; //Serial.print("Zähler: "); //Serial.println(zaehler); mittelwert = summeallermesswerte / zaehler; //Serial.print("Mittelwert: "); //Serial.print(mittelwert); //Serial.println("cm"); delay(1000); } // for-schleifen-ende // endausgabe // Ausgabe des Mittelwertes Serial.print("letzter Mittelwert: "); Serial.print(mittelwert); Serial.println(" cm"); // Reset aller Ausgangswerte summeallermesswerte = 0; zaehler = 0; mittelwert = 0; } // void-loop-ende
Möchte man die Messwerte per WLAN auf einen Server übertragen, kommt folgendes Script zum Einsatz:
esp8266_ultraschall_6.ino
// // http://www.instructables.com/id/Distance-Measurement-Using-HC-SR04-Via-NodeMCU/ // http://thaiopensource.org/%E0%B8%A1%E0%B8%B2%E0%B9%80%E0%B8%A5%E0%B9%88%E0%B8%99-ultrasonic-sensor-%E0%B8%81%E0%B8%B1%E0%B8%9A-nodemcu-dev-kit-%E0%B8%81%E0%B8%B1%E0%B8%99/ // https://blog.silvertech.at // // esp8266_ultraschall_6.ino #include <ESP8266WiFi.h> // wlan einbinden const char* ssid = "hallonetz"; // wlan ssid eintragen const char* password = "xyz"; // wlan zugangspasswort eintragen const char* host = "192.168.178.28"; //Web Server auf die Daten gespeichert werden // defines pins numbers #define TRIGGER_PIN 5 #define ECHO_PIN 4 const char* SensorID = "ESP8266_abstand"; float duration, distance; float summeallermesswerte = 0; int zaehler = 0; float mittelwert = 0; int durchlaeufe = 30; // hier die gewünschte Anzahl eintragen void setup() { Serial.begin (9600); pinMode(TRIGGER_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(BUILTIN_LED, OUTPUT); // Kontakt zum wlan aufnehmen Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } // void setup - ende void loop() { for (int i=0; i<durchlaeufe; i++){ // for-schleifen-beginn // Ausgabe des aktuellen Durchlauf //Serial.print("I: "); //Serial.println(i); //long duration, distance; //float duration, distance; digitalWrite(TRIGGER_PIN, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); // Added this line digitalWrite(TRIGGER_PIN, LOW); duration = pulseIn(ECHO_PIN, HIGH); distance = (duration/2) / 29.1; Serial.print(distance); Serial.println(" cm"); summeallermesswerte = summeallermesswerte + distance; //Serial.print("Summe: "); //Serial.print(summeallermesswerte); //Serial.println(" cm"); zaehler = zaehler + 1; //Serial.print("Zähler: "); //Serial.println(zaehler); mittelwert = summeallermesswerte / zaehler; //Serial.print("Mittelwert: "); //Serial.print(mittelwert); //Serial.println("cm"); delay(1000); } // for-schleifen-ende // endausgabe // Ausgabe des Mittelwertes Serial.print("letzter Mittelwert: "); Serial.print(mittelwert); Serial.println(" cm"); // wlan datenübergabe - beginn Serial.print("Verbindungsaufbau ... "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // uri erstellent // esp8266.php?wert1=xa&wert2=yb String url = "/abstand.php?"; url += "wert1="; url += SensorID; url += "&wert2="; url += mittelwert; Serial.print("Requesting URL: "); Serial.println(url); // senden client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); Serial.println("Werte an WebServer uebergeben"); delay(10); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); //Serial.print(line); } Serial.println(); Serial.println("Verbindung wird beendet ..."); // wlan datenübergabe - ende // Reset aller Ausgangswerte summeallermesswerte = 0; zaehler = 0; mittelwert = 0; } // void-loop-ende
Mit einem DS18B20-Temperatursensor kann ganz einfach die Temperatur gemessen werden.
Dazu wird am Sensor der Eingang Vin (3,3Volt) und der Datenpin (Mitte) mit einem 1K-Widerstand verbunden.
Vin des Sensors wird an 3,3Volt-Pin des NodeMCU Boards angeschlossen.
Data des Sensors wird an D4 (Digitaleingang) des NodeMCU-Boards angeschlossen.
Ground des Sensors wird mit Ground des NodeMCU-Board verbunden.
Folgender Code liest die Temperatur aus und zeigt am SerialMonitor an:
// Quelle: // ESP8266 DS18B20 ArduinoIDE Thingspeak IoT Example code // http://vaasa.hacklab.fi // https://vaasa.hacklab.fi/2016/02/06/esp8266-on-nodemcu-board-ds18b20-arduinoide-thingspeak/ // https://github.com/milesburton/Arduino-Temperature-Control-Library // https://gist.github.com/jeje/57091acf138a92c4176a // esp8288_ds18b20_1.ino #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS D4 // Digitaleingang D4 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); char temperatureString[6]; void setup(void){ Serial.begin(9600); Serial.println(""); DS18B20.begin(); } float getTemperature() { float temp; do { DS18B20.requestTemperatures(); temp = DS18B20.getTempCByIndex(0); delay(100); } while (temp == 85.0 || temp == (-127.0)); return temp; } void loop() { float temperature = getTemperature(); dtostrf(temperature, 2, 2, temperatureString); Serial.println(temperatureString); delay(1000); }
Möchte man nun Abstand und Temperatur erfassen, wird dieses Script benötigt:
// // http://www.instructables.com/id/Distance-Measurement-Using-HC-SR04-Via-NodeMCU/ // http://thaiopensource.org/%E0%B8%A1%E0%B8%B2%E0%B9%80%E0%B8%A5%E0%B9%88%E0%B8%99-ultrasonic-sensor-%E0%B8%81%E0%B8%B1%E0%B8%9A-nodemcu-dev-kit-%E0%B8%81%E0%B8%B1%E0%B8%99/ // https://blog.silvertech.at // // esp8266_abstand_temperatur.ino #include <ESP8266WiFi.h> // wlan einbinden #include <OneWire.h> #include <DallasTemperature.h> #include <ESP8266WiFi.h> // wlan einbinden const char* ssid = "xyz"; // wlan ssid eintragen const char* password = "123"; // wlan zugangspasswort eintragen const char* host = "192.168.178.28"; //Web Server auf die Daten gespeichert werden // defines pins numbers #define TRIGGER_PIN 5 #define ECHO_PIN 4 #define ONE_WIRE_BUS D4 // Digitaleingang D4 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); char temperatureString[6]; const char* SensorID = "ESP8266_abstand"; float duration, distance; float summeallermesswerte = 0; int zaehler = 0; float mittelwert = 0; int durchlaeufe = 30; // hier die gewünschte Anzahl eintragen void setup() { Serial.begin (9600); pinMode(TRIGGER_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(BUILTIN_LED, OUTPUT); DS18B20.begin(); // Kontakt zum wlan aufnehmen Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } // void setup - ende float getTemperature() { float temp; do { DS18B20.requestTemperatures(); temp = DS18B20.getTempCByIndex(0); delay(100); } while (temp == 85.0 || temp == (-127.0)); return temp; } void loop() { for (int i=0; i<durchlaeufe; i++){ // for-schleifen-beginn // Ausgabe des aktuellen Durchlauf //Serial.print("I: "); //Serial.println(i); //long duration, distance; //float duration, distance; digitalWrite(TRIGGER_PIN, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); // Added this line digitalWrite(TRIGGER_PIN, LOW); duration = pulseIn(ECHO_PIN, HIGH); distance = (duration/2) / 29.1; Serial.print(distance); Serial.println(" cm"); summeallermesswerte = summeallermesswerte + distance; //Serial.print("Summe: "); //Serial.print(summeallermesswerte); //Serial.println(" cm"); zaehler = zaehler + 1; //Serial.print("Zähler: "); //Serial.println(zaehler); mittelwert = summeallermesswerte / zaehler; //Serial.print("Mittelwert: "); //Serial.print(mittelwert); //Serial.println("cm"); delay(1000); } // for-schleifen-ende // Temperaturmessung float temperature = getTemperature(); dtostrf(temperature, 2, 2, temperatureString); Serial.println(temperatureString); // endausgabe // Ausgabe des Mittelwertes Serial.print("letzter Mittelwert: "); Serial.print(mittelwert); Serial.println(" cm"); // wlan datenübergabe - beginn Serial.print("Verbindungsaufbau ... "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // uri erstellen // esp8266.php?wert1=xa&wert2=yb String url = "/abstandswerteintragen.php?"; url += "wert1="; url += mittelwert; url += "&wert2="; url += temperatureString; Serial.print("Requesting URL: "); Serial.println(url); // senden client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); Serial.println("Werte an WebServer uebergeben"); delay(10); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); //Serial.print(line); } Serial.println(); Serial.println("Verbindung wird beendet ..."); // wlan datenübergabe - ende // Reset aller Ausgangswerte summeallermesswerte = 0; zaehler = 0; mittelwert = 0; } // void-loop-ende
NodeESP8266 PIN - Modul Pin
3,3 Volt - 3,3 Volt
GND - GND
A0 - OUT
Code mit wlan:
// // UV-Sensor ML8511 // // mit wlan-anbindung // // esp8266: // http://www.esp8266learning.com/wemos-ml8511-example.php // Arduino: // https://www.14core.com/wiring-the-ml8511-ultra-violet-light-sensor-on-microcontroller/ // http://www.electronics-lab.com/project/arduino-uv-meter-using-uv30a-ultraviolet-sensor/ // // UV-Index-Infos: // http://www.bfs.de/DE/themen/opt/uv/uv-index/einfuehrung/einfuehrung.html;jsessionid=A48D2406906E70E8BE26B42256A2E375.1_cid382 // // UV Index - Belastung - Maßnahme // 1 - 2 niedrig keine Schutzmaßnahmen erforderlich. // // 3 - 5 mittel Schutz erforderlich: // während der Mittagsstunden Schatten aufsuchen // entsprechende Kleidung, Hut und Sonnenbrille tragen // für unbedeckte Haut Sonnenschutzmittel mit ausreichendem Lichtschutzfaktor verwenden. // // 6 - 7 hoch Schutz erforderlich: // während der Mittagsstunden Schatten aufsuchen // entsprechende Kleidung, Hut und Sonnenbrille tragen // für unbedeckte Haut Sonnenschutzmittel mit ausreichendem Lichtschutzfaktor verwenden. // // 8 - 10 sehr hoch Schutz absolut notwendig: // In der Mittagszeit möglichst nicht draußen aufhalten! // Unbedingt Schatten aufsuchen! // Entsprechende Kleidung, Hut, Sonnenbrille und Sonnencreme mit ausreichendem Lichtschutzfaktor sind dringend nötig. // // 11 und höher extrem // // #include <ESP8266WiFi.h> // wlan einbinden const char* ssid = "ssd deines wlans"; // wlan ssid eintragen const char* password = "StrengGeheimPw"; // wlan zugangspasswort eintragen const char* host = "192.168.178.28"; //Web Server auf die Daten gespeichert werden const char* melder = "ESP8266_uvindex"; const char* SensorID = "ESP8266_uvindex"; float duration, distance; float summeallermesswerte = 0; int zaehler = 0; float mittelwert = 0; int durchlaeufe = 30; // hier die gewünschte Anzahl eintragen int UVsensorIn = A0; //Output from the sensor void setup() { pinMode(UVsensorIn, INPUT); Serial.begin(9600); //open serial port, set the baud rate to 9600 bps // Kontakt zum wlan aufnehmen Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { String UVIndex = "0"; int voltage = averageAnalogRead(UVsensorIn); //int uvLevel = averageAnalogRead(UVsensorIn); //float outputVoltage = 3.3 * uvLevel/1024; float outputVoltage = 3.3 * voltage/1024; float uvIntensity = mapfloat(outputVoltage, 0.99, 2.9, 0.0, 15.0); Serial.print(" Analoger Wert: "); Serial.print(voltage); Serial.print(" mV"); Serial.println(); //Zeilenumbruch //Serial.print(" Analogsignal: "); //Serial.print(uvLevel); //Serial.println(); //Zeilenumbruch Serial.print(" UV Intensity: "); Serial.print(uvIntensity); Serial.print(" mW/cm^2"); Serial.println(); //Zeilenumbruch if(voltage<50) { Serial.print(" UVIndex: 0"); //UVIndex = "0"; }else if (voltage>50 && voltage<=227) { Serial.print(" UVIndex: 0");//UVIndex = "0"; }else if (voltage>227 && voltage<=318) { Serial.print(" UVIndex: 1");//UVIndex = "1"; } else if (voltage>318 && voltage<=408) { Serial.print(" UVIndex: 2");//UVIndex = "2"; }else if (voltage>408 && voltage<=503) { Serial.print(" UVIndex: 3");//UVIndex = "3"; } else if (voltage>503 && voltage<=606) { Serial.print(" UVIndex: 4");//UVIndex = "4"; }else if (voltage>606 && voltage<=696) { Serial.print(" UVIndex: 5");//UVIndex = "5"; }else if (voltage>696 && voltage<=795) { Serial.print(" UVIndex: 6");//UVIndex = "6"; }else if (voltage>795 && voltage<=881) { Serial.print(" UVIndex: 7");//UVIndex = "7"; } else if (voltage>881 && voltage<=976) { Serial.print(" UVIndex: 8");//UVIndex = "8"; } else if (voltage>976 && voltage<=1079) { Serial.print("UVIndex: 9");//UVIndex = "9"; } else if (voltage>1079 && voltage<=1170) { Serial.print(" UVIndex: 10");//UVIndex = "10"; }else if (voltage>1170) { Serial.print("UVIndex: 11");//UVIndex = "11"; } Serial.println(); //Zeilenumbruch Serial.println(); //Zeilenumbruch delay(10000); // wlan datenübergabe - beginn Serial.print("Verbindungsaufbau ... "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // uri erstellen // esp8266.php?wert1=xa&wert2=yb String url = "/uvindexwerteintragen.php?"; //url += "melder="; //url += melder; url += "wert1="; url += voltage; url += "&wert2="; url += uvIntensity; Serial.print("Requesting URL: "); Serial.println(url); // senden client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); Serial.println("Werte an WebServer uebergeben"); delay(10); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); //Serial.print(line); } Serial.println(); Serial.println("Verbindung wird beendet ..."); // wlan datenübergabe - ende } // void-loop ende //Takes an average of readings on a given pin //Returns the average int averageAnalogRead(int pinToRead) { byte numberOfReadings = 8; unsigned int runningValue = 0; for(int x = 0 ; x < numberOfReadings ; x++) runningValue += analogRead(pinToRead); runningValue /= numberOfReadings; return(runningValue); } float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
Code mit mqtt:
// // UV-Sensor ML8511 // // mit wlan-anbindung // // esp8266: // http://www.esp8266learning.com/wemos-ml8511-example.php // Arduino: // https://www.14core.com/wiring-the-ml8511-ultra-violet-light-sensor-on-microcontroller/ // http://www.electronics-lab.com/project/arduino-uv-meter-using-uv30a-ultraviolet-sensor/ // // UV-Index-Infos: // http://www.bfs.de/DE/themen/opt/uv/uv-index/einfuehrung/einfuehrung.html;jsessionid=A48D2406906E70E8BE26B42256A2E375.1_cid382 // // UV Index - Belastung - Maßnahme // 1 - 2 niedrig keine Schutzmaßnahmen erforderlich. // // 3 - 5 mittel Schutz erforderlich: // während der Mittagsstunden Schatten aufsuchen // entsprechende Kleidung, Hut und Sonnenbrille tragen // für unbedeckte Haut Sonnenschutzmittel mit ausreichendem Lichtschutzfaktor verwenden. // // 6 - 7 hoch Schutz erforderlich: // während der Mittagsstunden Schatten aufsuchen // entsprechende Kleidung, Hut und Sonnenbrille tragen // für unbedeckte Haut Sonnenschutzmittel mit ausreichendem Lichtschutzfaktor verwenden. // // 8 - 10 sehr hoch Schutz absolut notwendig: // In der Mittagszeit möglichst nicht draußen aufhalten! // Unbedingt Schatten aufsuchen! // Entsprechende Kleidung, Hut, Sonnenbrille und Sonnencreme mit ausreichendem Lichtschutzfaktor sind dringend nötig. // // 11 und höher extrem // // #include <ESP8266WiFi.h> // wlan einbinden #include <PubSubClient.h> // mqtt const char* ssid = "ssd deines wlans"; // wlan ssid eintragen const char* password = "strengGeheimPW"; // wlan zugangspasswort eintragen const char* host = "192.168.178.28"; //Web Server auf die Daten gespeichert werden const char* melder = "ESP8266_uvindex"; const char* SensorID = "ESP8266_uvindex"; float duration, distance; float summeallermesswerte = 0; int zaehler = 0; float mittelwert = 0; int durchlaeufe = 30; // hier die gewünschte Anzahl eintragen //mqtt const char* mqttServer = "192.168.178.30"; const int mqttPort = 1883; const char* mqttUser = "bnnane"; const char* mqttPassword = "passwortgeheim"; WiFiClient espClient; PubSubClient client(espClient); int UVsensorIn = A0; //Output from the sensor void setup() { pinMode(UVsensorIn, INPUT); Serial.begin(9600); //open serial port, set the baud rate to 9600 bps // Kontakt zum wlan aufnehmen Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); //mqtt //client.setServer(mqttServer, mqttPort); //client.setCallback(callback); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /* Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); */ client.setServer(mqttServer, mqttPort); //client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); //if (client.connect("ESP8266Client", mqttUser, mqttPassword )) { if (client.connect("ESP8266Client" )) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } client.publish("datenempfang", " - MQTT-Verbindung hergestellt - "); //Topic name client.subscribe("datenempfang"); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived in topic: "); Serial.println(topic); Serial.print("Message:"); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); Serial.println("-----------------------"); } void loop() { String UVIndex = "0"; int voltage = averageAnalogRead(UVsensorIn); //int uvLevel = averageAnalogRead(UVsensorIn); //float outputVoltage = 3.3 * uvLevel/1024; float outputVoltage = 3.3 * voltage/1024; float uvIntensity = mapfloat(outputVoltage, 0.99, 2.9, 0.0, 15.0); Serial.print(" Analoger Wert: "); Serial.print(voltage); Serial.print(" mV"); Serial.println(); //Zeilenumbruch //Serial.print(" Analogsignal: "); //Serial.print(uvLevel); //Serial.println(); //Zeilenumbruch Serial.print(" UV Intensity: "); Serial.print(uvIntensity); Serial.print(" mW/cm^2"); Serial.println(); //Zeilenumbruch if(voltage<50) { Serial.print(" UVIndex: 0"); //mqtt client.publish("datenempfang", "0"); //Topic name client.subscribe("datenempfang"); //UVIndex = "0"; } else if (voltage>50 && voltage<=227) { Serial.print(" UVIndex: 0");//UVIndex = "0"; //mqtt client.publish("datenempfang", "0"); //Topic name client.subscribe("datenempfang"); } else if (voltage>227 && voltage<=318) { Serial.print(" UVIndex: 1");//UVIndex = "1"; //mqtt client.publish("datenempfang", "1"); //Topic name client.subscribe("datenempfang"); } else if (voltage>318 && voltage<=408) { Serial.print(" UVIndex: 2");//UVIndex = "2"; //mqtt client.publish("datenempfang", "2"); //Topic name client.subscribe("datenempfang"); } else if (voltage>408 && voltage<=503) { Serial.print(" UVIndex: 3");//UVIndex = "3"; //mqtt client.publish("datenempfang", "3"); //Topic name client.subscribe("datenempfang"); } else if (voltage>503 && voltage<=606) { Serial.print(" UVIndex: 4");//UVIndex = "4"; //mqtt client.publish("datenempfang", "4"); //Topic name client.subscribe("datenempfang"); }else if (voltage>606 && voltage<=696) { Serial.print(" UVIndex: 5");//UVIndex = "5"; //mqtt client.publish("datenempfang", "5"); //Topic name client.subscribe("datenempfang"); }else if (voltage>696 && voltage<=795) { Serial.print(" UVIndex: 6");//UVIndex = "6"; //mqtt client.publish("datenempfang", "6"); //Topic name client.subscribe("datenempfang"); }else if (voltage>795 && voltage<=881) { Serial.print(" UVIndex: 7");//UVIndex = "7"; //mqtt client.publish("datenempfang", "7"); //Topic name client.subscribe("datenempfang"); } else if (voltage>881 && voltage<=976) { Serial.print(" UVIndex: 8");//UVIndex = "8"; //mqtt client.publish("datenempfang", "8"); //Topic name client.subscribe("datenempfang"); } else if (voltage>976 && voltage<=1079) { Serial.print("UVIndex: 9");//UVIndex = "9"; //mqtt client.publish("datenempfang", "9"); //Topic name client.subscribe("datenempfang"); } else if (voltage>1079 && voltage<=1170) { Serial.print(" UVIndex: 10");//UVIndex = "10"; //mqtt client.publish("datenempfang", "10"); //Topic name client.subscribe("datenempfang"); }else if (voltage>1170) { Serial.print("UVIndex: 11");//UVIndex = "11"; //mqtt client.publish("datenempfang", "11"); //Topic name client.subscribe("datenempfang"); } Serial.println(); //Zeilenumbruch Serial.println(); //Zeilenumbruch delay(10000); // wlan datenübergabe - beginn Serial.print("Verbindungsaufbau ... "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // uri erstellen // esp8266.php?wert1=xa&wert2=yb String url = "/uvindexwerteintragen.php?"; //url += "melder="; //url += melder; url += "wert1="; url += voltage; url += "&wert2="; url += uvIntensity; Serial.print("Requesting URL: "); Serial.println(url); // senden client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); Serial.println("Werte an WebServer uebergeben"); delay(10); // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); //Serial.print(line); } Serial.println(); Serial.println("Verbindung wird beendet ..."); // wlan datenübergabe - ende } // void-loop ende //Takes an average of readings on a given pin //Returns the average int averageAnalogRead(int pinToRead) { byte numberOfReadings = 8; unsigned int runningValue = 0; for(int x = 0 ; x < numberOfReadings ; x++) runningValue += analogRead(pinToRead); runningValue /= numberOfReadings; return(runningValue); } float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }