Telegram Bot ESP8266

Telegram Bot ESP8266 è il primo articolo che dedico all’interazione tra il micro controllore esp8266 e l’App telegram.

Telegram Bot ESP8266 arduino

L’argomento non è nuovo, in tanti anno trattato questo argomento prima e mi hanno incuriosito al punto da provare alcune delle librerie disponibili.

Troverai, cercando tra le librerie disponibili, la UniversalTelegramBot:

Telegram Bot ESP8266 arduino library

che puoi installare cliccando sul pulsante “Install”.

Telegram Bot ESP8266

Come primo esempio di sketch della Telegram Bot ESP8266 puoi usare uno degli esempi che la libreria ti mette a disposizione: “FlashLED”:

Telegram Bot ESP8266 arduino example FlashLed

che puoi selezionare cliccando nei menu come in figura.

A questo punto ti servono i seguenti dati per utilizzare lo sketch:Telegram Bot ESP8266 credenzialiI primi due campi WIFI_SSID e WIFI_PASSWORD riguardano le credenziali della rete WiFi in cui vorrai collegare il dispositivo ESP8266.

In merito al BOT_TOKEN ti servirà una informazione che puoi avere direttamente da Telegram.

Crea un bot Telegram

Ci sono moltissimi tutorial on line su come creare un nuovo Bot Telegram, ma ho voluto probvare personalmente e documentare i passaggi per lasciarne una traccia.

Iniziamo dall’App Telegram, dopo averla scaricata e installata puoi cercare nei canali disponibili il padre dei bot: BotFather

Telegram Bot ESP8266 bot father research

una volta iscritto al canale dovrai solo seguire le istruzioni che leggerai, partendo dal comando /start:

Telegram Bot ESP8266 bot father instruction

e cliccando su /newbot:

Telegram Bot ESP8266 bot father step 1

ti sarà chiesto di scegliere il nome del tuo bot.

Scegline uno che non sia già presente, l’operazione non è delle più semplici, il mio consiglio è scegliere un nome composto.

Il passaggio successivo è creare un username che termini con la parola “_bot”:

Telegram Bot ESP8266 bot father

dopo l’invio ti verranno restituite le credenziali per accedere al tuo nuovo bot e, sopratutto, il Token che ti servirà per far comunicare lo sketch su telegram Bot ESP8266 ed il bot stesso.

Per i comandi e le APi messe a disposizione da Telegram puoi far riferimento a questa pagina.

Per accedere al tuo nuovo bot puoi cliccare direttamente sul link rapido nella descrizione: “t.me/[username del bot]

Vedrai questa schermata:

Telegram Bot ESP8266 first bot created

e cliccando su “START” accederai al bot.

Passa ora a riportare nello sketch i dati che hai raccolto.

Sketch Telegram Bot ESP8266

Lo sketch telegram Bot ESP8266 usato in questo test è l’esempio che hai selezionato su:

/*******************************************************************
    A telegram bot for your ESP8266 that controls the 
    onboard LED. The LED in this example is active low.

    Parts:
    D1 Mini ESP8266 * - http://s.click.aliexpress.com/e/uzFUnIe
    (or any ESP8266 board)

      = Affilate

    If you find what I do useful and would like to support me,
    please consider becoming a sponsor on Github
    https://github.com/sponsors/witnessmenow/


    Written by Brian Lough
    YouTube: https://www.youtube.com/brianlough
    Tindie: https://www.tindie.com/stores/brianlough/
    Twitter: https://twitter.com/witnessmenow
 *******************************************************************/

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// Wifi network station credentials
#define WIFI_SSID "[Your WiFi SSID]"
#define WIFI_PASSWORD "[Your WiFi password]"
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "[Telegram Bot token]"

const unsigned long BOT_MTBS = 1000; // mean time between scan messages

X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lasttime; // last time messages' scan has been done

const int ledPin = LED_BUILTIN;
int ledStatus = 0;

void handleNewMessages(int numNewMessages)
{
  Serial.print("handleNewMessages ");
  Serial.println(numNewMessages);

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "")
      from_name = "Guest";

    if (text == "/ledon")
    {
      digitalWrite(ledPin, LOW); // turn the LED on (HIGH is the voltage level)
      ledStatus = 1;
      bot.sendMessage(chat_id, "Led is ON", "");
    }

    if (text == "/ledoff")
    {
      ledStatus = 0;
      digitalWrite(ledPin, HIGH); // turn the LED off (LOW is the voltage level)
      bot.sendMessage(chat_id, "Led is OFF", "");
    }

    if (text == "/status")
    {
      if (ledStatus)
      {
        bot.sendMessage(chat_id, "Led is ON", "");
      }
      else
      {
        bot.sendMessage(chat_id, "Led is OFF", "");
      }
    }

    if (text == "/start")
    {
      String welcome = "Welcome to Universal Arduino Telegram Bot library, " + from_name + ".\n";
      welcome += "This is Flash Led Bot example.\n\n";
      welcome += "/ledon : to switch the Led ON\n";
      welcome += "/ledoff : to switch the Led OFF\n";
      welcome += "/status : Returns current status of LED\n";
      bot.sendMessage(chat_id, welcome, "Markdown");
    }
  }
}


void setup()
{
  Serial.begin(115200);
  Serial.println();

  pinMode(ledPin, OUTPUT); // initialize digital ledPin as an output.
  delay(10);
  digitalWrite(ledPin, HIGH); // initialize pin as off (active LOW)

  // attempt to connect to Wifi network:
  configTime(0, 0, "pool.ntp.org");      // get UTC time via NTP
  secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
  Serial.print("Connecting to Wifi SSID ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

  // Check NTP/Time, usually it is instantaneous and you can delete the code below.
  Serial.print("Retrieving time: ");
  time_t now = time(nullptr);
  while (now < 24 * 3600)
  {
    Serial.print(".");
    delay(100);
    now = time(nullptr);
  }
  Serial.println(now);
}

void loop()
{
  if (millis() - bot_lasttime > BOT_MTBS)
  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    bot_lasttime = millis();
    Serial.println(bot_lasttime);
  }
}

nei prossimi esperimenti analizzeremo linea per linea lo sketch di esempio, in questo primo passaggio le uniche righe che dovrai modificare sono:

linee 28-29: in cui sostituire tra le virgolette le credenziali della tua rete WiFi;

linea 31: in cui inserire il token del bot appena creato.

Una volta caricato lo sketch sul tuo ESP8266 non devi far altro che aprire il monitor seriale ed osservare quello che accade:

Telegram Bot ESP8266 start response

l’esp8266 si collegherà alla tua rete WiFi e riceverà un indirizzo IP valido,  che leggi nel monitor seriale.

Poi contatterà il bot e verificherà che tu abbia inviato il comando “/start” rispondendo con le istruzioni che trovi definite nello sketch alle linee 85-90.

A questo punto non devi far altro che inviare un comando di quelli accettati dal Bot, ad esempio “/ledon” ed al ricevimento del comando il led della WeMos si accenderà:

Telegram Bot ESP8266 arduino FlashLed test

inviando il comando “/ledoff” potrai spegnare tale led.

Nota che ad ogni comando inviato lo sketch risponde inviando un messaggio che il telegram bot ESP8266 visualizza sull’app Telegram.

Nei prossimi esperimenti proveremo a modificare lo sketch in modo da inviare e ricevere altre informazioni attraverso il Bot.

L’esperimento telegram bot ESP8266 è uno degli esempi che puoi collocare in quello che viene comunemente definito IoT ( Internet of Things ) e che imparerai a gestire e modificare seguendo i miei tutorial.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/telegram-bot-esp8266.html

4 commenti

Vai al modulo dei commenti

    • Antonio il 29 Settembre 2021 alle 20:18
    • Rispondi

    Salve sono passato per il suo blog e devo complimentarmi per le ottime spiegazioni di arduino e altre shield come esp8266. Stavo visualizzando uno sketch per Esp8266 con la libreria UniversalBotTelegram e mi chiedevo cosa posso aggiungere per fare in modo che tramite un comando da telegram, il led cominci a lampeggiare ad intervallo di mezzo secondo? Ho provato con il classico blink del delay (anche se evito di usarlo dato che blocca tutto il circuito) e anche con millis, ma siccome le funzioni di if (text == /lampeggia) ect ect non sono in loop, ovviamente non mi funziona. Mi potrebbe dare una mano gentilmente? Grazie.

    Antonio

    1. Ciao Antonio,
      hai provato a definire una variabile di stato, es.: lampeggioOn, e testare nel loop che sia 0 o 1, quando è a 1 puoi far andare il lampeggio con il millis, quando è a 0 non lo fai lampeggiare.
      Ovviamente il cambio di “stato” della variabile deve essere gestito dall’if che hai menzionato nel commento.

    • rosario il 6 Febbraio 2022 alle 18:04
    • Rispondi

    Buonasera Mauro, ho seguito la guida e creato correttamente il bot telegram per l’esp8266 , ma quando avvio la verifica dello sketch su arduino ide (uso la versione online), mi da un errore.
    Ho creato uno screenshot ma non posso allegarlo qui quindi provo a riportare solo l’errore:

    const void is not a pointer to abject type

    Grazie per l’aiuto.
    Rosario

    1. Ciao Rosario,
      su quale punto dello sketch ti indica questo errore ? Hai provato anche con la versione dell’IDE su computer non vorrei si trattasse di una differenza legata all’IDE.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.