|
|
Subscribe Kanal kann folgende Werte als String empfangen:
„0“ Realay ausschalten
„1“ Realay einschalten
„2“ Realay umschalten, Toggle
„60“ Andere nummerische Werte schalten Relais für x Minuten ein. Bei Wert 60 wird Relais einschalten und nach Ablauf von 60 Minuten ausschalten.
„?“ Beliebiger Text erzeugt Statusmeldung an Publish Kanal (Werte „0“ oder „1“)
Statusmeldung am Publish Kanal wird erzeugt bei jeder Relais –Zustand Änderung: Taster am Sonoff – Modul, MQTT- Befehl oder Ablauf des Timers.
Nach dem Anlegen der Versorgungspannung, fängt grüne LED am Sonoff – Modul für 2s schnell zu blinken. Wenn Sie währenddessen, den Taster betätigen, dann startet Sonoff – Modul im Setupmodus.
Grüne LED Leuchtet dauerhaft und Sonoff startet ein Access Point.
Mit einem WLAN fähigem Gerät das WLAN Netzwerk „MQTT Sonoff Setup“ auswählen und mit dem Passwort „tiramisu“ anmelden.
Dann starten Sie ein Internetbrowser und geben Sie in Adressleiste 192.168.168.30 ein.
Wenn die Quellcode mit der Option #define DNS kompiliert wurde, dann wird beliebige Domain zum Setupseite führen.
Es öffnet sich ein Formular mit Eingabefeldern. Nach dem Absenden des Formulars erhalten Sie Meldung „Gespeichert“. Beim erneuten Aufruf vom 192.168.168.30, werden eingestellten Daten angezeigt. WLAN-Passwort wird dabei mit Sternchen ersetzt.
Um Setup Modus zu verlassen müssen Sie den Sonoff – Modul kurz von der Spannung trennen.
Download MQTT Sonoff BIN alternative Firmware -Laden der Firmware mit einem Tool über serielle Schnittstelle. Anleitung
(Kompiliert mit Arduino ver. 1.6.12, ESP8266 Bibliothek ver. 2.3.0).
Download Projekt MQTT Sonoff alternative Firmware -Sketch für Arduino, es wird Bibliothek Core for ESP8266 WiFi chip und MQTT client library for Arduino(vom Imroy) benötigt.
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 |
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> #include <EEPROM.h> extern "C" { #include "user_interface.h" } #define Taster 0 #define Relais 12 #define LED 13 // grüne LED boolean val = 0; // SchaltZustand #define DNS // Hier wird "captive portal"(beliebige Domen führt zur Startseite) eingeschaltet IPAddress apIP(192, 168, 168, 30); #if defined DNS #include <DNSServer.h> const byte DNS_PORT = 53; DNSServer dnsServer; #endif char ssid[32] = "fhgdhfghd\0"; // ssid und passwort werden aus EEPROM später eingelesen char passwort[64] = "gghdfgh\0"; // hier nur das Platzhalter String konfig[7]; #define BUFFER_SIZE 100 unsigned int MinutenAlt; ESP8266WebServer server; EspClass esp; int z = 0; // Aktuelle EEPROM-Adresse zum lesen #include "Setup2.h" // Unterprogramme für Setup unsigned int timer = 0; WiFiClient wclient; PubSubClient client(wclient); void callback(const MQTT::Publish& pub) // Diese funktion wird bei empfang einer subscribe Publish ausgeführt { String Empfangen = pub.payload_string(); // Auswertung der empfanener Nachrichts if (Empfangen == "0") { val = 0; // Ausschalten timer=0; // Falls Timer leuft Timer deaktivieren } else if (Empfangen == "1") val = 1; // Einschalten else if (Empfangen == "2") val = !val; // Umschalten else { // andere Zahl oder Text if (Empfangen.toInt() != 0) // wenn Zahl enthalten { timer = Empfangen.toInt(); // Timer setzen val = 1; // und einschalten } } digitalWrite(Relais, val); client.publish(MQTT::Publish(konfig[6], String(val)).set_qos(1)); // SchaltStatus melden } void setup() // Wird 1 Mal beim Start ausgefuehrt { pinMode(Taster, INPUT_PULLUP); pinMode(LED, OUTPUT); pinMode(Relais, OUTPUT); EEPROM.begin(512); //------------------------------------ Eingang in Setupmodus nechste 2 Sekunden möglich -------------- for (int i = 0; i < 20; i++) { digitalWrite(LED, 0); delay(50); digitalWrite(LED, 1); delay(50); if (!digitalRead(Taster)) // Taster wurde betätigt { digitalWrite(LED, 0); // Dabei leuchtet LED permanent Einstellen(); } } //----------------------------------- Normale Start ----------------------------------------------- z = 0; LeseEeprom(ssid, sizeof(ssid)); // EEPROM lesen if (ssid[0] == 255) // Wenn EEPROM leer ist dann: { for (int i = 0; i < 20; i++) EEPROM.write(i, '\0'); EEPROM.commit(); digitalWrite(LED, 0); Einstellen(); } LeseEeprom(passwort, sizeof(passwort)); for (int k = 0; k < 7; k++) LeseEepromStr(&konfig[k], 60); WiFi.mode(WIFI_STA); WiFi.begin(ssid, passwort); int timout = 0; while (WiFi.status() != WL_CONNECTED) { timout++; if (timout > 60) // Wenn Anmeldung nicht möglich { digitalWrite(LED, 0); // LED ON für 5 Sekunden delay(5000); digitalWrite(LED, 1); delay(100); break; } // End timeout delay(100); digitalWrite(LED, 0); // Beim WLAN Anmeldung blinken delay(100); digitalWrite(LED, 1); delay(100); } // Verbunden Serial.begin(115200); } void loop() { // --------------------- Timer ------------------------------------------------ unsigned int Minuten; Minuten = millis() / 60000; if (Minuten != MinutenAlt) // Passirt jede Minute { if (timer>0) // Wenn timer gesetzt { timer--; // Timer rükwärts zählen if (timer==0) // Wenn timer abgelaufen { val=0; // Relais ausschalten digitalWrite(Relais, val); if (client.connected()) client.publish(MQTT::Publish(konfig[6], String(val)).set_qos(1)); } // ende Wenn timer abgelaufen } // ende Wenn timer gesetzt MinutenAlt=Minuten; } // Ende Passirt jede Minute // --------------------------------- Taster ---------------------------------------------------------- if (!digitalRead(Taster)) // Wenn Taster betätigt { delay(50); // Entprellung if (!digitalRead(Taster)) //immer noch betätigt? Noch mal prüfen { val = !val; // Umschalten digitalWrite(Relais, val); if (client.connected()) client.publish(MQTT::Publish(konfig[6], String(val)).set_qos(1)); while (!digitalRead(Taster))if (client.connected())client.loop(); // Warten bis der Taster losgelassen wird } } if (WiFi.status() == WL_CONNECTED) { if (!client.connected()) //------------------------- MQTT nicht verbunden --------------------------------- { client.set_server(konfig[0], konfig[1].toInt()); if (client.connect(MQTT::Connect(konfig[4]).set_auth(konfig[2], konfig[3]))) { client.publish(MQTT::Publish("Hallo", konfig[4]).set_qos(1)); client.set_callback(callback); client.subscribe(konfig[5]); } } //----------------------------------------------- ende MQTT nicht verbunden ------------------------------- if (client.connected()) // MQTT verbunden { client.loop(); }// ende mit MQTT verbunden } // ende mit WLAN verbunden } |
Um das Firmware in den Sonoff Modul zu übertragen, müssen sehe ein USB seriell Adapter an das Sonoff Modul anschließen, wie auf dem Bild.
Ich empfehle dabei das Modul mit 3,3 Volt oder mit 5 Volt einzuspeisen.
Die 5 Volt können vor dem Spannungsregler oder am Kondensator eingespeist werden.
Programmiermodus wird gestartet indem Sie den Taster halten und Spannung auf das Sonoff Modul geben.
Bitte betreiben sie das Sonoff Modul an 230 Volt nur, wenn das Gehäuse geschlossen ist!
ESP8266 Pin | Function | GPIO | Connected to |
---|---|---|---|
9 – MTMS | GPIO | GPIO14 | J1 Pin 5 |
10 – MTDI | GPIO | GPIO12 | Relay (HIGH schaltet Ein) |
12 – MTCK | GPIO | GPIO13 | LED (LOW schaltet Ein) |
15 – GPIO0 | Flash | GPIO0 | Taster (LOW wenn gedrückt) |
25 – RDX | UART RXD | GPIO3 | J1 Pin 2 |
26 – TXD | UART TXD | GPIO1 | J1 Pin 3 |
Anmerkung: Bei meinem Sonoff Modul war Transistor Q3 nicht bestückt. So das rote LED das Relaiszustand nicht anzeigen kann.