8 Kanal I2C – Relais per WLAN steuern mit ESP8266 Webserver über Netzwerk
8 Kanal 5V Relay Relais Module Modul für Arduino 8051 |
PCF8574 IO Erweiterungskarte Blau I2C-Bus Modul |
ESP8266 Modul |
Kabel |
5V USB Adapter |
DC / DC 3.3V AMS1117-3.3V
|
8 Kanal Relais Karte mit I2C Port-Erweiterungsmodul zusammen mit Kabel kosten 12,40€ bei Amazon. ESP8266 kostet 3,50€ und 5V USB-Netzteil 3 ,00€
Spannungsregler 3,21€ macht zusammen 22,11€.
Da braucht man keine Platane zu löten. Einfach Module nach Schaltplan verbinden und die Schaltung ist fertig. In diesem Projekt werden nur 8 Relais angesteuert aber theoretisch können es (8 Output × 8 IC PCF8574 =) 64 Relais sein.
Schaltplan
Beschreibung der Schaltung
Die Schaltung benötigt 2 Spannungen: 5V für Relaiskarte und I2C Modul und 3,3V für ESP6288 Modul. 5V Liefert USB-Ladeadapter, 3,3V Liefert DC / DC 3.3V AMS1117-3.3V Modul. Diesem Modul, meiner Meinung nach, fehlt ein größere Kondensator. Deswegen wurde C1 eingeführt. Über Steckerleiste J1 kann ein RS232 Adapter angeschlossen werden um Firmware zu laden und den Server zu konfigurieren. Beim Starten der Schaltung mit geschlossenem Jumper EP1 geht ESP6288 Modul in Programmiermodus. ESP6288 Modul ist per I2C-Buss mit der PCF8574 IO Erweiterung Modul verbunden. Ich habe absichtlich GPIO0 als Clock-Signal konfiguriert weil ESP-01 Modul wehrend den Bootvorgang an GPIO2 Mühl sendet. Stromaufnahme der 8 Kanal Relaiskarte beläuft auf (70mA/Relais x 8=) 560mA. Dazu kommt 200mA vom ESP-01 Modul und 100mA Kleinkram wie PCF8574 und Optokoppler. Macht insgesamt 860mA. USB-Ladeadapter soll mindestens 1A liefern können. Relais schalten beim Low-Pegel an den IN-Eingängen. Glücklicherweise liefert PCF8574 beim Anlegen der Spannung High, so der Ausgangszustand ist Aus für alle Kanäle.
Funktionsweise
Nach dem Anlegen der Versorgungspannung startet ESP8266 als Server. Beim Aufruf der Index Seite wird eine Webseite erzeugt mit 8 Buttons. Sobald Webseite im Browser geladen ist, startet ein Java-Script, der mittels AJAX, asynchron Daten über Schaltzustand der Relais abfragt. Danach geschieht das Abfragen der Relais jede 3 Sekunden. Wenn ein Button betätigt wird, sendet Java-Script über AJAX Daten an den ESP8266 WebServer. ESP8266 sendet Daten über I2C-Bus und steuert über I2C-Bus und PCF8574 IO Erweiterungskarte den 8 Kanal Relais Modul. Nach dem das Steuerbefehl erfolgreich über I2C geschickt wurde, erhält Webseite über AJAX Antwort des ESP8266 Servers und zeigt mit der Farbe des Buttons neuen Schaltzustand der Relay (Eigentlich wird Schaltzustand aller 8 Relay aktualisiert). Interessant wird es, wenn man von mehreren Rechnern gleichzeitig den 8 Kanal Relay Board steuert.
Quellcode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <EEPROM.h> #include <Wire.h> // I2C -Bibliothek #include "Index.h" // Enthaelt HTML-Code der Index Webseite // const char indexHtml[5423]={}; char ssid[32] = "1234\0"; char passphrase[64] = "567890\0"; char output = 0; // Schltzustaende char IC = 32; // Adresse des I2C ICs int i, port; ESP8266WebServer *server; //Zeiger auf Objekt Klasse Server EspClass esp; // Objekt esp um Reset zu machen void setup() // Wird 1 Mal beim Start ausgefuehrt { Wire.begin(2, 0); // I2C-Bus initialisieren GPIO2-Data GPIO0-Clock Wire.setClock(1000); // I2C-Bus Freqenz // Anfangszustand 1111 11111 (Relais ausgeschaltet) Wire.beginTransmission(IC); // IC-Adresse Wire.write(~output); // Byte senden Daten werden Inveriert Wire.endTransmission(); // I2C Stopbedingung Serial.begin(115200); Serial.println("\r\n") ; EEPROM.begin(66); // EEPROM initialisieren mit 64 Byts sprungmarke: // Eeeprom einlesen for (i = 0; i < 32; i++) ssid[i] = EEPROM.read(i); for (i = 32; i < 64; i++) passphrase[i - 32] = EEPROM.read(i); port = EEPROM.read(64); port += EEPROM.read(65) * 256; // Wenn EEPROM leer if (ssid[0] == 255) { Serial.println("SSID nicht konfiguriert\r\n") ; Serial.println("Weiter mit \"Enter\"\r\n") ; while (!Serial.available())yield(); // Warte bis Seriell etwas reinkommt InputEEPR(); // Unterprogramm zum configurieren der WiFi goto sprungmarke; } WiFi.mode(WIFI_STA); // Station Modus WiFi.begin(ssid, passphrase); while (WiFi.status() != WL_CONNECTED) // Warten auf verbindung { delay(500); Serial.print("."); if (Serial.available()) InputEEPR(); // Ausgang wenn Seriell etwas empfangen } // dann Wlan Name und Passwort eingeben server = new ESP8266WebServer(port); // Objekt Server Bilden und dem Zeiger Uebergeben Serial.println(""); Serial.print("Verbunden mit "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Bechandlung der Ereignissen anschlissen server->on("/", Ereignis_Index); server->on("/schalte.php", Ereignis_Befehl); server->begin(); // Starte den Server Serial.print("HTTP Server gestartet am Port: "); Serial.println(port); } void Ereignis_Befehl() // Wird ausgefuehrt wenn "http://<ip address>/schalte.php" aufgerufen wurde { String relaisNr = server->arg("relais"); // Relais Nr. empfangen int z = relaisNr.toInt(); // String zu Integer konvertieren z--; // 1 abzien, weil bits im Byte werden ab 0 gezaelt String zustand = server->arg("schalte"); if (zustand == "1") bitSet(output, z); // Wenn Einschalten gewuenscht Bit setzen if (zustand == "0") bitClear(output, z); // Wenn Ausschalten gewuenscht Bit zuruecksetzen char k = 0; // Temporere Variable fuer XOR Operation if (zustand == "2") output ^= bitSet(k, z); // Umschalten den gewaelten Relay mit XOR Wire.beginTransmission(IC); // I2C IC-Adresse Wire.write(~output); // Byte Invertieren, bei "0" sind Relais an Wire.endTransmission(); // Stop-Bedingung I2C // Serial.println(String(int(output))); server->send(200, "text/plain", String(int(output)) ); // Antwort an Internet Browser senden } void Ereignis_Index() // Wird ausgefuehrt wenn "http://<ip address>/" aufgerufen wurde { server->send(200, "text/html", indexHtml); // HTML Webseie befindet sich im "Index.h" } void loop() { if (Serial.available()) InputEEPR(); // Wenn Seriell etwas empfangen server->handleClient(); // Server Ereignisse abarbeiten } void InputEEPR() //Hier wird Wlan-Zugang sowie Port konfiguriert { String Text = ""; // Variable für Port Nummer als Text char inser; // Variable für RS232-Empfangene Zeichen inser = Serial.read(); if (inser != 13) return; // Wenn NICHT "Enter" dann Unterprogramm verlassen schleife: Serial.println(""); Serial.println("Bitte auswaelen zum aendern"); Serial.print("1. SSID: "); Serial.println(ssid); Serial.print("2. Passwort: "); Serial.println(passphrase); Serial.print("3. Serverport: "); Serial.println(port); Serial.println("4. Ausgang"); Serial.println("5. Reset"); Serial.println(""); while (!Serial.available()) yield(); // Warte bis etwas empfangen wird inser = Serial.read(); // Auswahl empfangen switch (inser) // Zutreffendes ausfuehren { case '1': Serial.println("Input SSID: "); for (i = 0; i < 32; i++) { while (!Serial.available()) yield(); //warte bis etwas empfangen wird inser = Serial.read(); Serial.write(inser); if (inser == '\r') // Wenn Zeile abgeschlossen ist { EEPROM.write(i, '\0'); // Stringende setzen break; // for schleife verlassen } else EEPROM.write(i, inser); // nechste Zeichen empfangen } Serial.println("\r\nOK"); EEPROM.commit(); // EEPROM fuesikalisch beschreiben for (i = 0; i < 32; i++) ssid[i] = EEPROM.read(i); // Neue Daten in Variablen laden break; case '2': Serial.println("Input Passwort: "); for (i = 32; i < 64; i++) { while (!Serial.available()) yield(); inser = Serial.read(); Serial.write(inser); if (inser == '\r') { EEPROM.write(i, '\0'); break; } else EEPROM.write(i, inser); } Serial.println("\r\nOK"); EEPROM.commit(); for (i = 32; i < 64; i++) passphrase[i - 32] = EEPROM.read(i); break; case '3': Serial.println("Input Port: "); for (i = 0; i < 5; i++) { while (!Serial.available()) yield(); // warte bis etwas empfangen wird inser = Serial.read(); Serial.write(inser); if (inser == '\r') break; // Wenn zeile abgeschlossen ist for schleife verlassen else Text += (char)inser; } Text += '\0'; // Stringende setzen Serial.println("\r\nOK"); port = Text.toInt(); // Integer aus Text bilden char* p; p = reinterpret_cast<char*>(&port); // Byte array aus Integer machen EEPROM.write(64, p[0]); // und im EEPROM speichern EEPROM.write(65, p[1]); EEPROM.commit(); port = EEPROM.read(64); // Neue Daten in Variablen laden port += EEPROM.read(65) * 256; break; case '4': WiFi.begin(ssid, passphrase); return; // Unterprogramm InputEEPR() verlassen break; case '5': esp.reset(); break; default: break; } goto schleife; // Nach der Eingabe wieder zum Menu zurueckkehren } |
Server Client Kommunikation
http://<Domain>/ Webseite mit Buttons und AJAX FunktionalitätWeitere Infos für den Fall, wenn Sie eigene Steuerungswebseite erstellen möchten. Die kann ja auf jedem beliebigem Server laufen.
http://<Domain>/schalte.php Abruf aktueller Relaiszustandes. Als Antwort wird eine Zahl im Textformat empfangen z.B „129“ bedeutet Binär„1000 0001“ Relais 1 und Relais 8 sind „an“.
http://<Domain>/schalte.php?relais=2&schalte=0 bedeutet Relais 2 Ausschalten
Argument „relais“ Relais Nummer wählen
Argument „schalte“ 0-Auschalten, 1-Einschalten, 2-Umschalten(wenn „aus“ dann „an“, wenn „an“ dann „aus“)
WiFi Zugang Setup
Wlan Netzwerk, Password sowie Port Nummer wird über RS232-Terminal eingegeben und im EEPROM gespeichert.Vorgehensweise: USB-Seriell mit dem ESP8266 WebServer verbinden, Terminalprogramm so einstellen das die Tastatureingaben direkt übertragen werden, kein Echo. Baudrate 115200, 8 Bit, kein handshake. Einschalten, Eingabetaste betätigen. Es wird eine Auswahlmenü angezeigt. Durch Eingabe der Zahl wird Menüpunkt ausgewählt (ohne „Enter“). Eingabe der Daten wird mit einem „Enter“ abgeschlossen.
Webinterface
E-Mail: webmaster_x_esp8266-server.de |