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



Quellen

esp8266_einstieg.txt · Zuletzt geändert: 17.05.2018 von Frank Hochrath