Telegram Bot ESP8266 è il primo articolo che dedico all’interazione tra il micro controllore esp8266 e l’App telegram.
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:
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”:
che puoi selezionare cliccando nei menu come in figura.
A questo punto ti servono i seguenti dati per utilizzare lo sketch:I 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
una volta iscritto al canale dovrai solo seguire le istruzioni che leggerai, partendo dal comando /start:
e cliccando su /newbot:
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”:
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:
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:
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à:
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.
4 commenti
Vai al modulo dei commenti
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
Autore
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.
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
Autore
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.