Differenze tra le versioni di "Impianto di irrigazione"
(3 versioni intermedie di 2 utenti non mostrate) | |||
Riga 6: | Riga 6: | ||
=== Progetto di massima === | === Progetto di massima === | ||
+ | |||
+ | |||
+ | {| cellpadding="20" cellspacing="0" border="1" | ||
+ | |[[File:Irrigazione schema.png|500px|thumb|left|Schema elettrico di massima]] | ||
+ | |[[File:Trasformatore.jpg|200px|thumb|right|Trasformatore]] | ||
+ | |[[File:Irrigazione web.png|300px|thumb|right|Webserver su ESP8266]] | ||
+ | |} | ||
+ | |||
Due elettrovalvole perchè il giardino è diviso idealmente in due zone, diciamo nord e sud anche perchè richiedono due quantità di acqua diverse. | Due elettrovalvole perchè il giardino è diviso idealmente in due zone, diciamo nord e sud anche perchè richiedono due quantità di acqua diverse. | ||
Riga 11: | Riga 19: | ||
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. | ||
− | |||
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 21: | Riga 28: | ||
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. | ||
− | + | ||
---- | ---- | ||
Riga 27: | Riga 34: | ||
=== Codice per il modulo ESP8266 === | === Codice per il modulo ESP8266 === | ||
+ | |||
+ | Archivio codice: [https://github.com/raspibo/ESP8266 Raspibo/ESP8266] | ||
Questo codice è un collage di un pò di cose trovate in giro, e lette sulla documentazione del firmware nodemcu. | Questo codice è un collage di un pò di cose trovate in giro, e lette sulla documentazione del firmware nodemcu. | ||
Riga 40: | Riga 49: | ||
Ne ho approfittato per aggiungere qualche istruzione non proprio necessaria, ma che fornisce qualche dato in più e che potrò riutilizzare in futuro | Ne ho approfittato per aggiungere qualche istruzione non proprio necessaria, ma che fornisce qualche dato in più e che potrò riutilizzare in futuro | ||
− | < | + | <pre style="overflow:auto"> |
+ | |||
for n,s in pairs(file.list()) do print(n.." size: "..s) end -- Lista dei files presenti in memoria | 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") | + | print("Vcc="..(node.readvdd33()/1000).."V") |
wifi.setmode(wifi.STATION) -- Setup wifi in modalità client | wifi.setmode(wifi.STATION) -- Setup wifi in modalità client | ||
wifi.sta.config("NinuxBO","") -- Connessione alla rete Ninux, il parametro lasciato vuoto corrisponde alla password | wifi.sta.config("NinuxBO","") -- Connessione alla rete Ninux, il parametro lasciato vuoto corrisponde alla password | ||
Riga 53: | Riga 63: | ||
gpio.mode(led1, gpio.OUTPUT) -- Setup dei pin in output | gpio.mode(led1, gpio.OUTPUT) -- Setup dei pin in output | ||
gpio.mode(led2, gpio.OUTPUT) | gpio.mode(led2, gpio.OUTPUT) | ||
+ | gpio.write(led1, gpio.LOW) | ||
+ | gpio.write(led2, gpio.LOW) | ||
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 | 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 | ||
Riga 58: | Riga 70: | ||
gpio.write(led1, gpio.LOW); -- questo serve per evitare che le valvole rimangano aperte se la connettività wifi viene cade | 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); | gpio.write(led2, gpio.LOW); | ||
− | print "Timeout - OFF all relays" -- Messaggio di avviso su connessione seriale quando scatta il timer | + | print "Timeout - OFF all relays." -- Messaggio di avviso su connessione seriale quando scatta il timer |
end | end | ||
wifi_status=wifi.sta.status() -- Controllo lo stato della connessione wifi e in base al valore stampo su seriale le info | wifi_status=wifi.sta.status() -- Controllo lo stato della connessione wifi e in base al valore stampo su seriale le info | ||
Riga 97: | Riga 109: | ||
gpio.write(led1, gpio.HIGH); | gpio.write(led1, gpio.HIGH); | ||
ora=tmr.now(); | ora=tmr.now(); | ||
− | |||
elseif(_GET.pin == "OFF1")then | elseif(_GET.pin == "OFF1")then | ||
gpio.write(led1, gpio.LOW); | gpio.write(led1, gpio.LOW); | ||
Riga 112: | Riga 123: | ||
end) | end) | ||
end) | end) | ||
− | |||
− | [[File: | + | </pre> |
+ | |||
+ | === Realizzazione === | ||
+ | |||
+ | |||
+ | {| cellpadding="20" cellspacing="0" border="1" | ||
+ | |[[File:IMG 20150329 160953.jpg|300px|thumb|left|Montaggio in scatola stagna]] | ||
+ | |[[File:IMG 20150330 180135.jpg|300px|thumb|right|Protezione della zona a tensione maggiore]] | ||
+ | |[[File:IMG_20150406_085932.jpg|300px|thumb|right|Elettrovalvole e assemblaggio idraulico]] | ||
+ | |[[File:IMG 20150406 085946.jpg|300px|thumb|right|Assemblaggio finale]] | ||
+ | |||
+ | |} | ||
+ | |||
+ | === Archvio documentazione === | ||
+ | |||
+ | [https://github.com/raspibo/ESP8266/tree/master/scripts/irrigazione Qui] | ||
+ | |||
+ | |||
+ | [[Category:Progetti]] |
Versione attuale delle 12:45, 14 dic 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
Archivio codice: Raspibo/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") 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) gpio.write(led1, gpio.LOW) gpio.write(led2, gpio.LOW) 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(); 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)