ciao, rieccomi qui con un nuovo progetto.
utilizzo due bulloni immersi in acqua per controllare quando viene a mancare (il circuito si interrompe).
uno collegato a gnd e l'altro a gpo0 dell'ESP01s impostato come "input_pullup".
mi sono già reso conto che devo stare attento ad accenderlo con le sonde fuori dall'acqua altrimenti và in qualche modalità che non funziona.
avevo anche provato a collegarlo su gpo2 con lo stesso risultato ed in più mi si accende il led, quindi non mi va bene per un fatto di consumi.
per cominciare a capire se tutto funziona ho creato il loop con un controllo ogni 2,5 secondi e tutto funziona, ovvero mi invia il segnale al broker Adafruit.
dato che dovrò alimentarlo a batterie ora voglio abbassare al minimo i consumi.
la mia idea è tenerlo sempre il sleepmode, e quando sente una variazione al pin gpo0 , si riattiva,si collega al wifi, mi manda il segnale al broker e poi torna in sleepmode.
come idea è fattibile?
ho già fatto una ricerca che l'ESP01s di standard non ha lo sleepmode, ma faccendo un ponticello artigianale si riesce ad attivare.
ecco il codice:
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
//#define DEBUG //decommentare per attivare la scrittura su seriale per PC
#define sensore 0 //sensore controllo acqua
#define intervallo 2500 //tempo tra 2 letture in millisecondi (MODIFICABILE A PIACIMENTO)
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "***"
#define WLAN_PASS "***"
/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 // use 8883 for SSL
#define AIO_USERNAME "***"
#define AIO_KEY "***"
/************ Global State (you don't need to change this!) ******************/
// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
/****************************** Feeds ***************************************/
// impostazioni feed in ricezione o trasmissione
Adafruit_MQTT_Publish StatoConnessione = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/stato-connessione");
Adafruit_MQTT_Publish AcquaPiante = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/acqua_piante");
/*************************** Sketch Code ************************************/
void MQTT_connect();
void setup() {
pinMode(sensore, INPUT_PULLUP);
#ifdef DEBUG
Serial.begin(9600, SERIAL_8N1, SERIAL_TX_ONLY); // inizializzo la comunicazione seriale
#endif
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
uint32_t x = 0;
void loop() {
MQTT_connect();
//-----------------------------------------------
if ((digitalRead(sensore) == HIGH) ) //mancanza acqua
{
AcquaPiante.publish("Manca Acqua");
#ifdef DEBUG
Serial.println ("manca acqua");
#endif
}
delay (intervallo);
//------------------------------------------
if (! mqtt.ping()) {
mqtt.disconnect();
}
}
//--------------------------------------------------------------------
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
while (1);
}
}
StatoConnessione.publish("Domotica Connessa");
}