Electronic / Foto / Technik / SmartHome
AD
MAI 14 2018

ESP8266 NODE MCU WiFi

Arduino, Elektronik, ESP8266


In diesem Beitrag stelle ich euch die Möglichkeiten des ESP8266 NODE MCU einmal vor.

Der ESP8266 ist ein Low-Power-32-Bit-Mikrocontroller speziell für IOT (Internet of Things) entwickelt worden. Ziel meines Projektes wird sein die Ansteuerung meiner Bewässerungsanlage mit 3 Zonen. Hier kommen Magnetventile 24V zum Einsatz.

Programmiert kann der Chip über die ARDUINO C++ Programmiersprache. Es müssen noch einige Anpassungen vorgenommen werden. Ich stelle euch hier ein kleines Projekt vor mit dem folgendes möglich ist:

  • Über WiFi einen Button schalten
  • per ARDUINO drei Bewässerungszonen mit einem Magnetventil schalten

Zunächst zur Spannungsversorgung der Node MCU

Mir ist aufgefallen, dass der Chip 5 GND und drei 3.3V Anschlüsse besitzt. Ich hatte Anfangs die 3.3V Pins benutzt und mich darüber gewundert warum der Node über USB das WiFi Netz aufspannt und bei 3.3V Eingangsspannung nicht. In folgendem Forum wurde ich fündig warum das so ist.

Nun aber los

Über VIN habe ich +5V angelegt. Die Spannungsversorgung habe ich gut dimensioniert damit ich eine Relaiskarte und einen ARDUINO neben der NODE MCU gleichzeitig betreiben kann. An den Relaiskontakten werden später die Magnetventile geklemmt, um diese zu schalten. Zudem kann später das System in FHEM eingebunden werden …

Das aller wichtigste ist die Spannungsversorgung

ich habe zudem die Erfahrung gemacht dass die Spannungsversorgung aus einem einfachen Netzteil für die Ansprüche des ESP8266 nicht ausreicht. Das führt dazu das die WiFi Verbindung nicht stabil ist. Es gibt verschiedene Ansätze wie man das in den Griff bekommt.

  1. Linear
  2. DC-DC Wandler

Ich habe mich für einen DC-DC Wandler entschieden. Die Eingangsspannung kann bis mx 17V sauber herunter geregelt (eingestellt) werden dass sie für den ESP8266 passt.

…Affiliate Link…

FHEM und Arduino

Der Verdrahtungsplan sie so aus

Über die 9V Eingangsspannung wird über ein DC-DC Step Down die Spannung auf 5V für den ESP und der Relaiskarte gebracht. Der Arduino bekommt ebenfalls über den Spannungsteiler seinen Betriebstrom. Sobald an Pin x ein High-Signal anliegt startet im Arduino das Relay-Programm und die Relais werden der Reihe nach geschaltet.

**Please be Patient, comming soon**

Der Code im Arduino

const int relaisPin1 = 3;
const int relaisPin2 = 4;
const int relaisPin3 = 5;
const int inputPin1 = 2;

int led =13;
//*************************************************************************************************
// Info: Relais LOW schaltet ein!!!
//
// 09.05.2018 Script create  
//
// Sobald das Eingangssignal an Pin6 aus dem ESP32 anliegt soll das programm starten
// Ventil  schaltet a) nacheinander Zone 1,2,3 jeweils 20 Min
//
// Onboard LED blinkt
//
// Produktiv ab xx.xx.xxxx
// 
//*************************************************************************************************
void setup() {
 pinMode(relaisPin1, OUTPUT); // Den PWM PIN "relaisPin" als Ausgangssignal setzen.
 pinMode(relaisPin2, OUTPUT);
 pinMode(relaisPin3, OUTPUT);
 pinMode(inputPin1, INPUT);
 
 Serial.begin(9600);
  pinMode(led, OUTPUT);
}
void loop() {
buttonState = digitalRead(inputPin1);

 if (buttonState == HIGH) {
 digitalWrite(inputPin1, HIGH);
 }
 else {
 digitalWrite(inputPin1, LOW);
 }
   // pinMode(relaisPin1, OUTPUT);
   //---------------------------------------------------
     /* Zone 1  */
  digitalWrite(relaisPin1, HIGH); //Relais aus
    delay(600);  //500ms warten
  digitalWrite(relaisPin1, LOW);  //Relais ein
  digitalWrite(led,HIGH);
    //delay(1000);
    delay(1200000);// 20Minuten Einschalten
    //delay(6000); //30 Sek für Ventiltest oder Wintermode
    
  pinMode(relaisPin1, INPUT);
    digitalWrite(relaisPin1, HIGH); //Relais aus
    digitalWrite(led,LOW);
  //delay(1000);
  delay(7000);
   
  //---------------------------------------------------
  /*Zone 2 */
  pinMode(relaisPin2, OUTPUT);
  digitalWrite(relaisPin2, HIGH); //Relais aus
  delay(600);  //500ms warten
  digitalWrite(relaisPin2, LOW);  //Relais ein
  digitalWrite(led,HIGH);
  //delay(1000);
  delay(1200000);// 20Minuten Einschalten
  // delay(6000); //30 Sek für Ventiltest oder Wintermode
  
  pinMode(relaisPin2, INPUT); 
  digitalWrite(relaisPin2, HIGH); //Relais aus
  digitalWrite(led,LOW);
  //delay(1000);
  delay(7000);
  
  //---------------------------------------------------
  /*Zone 3 */
  pinMode(relaisPin2, OUTPUT);
  digitalWrite(relaisPin3, HIGH); //Relais aus
  delay(600);  //500ms warten
  digitalWrite(relaisPin3, LOW);  //Relais ein
  digitalWrite(led,HIGH);
  //delay(1000);
  delay(1200000);// 20Minuten Einschalten
  // delay(6000); //30 Sek für Ventiltest oder Wintermode
  
  pinMode(relaisPin3, INPUT); 
  digitalWrite(relaisPin3, HIGH); //Relais aus
  digitalWrite(led,LOW);
  //delay(1000);
  delay(7000);
  
}

Der Code im ESP8266

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
 
String html1 = "<!DOCTYPE html>\r\n<html>\r\n\
<head>\r\n<meta content=\"text/html; charset=ISO-8859-1\" http-equiv=\"content-type\">\r\n\
<title>WebSchalter</title>\r\n\
<form action=\"";
// String((val)?"/1.html":"/0.html")
String html2 = "\">\r\n<input value=\"ON/OFF\" style=\"";
String html3 = " width:5em;height:3em; font-size: 16px;\" type=\"submit\">\
</form>\r\n</head>\r\n<body>\r\n</body>\r\n</html>";

ESP8266WebServer server(80);    // Server Port  hier einstellen
int val = 1;                    //Startzustand ausgeschaltet
String Temp = "";
 
void Ereignis_Schalte1ON()       // Wird ausgefuehrt wenn "http://<ip address>/1.html" aufgerufen wurde
{
  val = 0;                      // Relais Aus
  digitalWrite(0, val);         // GPIO0
  Temp = html1 + String((val) ? "/1.html" : "/0.html");
  Temp += html2 + String((val) ? "BACKGROUND-COLOR: DarkGray;" : "BACKGROUND-COLOR: Chartreuse;") + html3;
  server.send(200, "text/html", Temp);
}
 
void Ereignis_Schalte1OFF()  // Wird ausgefuehrt wenn "http://<ip address>//0.html" aufgerufen wurde
{
  val = 1;                      // Relais Ein
  digitalWrite(0, val);         // GPIO0
  Temp = html1 + String((val) ? "/1.html" : "/0.html");
  Temp += html2 + String((val) ? "BACKGROUND-COLOR: DarkGray;" : "BACKGROUND-COLOR: Chartreuse;") + html3;
  server.send(200, "text/html", Temp);
}
//-----------------------------------------------------------------------------------------------------------
  
void Ereignis_Index()           // Wird ausgeuehrt wenn "http://<ip address>/" aufgerufen wurde
{
  Temp = html1 + String((val) ? "/1.html" : "/0.html");
  Temp += html2 + String((val) ? "BACKGROUND-COLOR: DarkGray;" : "BACKGROUND-COLOR: Chartreuse;") + html3;
  server.send(200, "text/html", Temp);
}

void setup()
{
  digitalWrite(0, 1);           // Anfangszustand 1 (Relais ausgeschaltet)
  pinMode(0, OUTPUT);           // GPIO0 als Ausgang konfigurieren
  pinMode(2, INPUT_PULLUP);     // GPIO2 als Eingang mit Pullup konfigurieren
  digitalWrite(0, 1);           // Anfangszustand 1 (Relais ausgeschaltet)
 
  Serial.begin(115200);         // Serielle schnittstelle initialisieren
  Serial.println("");           // Lehere Zeile ausgeben
  Serial.println("Starte WLAN-Hotspot \"astral\"");
  WiFi.mode(WIFI_AP);           // access point modus
  WiFi.softAP("astral", "12345678");    // Name des Wi-Fi netzes
  delay(500);                   //Abwarten 0,5s
  Serial.print("IP Adresse ");  //Ausgabe aktueller IP des Servers
  Serial.println(WiFi.softAPIP());
 
  //  Bechandlung der Ereignissen anschlissen
  server.on("/", Ereignis_Index);
  server.on("/1.html", Ereignis_Schalte1ON);
  server.on("/0.html", Ereignis_Schalte1OFF);
  
 
  server.begin();               // Starte den Server
  Serial.println("HTTP Server gestartet");
}
void loop()
{
  server.handleClient();
  if (!digitalRead(2))          //Wenn Taster an GPIO2 betetigt wurde
  {
    val = !val;                 // Schaltzuschtand andern
    digitalWrite(0, val);
    while (!digitalRead(2))server.handleClient(); // Warten bis der Taster losgelassen wird.
  }
}

Alternative Beispiele

FHEM und Arduino

 

FHEM und Arduino