Sensore gas con Arduino e ESP
In questo articolo verrà illustrato un progetto che realizza un sensore di gas mediante un arduino nano collegato a un ESP8266. Se il valore rilevato da un sensore MQ2 supera una certa soglia, viene mandato un avviso a Domoticz . La lettura avviene mediante il pin analogico A0.
Il sensore MQ-2 rileva metano e butano. La scheda tecnica completa è possibile leggerla qui MQ-2.
Il sensore è alimentato a 5V e ha un discreto assorbimento. Per questo progetto si è scelto di mettere Arduino e ESP entrambi in deep sleep. Nel caso di Arduino è stata utilizzata la libreria Lowpower che gestisce tutti gli stati a basso consumo .
La chiamata al metodo powerDown(period_t period, adc_t adc, bod_t bod)
spegne Arduino per un determinato periodo di tempo utilizzando il WDT interno.
In particolare
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
spegne Arduino per 8 secondi forzando oltre che lo spegnimento della CPU anche quello degli altri due componenti interni ADC e BOD.
In questa serie di articoli ho già descritto in dettaglio i collegamenti tra ESP e Arduino, in che modo il deep sleep di ESP viene gestito da Arduino. Il flusso di funzionamento del sensore è il seguente: Nel setup ESP viene spento. Di seguito, appena entrato nel loop, Arduino si spegne per 8 secondi. Al suo risveglio legge il valore del sensore e, se sopra soglia, sveglia ESP. Di seguito lo fa connettere al server che ospita Domoticz e quindi invia la stringa per segnalare la rilevazione del gas.
In questo articolo mi soffermerò solo sull’utilizzo della libreria EchoCommands.h
Questa libreria è stata realizzata con lo scopo di facilitare l’invio dei comandi sul collegamento seriale tra ESP e Arduino. Qui ArduinoEchoCommands è possibile scaricare l’intero codice da utilizzare del progetto.
Di seguito le definizioni dei metodi e del costruttore con i relativi parametri.
EchoCommands(HardwareSerial &hserial, SoftwareSerial &sserial, uint32_t baud); void errorHalt(String msg); boolean echoFind(String keyword); void echoFlush(); boolean echoCommand(String cmd, String ack, boolean halt_on_fail); void echoSkip(); void sendWIFIATCommands(String cmd, int t); void wifi_init(String ssid, String pwd); void wakeUpESP(int wakePinESP); void sleepDownESP(unsigned long sleeptime);
Esaminiamo i metodi più importanti che verranno utilizzati nel codice.
La chiamata echoc.wakeUpESP(wakePinESP) si occupa di svegliare ESP eseguendo una successione di alto basso alto sul pin di reset ESP.
Il metodo void wifi_init(String ssid, String pwd); Inizializza la connessione WiFI Il primo parametro è SSID e il secondo la password corrispondente.
La chiamata echoc.sleepDownESP(0); si occupa di spegnere ESP per un tempo indefinito (grazie al valore 0 del parametro passato). In seguito ESP potrà essere risvegliato (o meglio resettato) solo dal metodo precedente.
In generale il metodo echoCommand invia dei comandi sulla seriale che connette ESP ad Arduino mediante la chiamata echoc.echoCommand(cmd, “OK”, CONTINUE)
In seguito alla chiusura della connessione viene inviato un segnale di spegnimento a ESP,
Di seguito il codice completo e qui l’elettronica del progetto.
#include <EchoCommands.h> #include "LowPower.h" #include <SoftwareSerial.h> SoftwareSerial Serial1(8, 9); // RX, TX uint32_t baud = 9600; EchoCommands echoc(Serial, Serial1, 9600); //LOG initialize #define DEST_IP "192.168.1.112" //Domoticz //Gas sensor parameters int smokeA0 = A0; // My threshold value int sensorThres = 200; String ssid="yourssid"; String pwd="yourssidpwd"; const byte wakePinESP = 4; //ESP wake up port arduino-to ESP RST PORT void setup() { pinMode(wakePinESP, OUTPUT); echoc.sleepDownESP(0); } void loop() { // ATmega328P, ATmega168 power down LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); Serial.flush(); int analogSensor = analogRead(smokeA0); Serial.print("Pin A0: "); Serial.println(analogSensor); //Smoke detection //se si sveglia esp e trasmetti if (analogSensor > sensorThres) { echoc.wakeUpESP(wakePinESP); //delay(1000); echoc.wifi_init(ssid,pwd); // Establish TCP connection with domoticz if (!echoc.echoCommand("AT+CIPMUX=1", "OK", CONTINUE)) { echoc.sleepDownESP(0); delay (100); return; } // Establish TCP connection String cmd = "AT+CIPSTART=2,\"TCP\",\""; cmd += DEST_IP; cmd += "\",8080"; if (!echoc.echoCommand(cmd, "OK", CONTINUE)) { echoc.sleepDownESP(0); delay (100); return; } // Build HTTP request. cmd = "GET /json.htm?type=command¶m=switchlight&idx=28&switchcmd=On"; cmd += " HTTP/1.1\r\nHost: "; cmd += "192.168.1.112"; cmd += ":8080\r\n\r\n"; // Send data to domoticz if (!echoc.echoCommand("AT+CIPSEND=2," + String(cmd.length()), ">", CONTINUE)) { //Serial.println("Connection timeout."); echoc.sleepDownESP(0); delay (100); return; } else { // Send the raw HTTP request echoc.echoCommand(cmd, "OK", CONTINUE); // GET to domoticz delay(2000); } //Connection close //Serial.println("ESP8266 A nanna"); echoc.echoCommand("AT+CIPCLOSE=2", "OK", CONTINUE); echoc.sleepDownESP(0); delay (100); echoc.sleepDownESP(0); } }