Nel mio post precedente ho fatto una panoramica su come iniziare ad usare il modulo ESP8266-01 [http://mancusoa74.blogspot.it/2015/08/test-del-modulo-wifi-esp8266.html]
In due miei vecchi post [Controllo Remoto per Caldaia - Raspberry e Client SW] e [Controllo Remoto per Caldaia - HW] descrivevo la realizzazione HW e SW per un controllo per caldaia via Internet realizzato con Raspberry Pi.
Il tutto e' installato e funzionante a casa mia con molta soddisfazione.
Ovviamente fin dal primo prototipo non ero soddisfatto di usare una risorsa preziosa e costosa come Raspberry Pi per attivare e deattivare un semplice relay.
Finalmente con il modulo ESP8266 posso rimpiazzare completamente il rasperry in questo progetto.
Per chi non lo sapesse il modulo ESP8266 include un microcontrollore e mette a disposizioni dei piedino di GPIO. Funzinalmente esattamente uguale ad Arduino.
Quindi questo modulo Wifi posso collegarlo ad Internet e con un GPIO pilotare il relay collegato alla mia caldaia esattamente come ho fatto con il raspberry pi.
I vantaggi principali sono:
- uso di un modulo da 3 Euro rispetto al Raspebbry 30 Euro
- minor consumo energetico (4 batteria AA)
- minor ingombro
- infine cosa a me cara: uso del miglior strumento per la soluzione del problema (tutti possiamo uccidere una mosca con un bazooka ma non e' il modo migliore)
Dal lato software come vedrete utilizzero gli stessi strumenti usati su raspberry ed in particolar modo il mio client PubNub che gia' ho usato tutto l'anno con successo. Dovro' solo apportare banali modifiche legati alle chiavi PubNub.
Sicuramente ci sono metodi ancora piu' ottimali e chi ha voglia si faccia avanti, sono sempre curioso nell'imparare cose e soluzioni nuove.
Qui sotto una breve descrizione del piccolo progettino
Relay Internet HW
BoM
I componenti sono:
- 1x modulo ESP8266 (nel mio caso EPS8266-01)
- 2x resistenze da 1K
- 1x resistenza da 2K (io ne uso 2 da 1K in serie siccome non ho quella da 2K)
- 1 Led
- 1 transistor BC547 (NPN) (avevo solo questo in casa forse un PNP sarebbe stato meglio ma ok)
- 1x diodo 1N4007 (avevo solo questo in casa)
- 4x pile AA
- 1x porta batterie AA (riciclato da una vecchia macchinina telecomandata)
- rainbow wires quanto basta :)
Schema
Come si puo' vedere lo schema e' molto molto semplice ed i componenti necessari sono pochissimi
Alimentazione
Come si deve della figura il porta batterie AA e' modificato in quanto ha tre fili di uscita.
Il motivo principale e' che il modulo relay che ho e' a 5V e lo ESP8266 e' alimentato a ~3.3V.
Quindi in questo progettino ho bisogno di due alimentazioni 5V e 3.3V che ricavo dalle 4x batterie AA da 1m5V ciascuna.
Quindi tra il filo azzurro ed il filo nero all'estrema sinistra del porta batterie misuro con il tester circa 5V (le batterie non sono mai essattamente 1,5V)
Tra il filo azzurro e il filo nero in centro misuro circa 3V (2 batterie AA) in ogni caso abbastanza per alimentare stabilmente lo ESP8266.
Chiaramente e' piu' a scopo didattico che altro. Per impieghi piu' seri le 4x AA potrebbero scaricarsi velocemente e quindi e' necessario un circuito di alimentazione adatto. Comunque la sostanza non cambia questo circuito va alimentato a 3V e 5V.
Funzionamento
In questo post non analizzo i collegamenti tra lo ESP8266 e il modulo TTL-USB in quanto sono esattamente gli stessi del post precedente
Come si vede dallo schema (qui un dettaglio) il GPIO2 dello ESP8266 controllo il relay. Siccome il rele necessita' di un controllo a 5V e il GPIO2 e' a 3.3V ho bisogno di un piccolo transistor.
Il collettore del transistor e' collegato a +5V tramite una resistenza e' un led (il led e' opzionale).
La base del transistor e' pilotata dall'uscita GPIO2 dello ESP8266.
Come notate ho anche inserito un resistenza di pull-up (2K).Questo e' dovuto al funzionamento del fimrware dello ESP8266 [http://www.esp8266.com/viewtopic.php?f=13&t=1730] e [https://zoetrope.io/tech-blog/esp8266-bootloader-modes-and-gpio-state-startup]
L'emettitore del transistor e' collegato al piedino di controllo del modulo a relay.
Tutto molto semplice dal punto di vista del circutio. Se usassi un relay a 3V (che non ho) questa parte del circuito non sarebbe necessaria e nemmeno la doppia alimentazione, ma cosi' e' piu' divertente.
Relay Internet SW
Come spiegato nei post lagati al controllo caldaia io adotto un meccanismo non molto comune sui forum che tipicamente e' di far girare il web server su raspberry o arduino.
Lo trovo di stampo vecchio, mi obbliga ad aprire la mia rete all'esterno e a fare un port forwarding.
Ma soprattutto e' architturalmente non corretto. Immaginate se anziche' avere un modulo relay ne hai 50.000.
Comunque architettura software a parte io uso un servizio molto buono e gratuito che si chiama PubNub e quindi anche con il modulo EPS8266 voglio continuare ad usare questo servizio in modo da non dover riscrivere il mio client.
Al momento non c'e' un client PubNub per ESP8266 e quindi usiamo un altro stratagemma.
PubNub fornisce un bridge per client MQTT [http://www.pubnub.com/blog/mqtt-now-supported-by-pubnub/] che sfrutto.
In sostanza io posso avere un sensore che "parla" MQTT (il releay Internet/EPS8266) ed un client che "parla" PubNub. Il servizio cloud PubNub fa da bridge tra questi due protocolli.
Per me questo e' fantastico in quanto c'e' una buona libreria MQTT per ESP8266 ed il mio client PubNub che usavo con Raspberry [http://mancusoa74.blogspot.it/2014/11/controllo-remoto-per-caldaia-raspberry.html] funziona anche con EPS8266 senza modifiche.
EPS8266 e Arduino IDE
Come visto nell'articolo precedente il modulo ESP8266 e caricato con un firmware che mette a disposizione un'interfaccia AT. Questo e' comodo per semplici test, ma puo' diventare tedioso per cose piu' complicate.
Quindi esistono varie possibilita' tra cui caricare firmware alternativi [https://github.com/nodemcu/nodemcu-firmware] oppure come ho fatto io programmare lo EPS8266 direttamente con l'IDE Arduino [https://github.com/esp8266/Arduino].
In questo modo programmate lo ESP8266 in maniera molto simile se non identica ad Arduino. Molte se non tutte le maggiori librerie sono disponibili.
Per esempio la libreria Wifi [https://www.arduino.cc/en/Reference/WiFi] che normalmente si usa per lo shield Wifi di Arduino e' stata portata su ESP8266 con un API identica.
Quindi esistono varie possibilita' tra cui caricare firmware alternativi [https://github.com/nodemcu/nodemcu-firmware] oppure come ho fatto io programmare lo EPS8266 direttamente con l'IDE Arduino [https://github.com/esp8266/Arduino].
In questo modo programmate lo ESP8266 in maniera molto simile se non identica ad Arduino. Molte se non tutte le maggiori librerie sono disponibili.
Per esempio la libreria Wifi [https://www.arduino.cc/en/Reference/WiFi] che normalmente si usa per lo shield Wifi di Arduino e' stata portata su ESP8266 con un API identica.
Sketch
// MQTT Internet Relay // // Antonio "monk" Mancuso - July 2015 #include <ESP8266WiFi.h> #include <MQTT.h> #include <PubSubClient.h> const char* ssid = "YOUR_SSID"; //SSID della rete wifi const char* pass = "YOUR_WIFI_PASSWORD"; //wifi password //inizializza la connessione al server mqtt IPAddress mqtt_server(5,153,35,162); //mqtt.pubnub.com che e' il bridge MQTT messo a disposizione da pubnub //client wifi WiFiClient wclient; //mqtt client PubSubClient client(wclient, mqtt_server); //funzione di callback invocata quando riceviamo un messaggio MQTT void callback(const MQTT::Publish& pub) { String command = ""; Serial.print(pub.topic()); Serial.print(" => "); command = pub.payload_string(); Serial.println(command); //logica triviale: se riceviamo il comando ON allora facciamo scattare il relay portando GPIO2 a stato logico HIGH //viceversa per il comando OFF // la logica puo' essere complessa a piacere. qui e' semplificata per scopo didattico if (command == "ON") { digitalWrite(2, HIGH); Serial.println("button ON"); } else if (command == "OFF") { digitalWrite(2, LOW); Serial.println("button OFF"); } } //setup del programma che gira sul ESP8266 void setup() { //inizializzazione console Serial.begin(115200); delay(10); Serial.println(); Serial.println(); //definizione della callback del client mqtt Serial.println("set callback"); client.set_callback(callback); //connessione alla rete wifi WiFi.begin(ssid, pass); Serial.println("wifi begin"); //verifichiamo che siamo effettivamente connessi al wifi int retries = 0; while ((WiFi.status() != WL_CONNECTED) && (retries < 10)) { retries++; delay(500); Serial.print("."); } if (WiFi.status() != WL_CONNECTED) { Serial.println("Cannot connect to WiFi network"); } else { //ok siamo connessi al wifi e ad Internet (con questo metodo non dobbiamo aprire nessuna porta, nessun port forwarding o simili) Serial.println(""); Serial.println("WiFi connected"); //stabilimo la connessione mqtt if (client.connect("PUBNUB_PUBLISH_KEY/PUBNUB_SUBSCRIBE_KEY/UNIQUE_CLIENTI_ID")) { Serial.println("MQTT connect"); // a questo punto siamo connessi al server mqtt //facciamo il subscribe del topic(canale) che vogliamo client.subscribe("PUBNUB_PUBLISH_KEY/PUBNUB_SUBSCRIBE_KEY/MQTT_TOPIC"); //adesso il nostro modulo ESP8266 e' pronto per ricevere i comandi dal nostro client via Internet Serial.println("CHECKING MQTT CONNECTION"); if (client.connected() == true) { Serial.println("MQTT connected"); } else { Serial.println("MQTT NOT connect"); } } else { Serial.println("Error in MQTT connection"); } } } void loop() { //il loop e' banalissimo. il client mqtt rimane in ascolto sul canale/topic specificato //quando un messaggio viene ricevuto la callback registrata viene invocata client.loop(); }
Come vedete ho mantenuto lo sketch semplice appositamente per questo articolo che e' rivolto a principianti.
In un caso piu' reale si dovranno implementare nello sketch una serie di controlli di errore in caso di disconnessione dal server mqtt ed implementare la logica voluta.
Tuttavia questo esempio dimostra come sia facilissimo implementare un moderno controllo remote per relay via Internet.
L'unica nota dolente e che lo ESP8266 non e' potente abbastanza per supportare SSL quindi al momento la connessione a MQTT e' in chiaro quindi richiede qualche stratagemma addizionale per rendere la comunicazione un minimo piu' sicura.
In ogni modo mi pare che qualcuno sta provando ad implementare SSL su EPS8266. Quindi anche se queste prime versioni dei moduli non lo supportano sono fiducioso che future versioni avranno una potenza sufficiente a supportare SSL.
Test
Passiamo ora ad un semplice test.
Carichiamo lo sketch tramiter l'IDE arduino
Adesso proviamo a mandare un messagio allo EPS8266. Per comodita' uso la console di PubNub [http://www.pubnub.com/console/] che mi permette di inviare messaggi al mio ESP8266.
Carichiamo lo sketch tramiter l'IDE arduino
Adesso proviamo a mandare un messagio allo EPS8266. Per comodita' uso la console di PubNub [http://www.pubnub.com/console/] che mi permette di inviare messaggi al mio ESP8266.
Poi compongo il messaggio da spedire come in figura:
{"mqtt": "ON", "channel":"PUBNUB_PUBLISH_KEY/PUBNUB_SUBSCRIBE_KEY/MQTT_TOPIC"}
Quindo quando premo il pulsante con la freccia in figura (invio) un messaggio MQTT con body ON viene inviato ad uno specifico topic (canale).
Siccome lo ESP8266 e' in ascolto (subscribe) sullo stesso topic il messagio ON viene ricevuto
siccome alla ricezione del comando ON il GPIO2 viene messo a HIGH la il transistor va in saturazione quindi il led rosso si accende ed il rerlay scatta
Allo stesso modo se inviamo il comando OFF.
il GPIO2 viene messo a LOW e quindi il transistor e' interdetto, il led si spegne ed il relay torna nella posizione originale
Come menzionato in precedenza ora ho tutti gli elementi per rimpiazzare il mio controllo remoto per caldaia basato su raspberry con un piccolo modulo ESP8266 ottenendo la stessa funzionalita' ad una frazione del costo e con un consumo energetico minore.
Ovviamente questo relay controllato via Internet puo' essere usato in mille modi diversi.
Se avete delle idee sul come usarlo e dei suggerimenti fatemi sapere. Come sempre sono aperto a nuovi spunti
ciao ho seguito il post e complimenti davvero interessante ... ma non riesco a implementarlo nello specifico non riesco a connettermi al MQTT service ho pensato al ip sabagliato ma anche usando quello che ora viene usato in pubnub console (54.93.254.234) non supera l'if e va nel else del "Error in MQTT connection"
RispondiEliminaciao, queso post e' stato scritto usando un servizio MQTT chiamato PubNub. Mi pare che ora non offrano piu' questa funzionalita'.
EliminaProva a guardare questo articolo, che ti spiega come usare un altro servizio MQTT.
Poi modifica il server con cloudMQTT e dovrebbe funziuonare tutto
https://mancusoa74.blogspot.com/2017/02/mqtt-basic-per-esp8266.html
buona sperimentazione
ciao. Ho un problema che mi fa impazzire da un po'.
RispondiEliminaHW: ESP8266-01 S con relay
ho caricato su ESP lo sketch esempio LED_Control (lo stesso con il Blink), via Arduino IDE. Modulo ESP stand-alone con LED funziona OK, il LED va ON/OFF, alimentato a 3.3V.
Monto l'ESP sul modulo con relay, alimento il tutto con 5.2V
L'ESP funziona, vedo e controllo il server. Controllo la tensione sul pin GPIO2 e va regolarmente ON(3.3)/OFF, misurata sul connettore ESP. Quindi tutto sembra OK, ma il relay non scatta. Il modulo relay e' alimentato a 5V, sia nella parte logica che nel controllo della comunicazione (e' la stessa linea di alimentazione).
Provato il tutto con due moduli, il comportamento e' lo stesso, ed avevo provato anche il modulo relay off-line, senza ESP come da istruzioni (inviando A00100A1/A00101A2) e funziona. Quindi il problema non e' hw o sw, ma del sottoscritto !!!!
Spero di essere stato chiaro, grazie per qualsiasi aiuto.
Salve anche io ho questo problema , che ancora non ho risolto lei l'ha risolto?
Eliminama questa domanda e' legata a questo articolo?
RispondiEliminail rele' a %V va pilotato a 5v, mentre le uscite ESP sono a 3V3.
per il resto non ho idea a quale modulo e quale codice ti stai riferendo
Ciao io ho il modulo relé come il tuo, ESP-01 quello Marrone. So che al boot mette in HIGH i 2 GP0 compresi TX e RX. Il problema é che mi fa scattare il relé se alimento il modulo ESP-01. Questo se manca la rete elettrica provoca l'accensione del Relè dovuta al Boot di ESP-01. Dovrei montarlo su una serratura elettrica, e non so come risolvere. Il tuo fa lo stesso? o come hai risolto?
RispondiEliminaciao,
Eliminavedi qui, può esserti d'aiuto
https://mancusoa74.blogspot.com/2017/10/internet-relay-board-c-v31.html