controllo livello acqua

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");
}

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.

Si, che è fattibile e basta saldare un ponticello

Rimane il problema che il GPIO0 ( anche il GPIO2) deve essere a livello HIGH quando si resetta, altrimenti va in modalita' programmazione

brunello22:
Si, che è fattibile e basta saldare un ponticello

Rimane il problema che il GPIO0 ( anche il GPIO2) deve essere a livello HIGH quando si resetta, altrimenti va in modalita' programmazione

quindi per risvegliarsi non fà altro che resettarsi...ed ovviamente riavrò il problema di gpio0 che ho adesso all'accensione

però leggendo il pinout, potrei utilizzare il pin GPI03 (RX) perchè tanto il seriale non mi interessa.
leggo che non ha problemi di stato per l'avvio ma dà un segnale alto, cosa che dovrei risolvere con una resistenza, dato che io lo mando a massa in presenza di acqua.
corretto?

acuplush:
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");
}

Ciao, partendo dal presupposto che non so le dimensioni della vasca della quale vuoi verificare il livello ti consiglierei invece di usare il sistema dei bulloni che ti avviserebbe esclusivamente nel caso in cui l'acqua viene a mancare, di utilizzare una cella di carico, fai la tara a serbatoio vuoto e sai il livello esatto ancora prima che finisca. Io l'ho fatto per tenere sotto controllo le taniche dello scarico condensa del condizionatore (al contrario di te a me serviva sapere quando era piena) e ho sempre sotto controllo il livello (io ho scelto di averlo in percentuale) e quando arriva al 95% e o non me ne accorgo o son fuori casa mi spegne l'impianto. Il costo è irrisorio, ad esempio qui https://www.amazon.it/half-bridge-amplificatore-HX711-modulo-bilancia-pesapersone/dp/B07FMN1DBN/ref=sr_1_3?__mk_it_IT=ÅMÅŽÕÑ&keywords=celle+di+carico+a+ponte&qid=1585415311&sr=8-3 a 16€ hai le celle e il modulo hx711.
Ciao!!!

ciao, non è una buona soluzione per il mio caso dato che devo controllare se nel sottovaso delle piante carnivore viene a mancare l'acqua (cosa che non deve mai succedere)
con il peso è difficile perchè ci sono troppe variabili (pianta che cresce, insetti mangiati ecc.)
io piazzo i bulloni ad 1cm dal fondo così ho la "riserva" dall'avviso al momento che vado a rabboccare.

ho fatto altre prove e sono riuscito a configurare il GPO3 come input e non mi crea problemi all,avvio sia se è HIGH sia se è LOW.

domani provo a fare il ponticello ed utilizzare lo sleep.
attualmente ora mi consuma dai 200 ai 70mA... non so perchè così tanta differenza restando a riposo...

Ah!!! Ok!!! Vedi, non sapendo cosa dovessi fare ho detto una cazzata.

eccomi qui, ho creato (a fatica) il ponticello e modificato il codice in modo fa farlo stare tutto in "SETUP" però una volta eseguito tutto il setup non si riavvia.
ora non so se è un problema di dove ho messo la voce "ESP.deepSleep (15e6);" o è un problema del mio ponticello.
potreste gentilmente controllare se almeno il codice l'ho scritto giusto?
grazie

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define sensore  3 //sensore controllo acqua
#define intervallo 3000  //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 setup() {
  {
    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");
    delay (intervallo);
  }

  pinMode(sensore, INPUT_PULLUP);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  //---------------------------------------------------------
  if ((digitalRead(sensore) == HIGH) ) //mancanza acqua
  {
    AcquaPiante.publish("Manca Acqua");
    delay (intervallo);
  }

  //------------------------------------------

  if (! mqtt.ping()) {
    mqtt.disconnect();
  }
  //------------------------------------------------------------
  ESP.deepSleep (15e6);  //riposo per 15 secondi
  //----------------------
}

uint32_t x = 0;

void loop() {

}

Il setup viene letto solo una volta all'avvio e poi non più letto.
Le varie istruzioni de devono essere sempre controllate vanno messe in loop.

allora il codice l'ho sistemato e "a banco" tutto funziona.
però ora non funziona "in campo", e non riesco a saltargliene fuori! :confused:

infilando le 2 sonde in acqua non mi và in LOW, mentre se le tocco fra di loro sì.
ho provato a misurare la resistenza delle sonde in acqua e succede una cosa strana... parte da 70K e piano piano và su fino a 200M
però se misuro il voltaggio tra la +3.3v e il filo che torna al GPIO3 (che è quello che rileva lo stato) ho un voltaggio di 3.2v quindi dovrebbe funzionare credo....

potete aiutarmi a capire dovè il problema? grazie

edit:
ho fatto una prova con la scheda "arduino UNO" e fà lo switch con gli elettrodi a circa 5mm di distanza.
con "ESP01S" già ad un mm non funziona... solo se si toccano.

p.s. può essere causa della composizione dell'acqua?
perchè se provo su un bicchiere con acqua di rubinetto funziona senza problemi anche con gli elettrodi distanti, mentre nel sottovaso in cui cè acqua piovana (e nel vaso terra è acida (per piante carnivore)) succede quanto detto sopra.

L'acqua distillata è un isolante, anche se non dei migliori.
La conduttività dell'acqua è data dai sali disciolti in essa.
L'acqua piovana e senza sali.

Arco_500:
L'acqua distillata è un isolante, anche se non dei migliori.
La conduttività dell'acqua è data dai sali disciolti in essa.
L'acqua piovana e senza sali.

eccolo là! quindi progetto da scartare e devo optare per altro, tipo galleggiante...più dificile da creare :roll_eyes:

grazie dell'info