Benutzer-Werkzeuge

Webseiten-Werkzeuge


esp8266_einstieg

NodeMCU ESP8266



Pinbelegung

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;



Programmierung

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





Tastendruck

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



Kontakt zur Außenwelt

Daten auf einen Webserver übertragen

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");
}



Feinstaubsensor

Infos folgen noch…



Abstand messen

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



Temperatur messen

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

UV-Senosr ML8511

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;
}



Quellen

esp8266_einstieg.txt · Zuletzt geändert: 30.11.2020 (Externe Bearbeitung)