ESP8266 NodeMCU

Überblick

Das NodeMCU Development Kit ist ein Breakout-Board des ESP-12 mit einem ESP8266-Chip. Das charakteristische Merkmal aller ESP-Boards ist ihre WLAN-Schnittstelle. Dieses Kit ist eine preiswerte Alternative zu Arduino MKR WiFi.

Der Vorteil gegen andere Breakout-Board Varianten ist:

  • Integrierte USB-Schnittstelle zum Flaschen
  • Spannungsversorgung von 5 V.
  • Die maximale Spannung am Pin VIN sollte Spannungsspitzen von 20V nicht überschreiten.
Datenblatt https://www.espressif.com/sites/default/files/documentation/esp8266-technical_reference_en.pdf
Schaltplan https://github.com/nodemcu/nodemcu-devkit-v1.0/blob/master/NODEMCU_DEVKIT_V1.0.PDF

ESP8266 NodeMCU buils-in LED’s

ESP8266 NodeMCU-12 build-in LED's [Bildquelle]

Setup zum Programmieren von ESP8266 NodeMCU

Unter Windows kann es vorkommen, dass der Treiber der USB zu UART Bridge (CP210x) nicht installiert ist. In der ArduinoIDE ist der Port in diesem Fall nicht auswählbar, obwohl die NodeMCU über USB mit dem Rechner verbunden ist. Unter den Eigenschaften wird Code 28 im Gerätestatus angezeigt.

Der Treiber kann unter folgendem Link heruntergeladen werden. Die Installation erfolgt über den Windows Geräte-Manager. Dafür muss man die heruntergeladene ZIP-Datei vorher entpacken.

https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=download

Eigenschaften → Treiber → Treiber aktualisieren → Auf meinem Computer nach Treibern suchen → entpackten Ordner auswählen.

Arduino IDE Setup

1. Folgende URL's müssen bei File -> Preferences... unter additional board manager ergänzt werden.

https://dl.espressif.com/dl/package_esp32_index.json
http://arduino.esp8266.com/stable/package_esp8266com_index.json

2. Den Board Manager ergänzen um esp8266 by ESP8266 Community.

Arduino IDE Sketches

ESP8266 Over-the-Air Update

Die integrierte WLAN-Schnittstelle muss nicht immer dafür genutzt werden, mit dem ESP8266 Daten zu versenden. Die Schnittstelle kann auch ausschließlich zum Programmupload genutzt werden. Initial muss nur ein mal über die USB-Schnittstelle die Basic-OTA-Konfiguration aufgespielt werden. Jeder folgende Programmcode muss diese Konfiguration beibehalten. Unter der Voraussetzung, dass sich die Zugangsdaten oder der die SSID-Bezeichnung des WLANs nicht ändern, wird keine USB-Schnittstelle zum Programmupload mehr benötigt.

ESP8266 General Purpose Input/Output Interface (GPIO)

ESP8266 NodeMCU hat 16 GPIOs zur Verfügung. Die GPIOs können mit einfachen Programmanweisungen gesteuert werden. Es wird empfohlen, die fest definierten (sekundären) Funktionen der Pins zu berücksichtigen, damit keine unerwünschten Effekte mit angeschlossener Peripherie auftreten. Diese Funktionen sind für das Programmieren über die USB-Schnittstelle bzw. beim Booten notwendig.

  • GPIO2 ist mit der Build-in LED auf dem ESP-12 Modul verbunden.
  • GPIO16 ist mit der Build-in LED auf der ESP-12e NodeMCU verbunden.
ESP8266 NodeMCU-12 Pinbelegung [Bildquelle]
/*Setup Digital Pins*/ 

pinMode (16, INPUT); // GPIO 16 = D0
pinMode (5, OUTPUT); // GPIO 5 = D1

/*Read or Write Digital Pins*/

int input = digitalRead(16);
digitalWrite(5, HIGH);

Außer GPIO16 kann jeder GPIO als Pull-up Pin genutzt werden. Nur GPIO16 kann als Pull-down Pin genutzt werden.

pinMode (16, INPUT_PULLDOWN_16); // GPIO 16 = D0 
pinMode (5, INPUT_PULLUP); // GPIO 5 = D1 

Bei der Nutzung der IO's ist es sinnvoll, die genauen Details zu kennen, damit unerwünschte Effekte vermieden werden. Die programmierbaren IO-Pins können für unterschiedliche Zwecke genutzt werden. Folgende Tabelle zeigt die Besonderheiten.

D3GPIO0- LOW beim Booten aktiviert Firmware-Upload
- zum Normalstart offen oder Pull-up nach HIGH
TXGPIO1 (TXD)- Serieller Ausgang beim Booten
- Nicht auf LOW ziehen!
D4GPIO2 (TXD)- Serieller Ausgang beim Booten
- Nicht auf LOW ziehen!
- ESP-12 build-in LED
RXGPIO3 (RXD)- Serieller Eingang
D0GPIO16- NodeMCU-12 build-in LED
Sekundäre Funktionen der ESP8266 NodeMCU GPIO Pins

Folgender Kommentar zu der ESP8266 NodeMCU GPIO Pinbelegung kann als Notiz in den Quellcode kopiert werden. Die eingeklammerten Pins verweisen auf die sekundären Funktionen.

 /* ESP8266 NodeMCU GPIO Pins
 PIN   GPIO
(D0) = 16 
  D1 = 5  
  D2 = 4  
(D3) = 0  
(D4) = 2  
  D5 = 14 
  D6 = 12 
  D7 = 13 
  D8 = 15 
(RX) = 3
(TX) = 1
 SD3 = 10
 SD2 = 9
-----------------------------*/

ESP8266 Interrupt Service Routine (ISR)

Außer GPIO16 kann jeder ESP8266 GPIO Pin mit einer ISR konfiguriert werden.

Der Quellcode einer Interrupt Service Routine für den ESP8266 ist vergleichbar mit dem Quellcode für einen Arduino-Chip. Man muss allerdings beachten, die Funktion der ISR im RAM auszuführen (siehe unten).

Es wird empfohlen, die fest definierten (sekundären) Funktionen der Pins zu berücksichtigen, damit keine unerwünschten Effekte mit angeschlossener Peripherie auftreten. Diese Funktionen sind für das Programmieren über die USB-Schnittstelle bzw. beim Booten notwendig. Siehe dazu die Tabelle im Kapitel zu den GPIOs.

attachInterrupt(digitalPinToInterrupt(GPIO), ISR, mode);
attachInterrupt() Setup Interrupt in void setup()
digitalPinToInterrupt(GPIO)Setzt GPIO als Interrupt-Pin. Außer GPIO16 kann jeder GPIO als Interrupt-Pin genutzt werden.
ISRIst der Name der Funktion, die aufgeführt wird. Die Funktion muss vor void setup() definiert werden, damit sie attachInterrupt übergeben werden kann.
mode Kann CHANGE, FALLING, RISING, LOW, HIGH sein.

An die Funktion muss das Attribut ICACHE_RAM_ATTR zugewiesen werden. Das speichert den auszuführenden Code im RAM des ESP8266. Da der Flash Speicher verhältnismäßig langsam ist, können sonst ungewollte Effekte austreten.

Beispielcode (ohne Funktion):

void ICACHE_RAM_ATTR ISR() {
 Serial.println("ISR");
}

void setup() {
  pinMode(5, INPUT_PULLUP); //D1
  attachInterrupt(digitalPinToInterrupt(5), ISR, RISING);
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
    delay(1000);
    Serial.println("loop");
}

ESP8266 Pulsweitenmodulation (PWM)

ESP8266 NodeMCU hat 9 PWM Pins zur Verfügung. Die Pins können mit einfachen Programmanweisungen gesteuert werden. Es wird empfohlen, die fest definierten (sekundären) Funktionen der Pins zu berücksichtigen, damit keine unerwünschten Effekte mit angeschlossener Peripherie auftreten. Diese Funktionen sind für beim Booten notwendig.

ESP8266 PWM Pins [Bildquelle]
void setup() {
  pinMode(15, OUTPUT); //D8 PWM
  analogWriteFreq(25000); // set PWM frequency to 25kHz
  analogWrite(15, 128);   // set PWM duty cycle
}
pinMode(15, OUTPUT);Konfig. PWM-Pin als Output.
analogWriteFreq(25000);Konfig. PWM-Frequenz 25 kHz. Default ist 1 kHz.
analogWrite(PIN, PWMRANGE);Konfig. PWM-Range. Default ist 255 (=100 %).
analogWrite(15, DUTY);Konfig. PWM-Duty-Cycle. Default ist 0 bis 255 (0 5 bis 100 %).

Bei der Nutzung der PWM ist es sinnvoll, die genauen Details zu den Pins zu kennen, damit unerwünschte Effekte vermieden werden. Die programmierbaren PWM-Pins können für unterschiedliche Zwecke genutzt werden. Folgende Tabelle zeigt die Besonderheiten.

D3GPIO0- LOW beim Booten aktiviert Firmware-Upload
- zum Normalstart offen oder Pull-up nach HIGH
D4GPIO2 (TXD)- Serieller Ausgang beim Booten
- Nicht auf LOW ziehen!
- ESP-12 build-in LED
Sekundäre Funktionen der ESP8266 NodeMCU PWM Pins

Folgender Kommentar zu der ESP8266 NodeMCU PWM Pinbelegung kann als Notiz in den Quellcode kopiert werden. Die eingeklammerten Pins verweisen auf die sekundären Funktionen.

/* ESP8266 NodeMCU PWM Pins
 PIN   GPIO
  D1 = 5 
  D2 = 4 
(D3) = 0
(D4) = 2 
  D5  14 
  D6  12  
  D7  13  
  D8  15  
-----------------------------*/