Rendere più "reattivo" lo sketch

Buongiorno a tutti,
ho creato uno sketch per una piccola automazione utilizzando un modulo ESP32 e Telegram.
E' tutto funzionante, però lo vedo a vole poco reattivo.

Capita di avere dei ritardi nel ricevere messaggi o nel leggere l'ingresso, oppure a volte capita di ricevere messaggi doppi dopo una richiesta.

Non so se questo sia dovuto al sistema (ESP32/Telegram) oppure se il mio sketch non è ben ottimizzato.
Grazie a chi mi risponderà
Alessandro

#include <WiFi.h> //libreria per il wifi 
#include <WiFiClientSecure.h> //libreria per il wifi
#include <UniversalTelegramBot.h> //libreria per telegram
#include <ArduinoJson.h>

#define WIFI_SSID "xxx" //nome wifi
#define WIFI_PASSWORD "xxx" //password wifi
#define BOT_TOKEN "xxx" //token chatbot telegram
#define CHAT_ID "xxx"

#define uscita_aux 21 //output
#define led_rosso 25 //output
#define sensore_namur 27 //input - sensore NAMUR

int namurState = 0; //memorizzo il valore del NAMUR
int lastNamurState = 0; //memorizzo l'ultimo valore del NAMUR

String chat_id;
boolean mycid = false;

WiFiClientSecure secured_client; //wifi client
UniversalTelegramBot bot(BOT_TOKEN, secured_client); //telegram client

void setup() {
  pinMode(uscita_aux, OUTPUT);
  pinMode(led_rosso, OUTPUT);
  pinMode(sensore_namur, INPUT);

  Serial.begin(115200); //inizializzo la seriale (115200 baudrate)
  Serial.println(); //debug su seriale

  Serial.print("Connetto alla rete wifi "); //debug su seriale
  Serial.print(WIFI_SSID); //debug su seriale
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD); //connetto al wifi
  secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); //connetto a Telegram utilizzando un certificato di sicurezza

  while (WiFi.status() != WL_CONNECTED) { //fino a quando il wifi non è connesso attendi
    Serial.print("."); //debug su seriale
    delay(500);
  }
  Serial.print("\nWifi connesso. Indirizzo IP: "); //debug su seriale
  Serial.println(WiFi.localIP()); //debug su seriale
}

unsigned long t1;

void loop() {

  //controllo messaggi
  if ((millis() - t1) > 1000) {        
    t1 = millis();  

    //verifica di telegram
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    while (numNewMessages) {
      Serial.println("ci sono messaggi");
      handleNewMessages(numNewMessages);
      handleNewMessages2(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
  } 

  //se ha ricevuto il comando "attiva_namur" vado a verificare lo stato del namur, se il namur cambia stato metto aux HIGH
  
  namurState = digitalRead(sensore_namur);
  
  if (mycid == true) {

      if (namurState == HIGH) {
      digitalWrite(uscita_aux, HIGH); 
     }
        if (lastNamurState == 0 && namurState == 1 || lastNamurState == 1 && namurState == 0) { //mando un messaggio solo al cambio di stato del namur
        lastNamurState = namurState;
        bot.sendMessage(chat_id, "RILEVATA ANOMALIA", "");
      }
    }

    if (mycid == false) {
    digitalWrite(uscita_aux, LOW);
    }
  }

void handleNewMessages(int numNewMessages) { //funzione per la gestione della chat telegram
  for (int i = 0; i < numNewMessages; i++) {
      String chat_id = bot.messages[i].chat_id; //id della chat
      String text = bot.messages[i].text; //l'utente invia del testo in chat
      String from_name = bot.messages[i].from_name; //chi manda il messaggio

      if (from_name == "")
      from_name = "Utente non autorizzato"; //utente sconosciuto

    if (text == "/menu") { //se il testo ricevuto è /menu visualizzo la lista dei comandi
      String welcome = "Menu\n";
      welcome += "\n";
      welcome += "Lista dei comandi:\n";
      welcome += "/stato_in_out\n";
      welcome += "/attiva_namur\n";
      welcome += "/disattiva_namur\n";
      welcome += "/uscita_aux_ON\n";
      welcome += "/uscita_aux_OFF\n";
      welcome += "/ledrosso_ON\n";
      welcome += "/ledrosso_OFF\n";
      welcome += "\n";
      bot.sendMessage(chat_id, welcome);
    }

    if (text == "/uscita_aux_ON") { //se il testo ricevuto è uscita_aux_ON attiva manualmente l'uscita aux ***** FUNZIONA SOLO SE ABBIAMO ATTIVATO IL NAMUR *****
      bot.sendMessage(CHAT_ID, "aux attivo","");
      digitalWrite(uscita_aux, HIGH); 
    }

    if (text == "/uscita_aux_OFF") { //se il testo ricevuto è uscita_aux_OFF disattiva manualmente l'uscita aux
     bot.sendMessage(CHAT_ID, "aux disattivato","");
     digitalWrite(uscita_aux, LOW);
    }

    if (text == "/ledrosso_ON") { //se il testo ricevuto è ledrosso_ON allora accendi il LED rosso
      bot.sendMessage(CHAT_ID, "Il led rosso è acceso","");
      digitalWrite(led_rosso, HIGH);
    }

    if (text == "/ledrosso_OFF") { //se il testo ricevuto è ledrosso_OFF allora spegni il LED rosso
     bot.sendMessage(CHAT_ID, "Il led rosso è spento","");
     digitalWrite(led_rosso, LOW);
    }
    
    //vado a leggere i GPIO dopo che viene inviata una richiesta "stato"
    if (text == "/stato_in_out") {
      int stato_aux = digitalRead(uscita_aux);
      int stato_led_rosso = digitalRead(led_rosso);
      int stato_namur = digitalRead(sensore_namur);
      String msg_verde = String(stato_aux);
      String msg_rosso = String(stato_led_rosso);
      String msg_sensore = String(stato_namur);
      bot.sendMessage(CHAT_ID, "aux " + msg_verde, "");
      bot.sendMessage(CHAT_ID, "led rosso " + msg_rosso, "");
      bot.sendMessage(CHAT_ID, "namur " + msg_sensore, "");
    } 
  }
}
void handleNewMessages2(int numNewMessages){
    for (int i = 0; i < numNewMessages; i++){  
    String text = bot.messages[i].text;
    
    //attivo/disattivo il sensore namur
    if (text == "/attiva_namur") {
      mycid = true;  
      chat_id = bot.messages[i].chat_id;
      bot.sendMessage(chat_id, "namur attivo", "");
      Serial.println("namur pronto"); 
      }
    
       if (text == "/disattiva_namur") {
      mycid = false;  
      chat_id = bot.messages[i].chat_id;
      bot.sendMessage(chat_id, "namur disattivato", "");
      Serial.println("namur disattivato");
      }
    }
  }

La libreria UniversalTelegramBot fa il polling del server Telegram in modo bloccante rallentando di conseguenza l'esecuzione di tutto il resto.

Questo è uno dei motivi principali che mi ha spinto a sviluppare la mia libreria AsyncTelegram2.
Se vuoi dargli un'occhiata ne sarò ben lieto.

Ad ogni modo, con ESP32 puoi trarre vantaggio dal pieno supporto a FreeRTOS e far girare quello che ha a che fare con Telegram su un task distinto che verrà eseguito in parallelo (più o meno).
Se cerchi online trovi millemila esempi (ce n'è uno anche tra quelli della mia libreria)

1 Like

Intanto ti ringrazio.
Ho usato la UniversalTelegramBot perché è quella che ho visto utilizzare di più negli esempi online.

Proverò anche la tua.

Si lo avevo immaginato.

Fammi sapere se hai bisogno di aiuto.

1 Like

Certamente, intanto cerco di capire come utilizzare la tua (non sono un mago della programmazione anzi.......)

Grazie

Spero che le password che hai scritto non siano reali...... ma ci credo poco !

1 Like

E' una rete che uso per prove, mi ero dimenticato di toglierle.
Grazie

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.