Modulo WiFi+Bt ESP32

Lo farò senz'altro grazie! :wink:

Se non scrivo castronerie....
questo

if (previousMillisWiFi < intervalWiFi)

non va mica, dovrebbe essere

if (millis()- previousMillisWiFi > intervalWiFi)

cioè esattamente lo stesso confronto che fai più sotto.

zoomx:
Se non scrivo castronerie....
questo

if (previousMillisWiFi < intervalWiFi)

non va mica, dovrebbe essere

if (millis()- previousMillisWiFi > intervalWiFi)

cioè esattamente lo stesso confronto che fai più sotto.

Hai ragione scusa non mi ero accorto dell'errore, tant'è che poi in altre funzioni la uso così

void temperature()
{
  if (millis() - t > 5000) //Una volta ogni 5 secondi:
  {
    t = millis();
    sensors.requestTemperatures();
    tempDALLAS = sensors.getTempCByIndex(0);   //Read temperature of Dallas sensor
    //Serial.print(tempDALLAS);
    //Serial.println("° C");
    dht12.get();
    /*
      if (dht12.get() == 0) {
          Serial.print("Temperature in Celsius : ");
          Serial.println(dht12.cTemp);
          Serial.print("Temperature in Fahrenheit : ");
          Serial.println(dht12.fTemp);
          Serial.print("Relative Humidity : ");
          Serial.println(dht12.humidity);
          Serial.println();
        }*/
  }
}

Ed è proprio per quella svista che molto probabilmente non andava. Maledetta fretta accompagnata dalla distrazione! :confused: :-[ :-X

Infatti ho anche scritto che in un altro punto il confronto è corretto, che è anche quello che avevo visto per primo per cui non riuscivo a capire dove fosse l'inghippo.

zoomx:
Infatti ho anche scritto che in un altro punto il confronto è corretto, che è anche quello che avevo visto per primo per cui non riuscivo a capire dove fosse l'inghippo.

In realtà il mio quesito sul poter utilizzare più variabili per millis in una ESP (cosa che faccio comunemente con le altre board) derivava dal fatto che non riesco a sostituire la riga delay(6000) dalla void T_Setting() con millis

void Touch()
{
  // Pressed will be set true is there is a valid touch on the screen
  pressed = tft.getTouch(&px, &py);

  if (!mute) drawBmp("/bmp/audio-on.bmp", 285, 200);
  else drawBmp("/bmp/audio-off.bmp", 285, 200);

  if (pressed) {
    buzzer();
    // Verifico Home
    if ((px > 0) && (px < 30)) {
      if ((py > 200) && (py <= 239)) {
        Serial.println("Hai premuto il tasto HOME");
        // buzzer();
        tft.fillScreen(TFT_BLACK);
        scelta = 0;
        Maschera();
        Home();
      } // END 2° if Home
    } //END 1° if Home

    // Verifico WPS
    if ((px > 290) && (px < 319)) {
      if ((py > 90) && (py <= 130)) {
        Serial.println("Hai premuto il tasto WPS");
        tft.fillScreen(TFT_BLACK);
        wps();
      }// END 2° if WPS
    }// END 1° if WPS

    // Verifico Audio
    if ((px > 290) && (px < 319)) {
      if ((py > 200) && (py <= 239)) {
        silenzia();
        buzzer();
        Serial.println("Hai premuto il tasto Audio");
      }// END 2° if Audio
    }// END 1° if Audio

    // Verifico Setting
    if ((px > 144) && (px < 174)) {
      if ((py > 200) && (py <= 239)) {
        Serial.println("Hai premuto il tasto Setting");
        tft.fillScreen(TFT_BLACK);
        scelta = 1; // Menù Setting
      }// END 2° if Setting
    }// END 1° if Setting

    delay(100);

    Serial.print("px = ");
    Serial.print(px);
    Serial.print(", py = ");
    Serial.println(py);
  } //END (pressed)
  px = 0, py = 0; // resetto i valori di px e py
} //END Void Touch()

void Exit()
{
  // Pressed will be set true is there is a valid touch on the screen
  pressed = tft.getTouch(&px, &py);
  drawBmp("/bmp/home.bmp", 144, 200);
  if (pressed) {

    // Verifico Home
    if ((px > 144) && (px < 30)) {
      if ((py > 200) && (py <= 239)) {
        Serial.println("Hai premuto il tasto HOME");
        tft.fillScreen(TFT_BLACK);
        Home();
      }// END 2° if Home
    }// END 1° if Home

    delay(100);

    Serial.print("x = ");
    Serial.print(px);
    Serial.print(", y = ");
    Serial.println(py);
  } //END (istouched)

} //END Void Exit()

void T_Setting()
{
  // Pressed will be set true is there is a valid touch on the screen
  pressed = tft.getTouch(&px, &py);
  if (pressed) {
    buzzer();
    EasyBuzzer.update();

    if (KeyValvola) {
      //buzzer();
      // EasyBuzzer.update();
      // Verifico Apertura Valvola
      if ((px > 100) && (px < 230)) {
        if ((py > 40) && (py <= 170)) {
          Serial.println("Hai premuto il tasto APRI VALVOLA");
        }// END 2° if Apertura Valvola
      }// END 1° if Apertura Valvola
    } //END (KeyValvola)
    else
      Serial.println("Non faccio nulla");

    // Verifico Valvola
    if ((px > 100) && (px < 134)) {
      if ((py > 200) && (py <= 239)) {
        Serial.println("Hai premuto il tasto Valvola");
        tft.fillScreen(TFT_BLACK);
        drawBmp("/bmp/Bvalve.bmp", 110, 50);
        KeyValvola = true;
        Serial.println("KeyValvola = true");
        //scelta = 1; // Menù Setting
      }// END 2° if Valvola
    }// END 1° if Valvola


    // Verifico Info
    if ((px > 144) && (px < 174)) {
      if ((py > 200) && (py <= 239)) {

        Serial.println("Hai premuto il tasto Info");

        tft.fillScreen(TFT_BLACK);
        spr.createSprite(315, 100);   // Creo lo sprite 150 pixels di lunghezza e 100 di altezza
        spr.fillSprite(TFT_BLACK);
        spr.setTextColor(TFT_WHITE);
        x = 1;
        y = 1;
        spr.setCursor(x, y);
        x += spr.drawString("ArduAcquario MALAWI V.", x , y, 2);
        x += spr.drawString((Version), x , y, 2);
        x = 1;
        y = y + 20;
        x += spr.drawString("By Ettore Di Fabio ", x , y, 2);
        x += spr.drawString((date_Version), x , y, 2);
        x = 1;
        y = y + 20;
        if (WiFi.status() != WL_CONNECTED) {
          spr.setTextColor(TFT_RED, TFT_BLACK);
          x += spr.drawString("NON CONNESSO", x , y, 4);
        }
        else
        {
          x += spr.drawString("Connesso a: ", x , y, 2);
          x += spr.drawString(WiFi.SSID(), x , y, 2);
          y = y + 20;
          x = 1;
          x += spr.drawString("IP Address: ", x , y, 2);
          // x = 10;
          // y = y + 30;
          x += spr.drawString(WiFi.localIP().toString(), x , y, 2);
        }
        spr.pushSprite(50, 70); // Posiziono la scritta
        spr.deleteSprite(); // Libero la memoria
        EasyBuzzer.update();
        delay(6000);
        tft.fillScreen(TFT_BLACK);
        scelta = 0;
        Maschera();
        Home();
      }// END 2° if Info
    }// END 1° if Info

    // Verifico Power
    if ((px > 184) && (px < 218)) {
      if ((py > 200) && (py <= 239)) {
        tft.fillScreen(TFT_BLACK);
        Serial.println("Hai premuto il tasto Power");
        x = 100;
        x += tft.drawString("RIAVVIO", x , 110, 4);

        for (int i = 0; i < 3; i++)
        {
          EasyBuzzer.update();
          delay(1000);
          x += tft.drawString(".", x , 110, 4);
        }
        ESP.restart(); // Riavvio
        //scelta = 1; // Menù Setting
      }// END 2° if Power
    }// END 1° if Power
    delay(100);
  } //END (istouched)
} //END Void Setting()

Questo spezzone di codice non è definitivo e ci sto ancora lavorando per fargli fare alcune cose :wink:

Quando devi fare più cose devi anche pensare diversamente il programma, questo perché il decidere cosa fare a secondo del tempo trascorso alla fine deve essere centralizzato in qualche modo.
Ad esempio l'apparizione di un messaggio per un certo intervallo (quello del delay(6000) se non ho capito male) dovrebbe diventare una funzione a parte, generica ed utilizzabile dal resto del programma e cheappartiene ad un ciclo di cose che possono essere eseguite in dipendenza, ad esempio, da un flag.
Oppure ti crei o usi un task scheduler, Guglielmo, se non ricordo male, ne ha realizzato uno ma ce ne sono tanti.

zoomx:
Oppure ti crei o usi un task scheduler, Guglielmo, se non ricordo male, ne ha realizzato uno ma ce ne sono tanti.

Questa la devo studiare meglio perchè non ci ho mai provato. Avevo pensato di usare il "case" ma devo ancora capire come strutturarlo.

zoomx:
Oppure ti crei o usi un task scheduler, Guglielmo, se non ricordo male, ne ha realizzato uno ...

Non mi piace fare pubblicità, comunque SI. Si tratta di un semplicissimo ma efficiente "scheduler cooperativo" ed è stato pubblicato sul numero 229 di Ottobre 2018 di Elettronica In ...

Guglielmo

P.S.: ... dato che è passato un po' di tempo, ho già chiesto che lo rendano fruibile gratuitamente a tutti in formato .pdf scaricabile dal sito (... occorrerà solo registrarsi se già non lo si è). E solo questione dei necessari tempi tecnici ... :wink:

Buona domenica, torno a bomba con le domande :smiling_imp:

Ho provato a collegare sia un relè singolo (cinese) che un modulo con doppio relè optoisolato. Quello singolo non ne vuol sapere di eccitarsi mentre sul doppio se ne eccita uno solo. Presumo quindi che i 3V della ESP non siano sufficienti.
Ora prevedendo di mettere un piccolo alimentatore switch a 12V esterno che userò per accendere delle ventole ed una elettrovalvola, mi consigliate di alimentare il relè con l'alimentatore esterno per risolvere il problema?

Io ho usato lo shield con relais per Wemos D1 mini e funziona benissimo. Credo però che il relè sia alimentato dalla linea a 5V mentre la logica sia a 3.3V. C'è anche il relè doppio se non ricordo male.
Sopra il relè ci dovrebbe essere scritta la tensione di eccitazione, se è da 5V dargliene 12 non credo faccia bene.

Devo leggere bene e poi ti faccio sapere.
La cosa strana è che quello cinese non ne vuol sapere di eccitarsi (si accende solo il led rosso) mentre l'altro, se collego solo un relè alla ESP non ho problemi ma, se collego entrambi i PIN alla ESP fa lo stesso difetto del cinese.
Presumo non siano sufficienti i 3V ad eccitarli entrambi.
Che tu sappia, è possibile prendere la 5V dall'ingresso della ESP (e come) se alimentato tramite porta USB? (Uso una LOLIN D32 Pro)


Non è chiarissimo ma sospetto che il piedino USB sia quello con i 5V dell'USB

Questi schemi della pagina ufficiale li consulto continuamente ma, non essendo un elettrotecnico, volevo il parere di un esperto. :wink:

Ma io non sono né un esperto nè un elettrotecnico!

Beh ... basta fare un piccolo sforzo ... cercare lo schema ... :wink:

Lo SCHEMA è pubblico e basta andarlo a guardare per vedere che quel pin (JP1 - 15) è direttamente collegato al VBUS della USB, ovvero ai 5V che arrivano direttamnete dalla porta USB senza passare attraverso a null'altro. :slight_smile:

Guglielmo

gpb01:
Beh ... basta fare un piccolo sforzo ... cercare lo schema ... :wink:

Lo SCHEMA è pubblico e basta andarlo a guardare per vedere che quel pin (JP1 - 15) è direttamente collegato al VBUS della USB, ovvero ai 5V che arrivano direttamnete dalla porta USB senza passare attraverso a null'altro. :slight_smile:

Guglielmo

Perdona l'ignoranza (che in tale materia è davvero tanta) quindi potrei collegare direttamente il +5 del modulo relè ai pin USB o BAT(PIN 15 e 16) della LOLIN? :money_mouth_face:

... devi usare il pin USB, lascia stare il pin BAT :wink:

Ovviamnete la scheda deve essere alimentata tramite la USB !

Guglielmo

Grazie! :wink: Peccato che non ci sono gli smiles con i cuoricini come in WhatsApp :grinning:

Non so quanto "validi" siano, comunque volevo segnalare che DF Robot ha pubblicato una lunga serie di tutorials su ESP32 QUI ... provate a darci un'occhiata, magari trovate qualche cosa di interessante. :wink:

Guglielmo

Lo sapremo solo leggendoli. Grazie Guglielmo!