Dopo aver installato il firmware NodeMCU sull’ESP8266 è tempo di testarlo con uno script in Lua che sfrutti sia le capacità di comunicazione con sensori, sia le capacità di comunicazione WIFI della scheda.
Quale miglior occasione per misurare la temperatura interna della mia automobile nelle calde giornate di Giugno durante la sosta nel parcheggio del mio luogo di lavoro?
Hardware
Per realizzare questa semplice scheda io ho usato i seguenti componenti:
- ESP8266 nella versione ESP-01 più che sufficiente per il progetto
- Sensore di temperatura/umidità DHT22 (eventualmente si può utilizzare l’impreciso DHT11)
- Per l’alimentazione io ho optato per un alimentatore a 5v (USB) + un convertitore 5v-3.3V montato direttamente sulla board
- Il circuito è stato montato sulla board proto5x5_rocket_dpcb di Dirty PCB
Firmware – https://github.com/valerio-vaccaro/nodemcu-lua-scripts/tree/master/car_monitor
La board è stata programmata mediante il firmware NodeMCU e sono stati aggiunti due script:
- init.lua – esegue semplicemente il file dht22_mqtt_car.lua (NodeMCU esegue automaticamente init.lua una volta che la board è stata correttamente avviata)
1 2 |
-- Execute the script dofile("dht22_mqtt_car.lua") |
- dht22_mqtt_car.lua – effettua una serie di operazioni per assicurare la connessione e l’invio dei campioni di temperatura ed umidità:
- si connette alla WIFI disponibile (e continua a controllare la connessione)
- si connette al server MQTT corrispondente (in funzione della WIFI attualmente connessa)
- si sottoscrive alla coda /temp/random (per ora i messaggi ricevuti vengono semplicemente stampati)
- ogni 30 secondi legge temperatura ed umidità dal sensore DHT22
- crea un messaggio JSON sulla base dei dati letti
- invia il messaggio JSON sulla coda /esp8266/car
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 |
---[ WIFI configuration ]--- WIFISSID={"SSID_1", "SSID_2"} WIFIPASS={"password_1","password_2"} ---[ MQTT configuration ]--- MQTTIP={"mqtt_server_1","mqtt_server_2"} MQTTPORT={1883,1883} wifi.setmode(wifi.STATION) wifi.sta.config(WIFISSID[1], WIFIPASS[1]) print(wifi.sta.getip()) m = mqtt.Client("esp8266_lua_dht22_car", 120, "guest", "guest") ---[ Local variables ]--- tempc=0 sf = 0 humi="XX" temp="XX" fare="XX" bimb=1 PIN = 4 -- data pin for DHT22, GPIO2 toggleWIFI=0 m:on("offline", function(con) print ("Checking MQTT server") connectionCheck() print(node.heap()) end) m:on("message", function(conn, topic, data) print(topic .. ":" ) if data ~= nil then print(data) end end) ---[ Pub_DHT22: read data from DHT22 and send MQTT message ]--- function Pub_DHT22() if sf == 0 then sf = 1 ReadDHT22() m:publish("/esp8266/car",'{"temperature":'..tempc..',"humidity":'..humc..'}',0,0, function(conn) sf = 0 end) end end ---[ ReadDHT22: load DHT22 module and read sensor ]--- function ReadDHT22() dht22 = require("dht22") dht22.read(PIN) t = dht22.getTemperature() h = dht22.getHumidity() humi=(h/10) temp=(t/10) tempc=temp humc=humi print("Humidity: "..humi.."%") print("Temperature: "..tempc.." deg C") -- release module dht22 = nil package.loaded["dht22"]=nil end ---[ connectionCheck: check connection and round robin on configured wireless network ]--- function connectionCheck() tmr.stop(5) if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then m:connect(MQTTIP[toggleWIFI+1], MQTTPORT[toggleWIFI+1], 0, function(conn) print("connected") m:subscribe("/temp/random",0, function(conn) tmr.alarm(3, 30000, 1, Pub_DHT22) end) end) else toggleWIFI = (toggleWIFI+1)%2 print("toggleWIFI"..toggleWIFI.." ,WIFISSID[toggleWIFI+1]"..WIFISSID[toggleWIFI+1].." ,WIFIPASS[toggleWIFI+1]"..WIFIPASS[toggleWIFI+1]) wifi.sta.config(WIFISSID[toggleWIFI+1], WIFIPASS[toggleWIFI+1]) tmr.alarm(5,5000,1,connectionCheck) print("Retry!!") end end tmr.alarm(5,5000,1,connectionCheck) -- check connection every 5 seconds |
Per caricare gli script ho usato l’ottimo tool multipiattaforma ESPlorer ed ho usato la piattaforma Node-RED per ricevere i dati da MQTT, filtrarli spedendo poi il risultato a EmonCMS per la storicizzazione e la rappresentazione grafica.
Facile ed economico!!!
Permalink
Ciao, molto interessante il tuo progetto, vorrei provare a realizzarlo, ma non ho capito il discorso mqtt, in pratica poi come fai a visualizzare i dati? Citi node-red ed emonCMS, non è che potresti spiegare meglio anche quest’ultimo passaggio? Grazie ancora, ciao
Angelo
Permalink
Ciao Angelo,
i dati vengono spediti dalla scheda con il protocollo MQTT (http://mqtt.org/) verso il broker MQTT. Node-RED non fa altro che ricevere i dati dal broker (dalla stessa coda impostata sullo script Lua), formattarli e spedirli al nodo EmonCMS (https://www.npmjs.com/package/node-red-node-emoncms)
, questi non fa altro che tradurre il messaggio in una richiesta HTTP secondo le API di Emoncms.
I dati sono quindi trasportati con MQTT, elaborati con Node-RED, storicizzati e presentati da EmonCMS.
Ciao,
Valerio
Permalink
Salve, non so se mi può’ aiutare, ho compilato la lista come da all’ allegato, ma a me mi da due errori nella linea 26 è 32, come avrà’ capito non ci capisco niente di programmazione, sarebbe così gentile di sbrogliare questo nodo? La ringrazio in anticipo della sua cortese attenzione. Luciano
Permalink
Ciao, premetto che non ci capisco niente, ma sto imparando. Ho copiato lo script per misurare la temperatura con il modulo ESP8266-01 ma mi da due errori nella riga 26 e 32, dopo averne risolti tanti di spazi tra le varie righe, questo è’ il primo problema, subito dopo devo sostituire dht22 con un dht11, le chiederei se basta solamente sostituire il numero in tutto lo script o bisogna riscrivere in qualche altra maniera. Per informazione dopo tanto tempo sono riuscito a fare quello che ha scritto all’inizio di questo articolo.
La ringrazio in anticipo del tempo che perderà’ per aiutarmi. Comunque vada le faccio i complimenti per tutto quello che sta facendo per chi deve imparare. Saluti Luciano
Permalink
Ciao Luciano,
quelle righe (26 e 32) sono quelle per la connessione a MQTT, che broker MQTT stai usando? Mosquitto per caso?
Che versione del firmware di nodeMCU?
Per la sostituzione del dht22 con dht11 basta sostituire la riga
dht22 = require(“dht22”)
con
dht22 = require(“dht11”).
Fammi sapere se fai progressi e buon divertimento.
Valerio
Permalink
salve,
i l programma mi da due errori nella riga 26 e32 mi puo aiutare?
sono alle prime armi e non ci capisco niente.
grazie