Differenze tra le versioni di "Impianto di irrigazione"
(Creata pagina con 'Un lusso per tutti quelli che hanno un giardino o magari qualche vaso in terrazza è l'impianto di irrigazione che permette di risparmiare tempo, acqua e soprattutto evitare d...') |
|||
Riga 11: | Riga 11: | ||
Utilizzare valvole a 24 Vcc, una tensione non proprio comune tra i miei recuperi, ma qualcosa si trova sempre, per questo basta un trasformatore, per l'occasione ne ho trovato uno da circuito stampato perciò ho dissaldato tutti i componenti inutili. | Utilizzare valvole a 24 Vcc, una tensione non proprio comune tra i miei recuperi, ma qualcosa si trova sempre, per questo basta un trasformatore, per l'occasione ne ho trovato uno da circuito stampato perciò ho dissaldato tutti i componenti inutili. | ||
− | [[File:Trasformatore.jpg| | + | [[File:Trasformatore.jpg|200px|thumb|right|Trasformatore]] |
Due relays uno per il primario del trasformatore ed uno da usare sul secondario per selezionare la valvola da attivare. | Due relays uno per il primario del trasformatore ed uno da usare sul secondario per selezionare la valvola da attivare. | ||
Riga 17: | Riga 17: | ||
Un alimentatore a 5V per alimentare il modulo di comando (che va a 3.3V quindi userò anche uno stabilizzatore dedicato) ed i relè. | Un alimentatore a 5V per alimentare il modulo di comando (che va a 3.3V quindi userò anche uno stabilizzatore dedicato) ed i relè. | ||
− | Un modulo ESP8266 ed una rete wifi, magari una rete comunitaria come ad esempio Ninux (questo punto lo vedremo più avanti) o un apparato per una connessione punto punto es: un altro modulo ESP8266 o una chiavetta wifi. | + | Un modulo [ESP8266 ESP8266] ed una rete wifi, magari una rete comunitaria come ad esempio Ninux (questo punto lo vedremo più avanti) o un apparato per una connessione punto punto es: un altro modulo ESP8266 o una chiavetta wifi. |
Le valvole andranno posizionate all'esterno mentre la parte sotto tensione va ben protetta. | Le valvole andranno posizionate all'esterno mentre la parte sotto tensione va ben protetta. | ||
+ | |||
+ | === Codice per il modulo ESP8266 === | ||
+ | |||
+ | Questo codice è un collage di un pò di cose trovate in giro, e lette sulla documentazione del firmware nodemcu. | ||
+ | |||
+ | Lo scopo è quello di agganganciare il modulo wifi alla rete ninux come client con un ip fisso. Il modulo crea un server web minimale a cui ci si può collegare con pc o telefono o uno script (la soluzione che adotterò io). | ||
+ | |||
+ | Non vorrei però allagare il giardino qualora cadesse la connessione wifi per qualsiasi motivo (magari un restart del modulo per una sovratensione, problemi sulla rete wifi ecc...). | ||
+ | |||
+ | Quindi sfruttando un timer ciclico ogni 60 secondi se non è stato ribadito il comando di on il modulo in automatico spegne l'alimentazione delle elettrovalvole. | ||
+ | |||
+ | Avrei potuto usare il timer semplicemete per disattivare le valvole dopo alcuni minuti di irrigazione, ma prevedo già richieste di modifica sul tempo di apertura e parto già con due zone che richiedono quantità di acqua diverse perciò voglio rendere tutto più flessibile. | ||
+ | |||
+ | Ne ho approfittato per aggiungere qualche istruzione non proprio necessaria, ma che fornisce qualche dato in più e che potrò riutilizzare in futuro | ||
+ | |||
+ | <nowiki> | ||
+ | for n,s in pairs(file.list()) do print(n.." size: "..s) end -- Lista dei files presenti in memoria | ||
+ | print("Vcc="..(node.readvdd33()/1000).."V") -- Display della tensione di alimentazione del modulo | ||
+ | wifi.setmode(wifi.STATION) -- Setup wifi in modalità client | ||
+ | wifi.sta.config("NinuxBO","") -- Connessione alla rete Ninux, il parametro lasciato vuoto corrisponde alla password | ||
+ | cfg = {ip="10.51.0.24",netmask="255.255.0.0",gateway="10.51.0.1"} -- Definizione dei parametri di rete, per dhcp wifi.sta.getip() senza dichirazione dei parametri | ||
+ | wifi.sta.setip(cfg) -- Settaggio dei parametri di connessione | ||
+ | wifi.sta.autoconnect(1) -- Setup di autoconnessione, non so se sia necessario | ||
+ | led1 = 3 -- I due GPIO porati sul connettore corrispondono ai pin 3 e 4 | ||
+ | led2 = 4 | ||
+ | ora=tmr.now(); -- Mi segno l'ora di startup (uptime) | ||
+ | gpio.mode(led1, gpio.OUTPUT) -- Setup dei pin in output | ||
+ | gpio.mode(led2, gpio.OUTPUT) | ||
+ | |||
+ | tmr.alarm(0, 10000, 1, function() -- Setup del timer 0 ogni 10000msecondi si ripete (1) quando il timer scatta viene eseguita la funzione di seguito | ||
+ | if ( tmr.now() > ora + 60000000 )then -- Se sono passati 60 secondi dall'ultimo comando via web entrambi i GPIO vengono settati a zero | ||
+ | gpio.write(led1, gpio.LOW); -- questo serve per evitare che le valvole rimangano aperte se la connettività wifi viene cade | ||
+ | gpio.write(led2, gpio.LOW); | ||
+ | print "Timeout - OFF all relays" -- Messaggio di avviso su connessione seriale quando scatta il timer | ||
+ | end | ||
+ | wifi_status=wifi.sta.status() -- Controllo lo stato della connessione wifi e in base al valore stampo su seriale le info | ||
+ | if (wifi_status==0) then | ||
+ | print "STATION_IDLE: OK" | ||
+ | elseif (wifi_status==1) then | ||
+ | print "STATION_CONNECTING...." | ||
+ | elseif (wifi_status==2) then | ||
+ | print "STATION_WRONG_PASSWORD: KO" | ||
+ | elseif (wifi_status==3) then | ||
+ | print "STATION_NO_AP_FOUND: KO" | ||
+ | elseif (wifi_status==4) then | ||
+ | print "STATION_CONNECT_FAIL: KO" | ||
+ | elseif (wifi_status==5) then | ||
+ | print "STATION_GOT_IP: OK" | ||
+ | end | ||
+ | end) | ||
+ | |||
+ | srv=net.createServer(net.TCP) -- Creo un server TCP | ||
+ | srv:listen(80,function(conn) -- Metto in ascolto il server sulla porta 80 (web) | ||
+ | conn:on("receive", function(client,request) -- Attendo richiesta dati da un client web | ||
+ | local buf = ""; | ||
+ | local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP"); | ||
+ | if(method == nil)then | ||
+ | _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP"); | ||
+ | end | ||
+ | local _GET = {} | ||
+ | if (vars ~= nil)then | ||
+ | for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do | ||
+ | _GET[k] = v | ||
+ | end | ||
+ | end | ||
+ | buf = buf.."<h1> Irrigazione </h1>"; -- Invio al client una semplice pagina web con due pulsanti per accendere o spegnere le elettrovalvole | ||
+ | buf = buf.."<p>Zona1 <a href=\"?pin=ON1\"><button>ON</button></a> <a href=\"?pin=OFF1\"><button>OFF</button></a></p>"; | ||
+ | buf = buf.."<p>Zona2 <a href=\"?pin=ON2\"><button>ON</button></a> <a href=\"?pin=OFF2\"><button>OFF</button></a></p>"; | ||
+ | local _on,_off = "","" | ||
+ | if(_GET.pin == "ON1")then -- Gestione dei request inviati dal client quando vengono premuti i pulsanti sulla pagina web | ||
+ | gpio.write(led1, gpio.HIGH); | ||
+ | ora=tmr.now(); | ||
+ | print(ora); | ||
+ | elseif(_GET.pin == "OFF1")then | ||
+ | gpio.write(led1, gpio.LOW); | ||
+ | elseif(_GET.pin == "ON2")then | ||
+ | gpio.write(led2, gpio.HIGH); | ||
+ | ora=tmr.now(); | ||
+ | print(ora); | ||
+ | elseif(_GET.pin == "OFF2")then | ||
+ | gpio.write(led2, gpio.LOW); | ||
+ | end | ||
+ | client:send(buf); -- Invio al client della variabile buf che contiene la pagina web | ||
+ | client:close(); | ||
+ | collectgarbage(); | ||
+ | end) | ||
+ | end) | ||
+ | </nowiki> | ||
+ | |||
+ | |||
+ | [[File:Irrigazione web.png|300px|thumb|right|Webserver su ESP8266]] |
Versione delle 18:33, 17 mar 2015
Un lusso per tutti quelli che hanno un giardino o magari qualche vaso in terrazza è l'impianto di irrigazione che permette di risparmiare tempo, acqua e soprattutto evitare di dimenticarsi di annaffiare le piante.
Ci sono sicuramente tanti sistemi più o meno creativi, ma ho voluto approfittare del nuovo modulo wifi che sto sperimentando per dedicarmi a fare qualcosa di semplice e possibilmente funzionale.
A fime stagione riporterò eventuali segnalazioni di problemi riscontrati durante il periodo esivo.
Progetto di massima
Due elettrovalvole perchè il giardino è diviso idealmente in due zone, diciamo nord e sud anche perchè richiedono due quantità di acqua diverse.
Utilizzare valvole a 24 Vcc, una tensione non proprio comune tra i miei recuperi, ma qualcosa si trova sempre, per questo basta un trasformatore, per l'occasione ne ho trovato uno da circuito stampato perciò ho dissaldato tutti i componenti inutili.
Due relays uno per il primario del trasformatore ed uno da usare sul secondario per selezionare la valvola da attivare.
Un alimentatore a 5V per alimentare il modulo di comando (che va a 3.3V quindi userò anche uno stabilizzatore dedicato) ed i relè.
Un modulo [ESP8266 ESP8266] ed una rete wifi, magari una rete comunitaria come ad esempio Ninux (questo punto lo vedremo più avanti) o un apparato per una connessione punto punto es: un altro modulo ESP8266 o una chiavetta wifi.
Le valvole andranno posizionate all'esterno mentre la parte sotto tensione va ben protetta.
Codice per il modulo ESP8266
Questo codice è un collage di un pò di cose trovate in giro, e lette sulla documentazione del firmware nodemcu.
Lo scopo è quello di agganganciare il modulo wifi alla rete ninux come client con un ip fisso. Il modulo crea un server web minimale a cui ci si può collegare con pc o telefono o uno script (la soluzione che adotterò io).
Non vorrei però allagare il giardino qualora cadesse la connessione wifi per qualsiasi motivo (magari un restart del modulo per una sovratensione, problemi sulla rete wifi ecc...).
Quindi sfruttando un timer ciclico ogni 60 secondi se non è stato ribadito il comando di on il modulo in automatico spegne l'alimentazione delle elettrovalvole.
Avrei potuto usare il timer semplicemete per disattivare le valvole dopo alcuni minuti di irrigazione, ma prevedo già richieste di modifica sul tempo di apertura e parto già con due zone che richiedono quantità di acqua diverse perciò voglio rendere tutto più flessibile.
Ne ho approfittato per aggiungere qualche istruzione non proprio necessaria, ma che fornisce qualche dato in più e che potrò riutilizzare in futuro
for n,s in pairs(file.list()) do print(n.." size: "..s) end -- Lista dei files presenti in memoria print("Vcc="..(node.readvdd33()/1000).."V") -- Display della tensione di alimentazione del modulo wifi.setmode(wifi.STATION) -- Setup wifi in modalità client wifi.sta.config("NinuxBO","") -- Connessione alla rete Ninux, il parametro lasciato vuoto corrisponde alla password cfg = {ip="10.51.0.24",netmask="255.255.0.0",gateway="10.51.0.1"} -- Definizione dei parametri di rete, per dhcp wifi.sta.getip() senza dichirazione dei parametri wifi.sta.setip(cfg) -- Settaggio dei parametri di connessione wifi.sta.autoconnect(1) -- Setup di autoconnessione, non so se sia necessario led1 = 3 -- I due GPIO porati sul connettore corrispondono ai pin 3 e 4 led2 = 4 ora=tmr.now(); -- Mi segno l'ora di startup (uptime) gpio.mode(led1, gpio.OUTPUT) -- Setup dei pin in output gpio.mode(led2, gpio.OUTPUT) tmr.alarm(0, 10000, 1, function() -- Setup del timer 0 ogni 10000msecondi si ripete (1) quando il timer scatta viene eseguita la funzione di seguito if ( tmr.now() > ora + 60000000 )then -- Se sono passati 60 secondi dall'ultimo comando via web entrambi i GPIO vengono settati a zero gpio.write(led1, gpio.LOW); -- questo serve per evitare che le valvole rimangano aperte se la connettività wifi viene cade gpio.write(led2, gpio.LOW); print "Timeout - OFF all relays" -- Messaggio di avviso su connessione seriale quando scatta il timer end wifi_status=wifi.sta.status() -- Controllo lo stato della connessione wifi e in base al valore stampo su seriale le info if (wifi_status==0) then print "STATION_IDLE: OK" elseif (wifi_status==1) then print "STATION_CONNECTING...." elseif (wifi_status==2) then print "STATION_WRONG_PASSWORD: KO" elseif (wifi_status==3) then print "STATION_NO_AP_FOUND: KO" elseif (wifi_status==4) then print "STATION_CONNECT_FAIL: KO" elseif (wifi_status==5) then print "STATION_GOT_IP: OK" end end) srv=net.createServer(net.TCP) -- Creo un server TCP srv:listen(80,function(conn) -- Metto in ascolto il server sulla porta 80 (web) conn:on("receive", function(client,request) -- Attendo richiesta dati da un client web local buf = ""; local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP"); if(method == nil)then _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP"); end local _GET = {} if (vars ~= nil)then for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do _GET[k] = v end end buf = buf.."<h1> Irrigazione </h1>"; -- Invio al client una semplice pagina web con due pulsanti per accendere o spegnere le elettrovalvole buf = buf.."<p>Zona1 <a href=\"?pin=ON1\"><button>ON</button></a> <a href=\"?pin=OFF1\"><button>OFF</button></a></p>"; buf = buf.."<p>Zona2 <a href=\"?pin=ON2\"><button>ON</button></a> <a href=\"?pin=OFF2\"><button>OFF</button></a></p>"; local _on,_off = "","" if(_GET.pin == "ON1")then -- Gestione dei request inviati dal client quando vengono premuti i pulsanti sulla pagina web gpio.write(led1, gpio.HIGH); ora=tmr.now(); print(ora); elseif(_GET.pin == "OFF1")then gpio.write(led1, gpio.LOW); elseif(_GET.pin == "ON2")then gpio.write(led2, gpio.HIGH); ora=tmr.now(); print(ora); elseif(_GET.pin == "OFF2")then gpio.write(led2, gpio.LOW); end client:send(buf); -- Invio al client della variabile buf che contiene la pagina web client:close(); collectgarbage(); end) end)