Skip to Content

ESP32 invia messaggio Telegram

ESP32 invia messaggio Telegram

In questo articolo ti mostrerò come far inviare a un ESP32 un messaggio Telegram all’ Telegram app sul tuo telefono o computer. Aggiungeremo anche un sensore a infrarossi passivo (PIR) all’ESP32, che potrà essere usato per inviare una notifica di allarme intrusione se viene rilevato un movimento.

Componenti necessari

Di seguito trovi i componenti richiesti. Per questo progetto ho usato una vecchia scheda ESP32, ormai obsoleta ma ancora reperibile a basso costo. Comunque, qualsiasi altro ESP32 andrà benissimo.

Ho elencato due tipi diversi di sensori di movimento. Se vuoi un sensore di piccole dimensioni scegli l’AM312. Se invece vuoi rilevare il movimento solo di notte, scegli l’HC-SR501, che può essere facilmente dotato di un sensore di luce e ha anche una distanza di rilevamento maggiore.

ESP32 lite Lolin32

ESP32 lite

USB data cable

Cavo dati USB

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

Sensore di movimento

Sensore di movimento PIR HC-SR501

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Telegram Messenger

Telegram è un’app di messaggistica basata su cloud. Puoi installarla facilmente sul tuo smartphone (Android e iPhone) o computer (PC, Mac e Linux). È completamente gratuita e senza fastidiose pubblicità.

Permette di inviare messaggi, foto, video, note vocali, file e di effettuare chiamate vocali o video. Una caratteristica importante è il sistema di archiviazione cloud, che consente di accedere alle chat da più dispositivi senza problemi. Telegram supporta anche chat di gruppo numerose, canali pubblici e bot, rendendolo popolare sia per comunicazioni personali che di comunità.

Rispetto a WhatsApp o Signal,Telegram è generalmente più flessibile e adatto agli sviluppatori. WhatsApp è criptato end-to-end di default ed è molto usato, ma ha un supporto limitato per i bot e meno opzioni di automazione. Signal è il più sicuro in termini di privacy, ma manca delle API e dei sistemi bot che rendonoT elegram adatto all’integrazione hardware. Per ricevere messaggi da un ESP32, Telegram è la piattaforma più semplice da usare grazie alla sua Bot API ben documentata, che permette all’ESP32 di inviare messaggi via HTTPS con una configurazione minima.

Installare Telegram

L’installazione di Telegram è semplice. Vai al tuo Google Playo App Store, scarica e installa l’app Telegram. Puoi anche installarla su Windows come applicazione desktop.

Telegram App on Google Play Store
App Telegram su Google Play Store

Creare un Bot Telegram

Per ricevere messaggi inviati da un ESP32 sulla tua app Telegram, dobbiamo prima creare un Bot. I bot sono applicazioni di terze parti che funzionano all’interno di Telegram. Gli utenti possono interagire con i bot inviando messaggi, comandi e richieste inline.

Useremo il bot BotFather per creare un nuovo bot che riceverà i nostri messaggi. Apri Telegram sul tuo telefono e cerca “botfather”. Poi clicca sul bot BotFather come mostrato sotto o apri il link t.me/botfather.

Install BotFather Bot
Installare il bot BotFather (source)

Assicurati di scegliere il bot corretto. Ci sono bot con nomi simili da evitare. Cerca questa immagine per esserne sicuro o usa il link fornito:

BotFather Application Image
Immagine dell’app BotFather (source)

Se selezioni e clicchi sul bot BotFather dovrebbe apparire questo messaggio. Premi il pulsante /start (evidenziato in rosso):

Start BotFather Bot
Avvia bot BotFather (source)

Poi digita /newbot e segui le istruzioni per creare il tuo bot. Devi fornire un nome, es. “My_ESP32_receiver” e un username che deve finire con ‘bot’, es. “My_ESP32_receiver_bot”.

Create new Bot with BotFather
Crea nuovo bot con BotFather (source)

Molti nomi sono già presi e probabilmente dovrai provare più volte finché non trovi un nome disponibile. Una volta creato il bot vedrai un messaggio con un link per accedere al bot e il token del bot.

Il token del bot è una stringa che appare così: 1234567811:fakeIodw9023sjjoj982qe23dSSDCDDDSSxx ma sarà diversa per il tuo bot. Assicurati di salvare il token – ci servirà più avanti. Meglio copiarlo sul telefono e inviartelo via email.

Get bot token
Ottieni token del bot (source)

Ottieni Telegram User ID

Ora dobbiamo ottenere il nostro Telegram User ID e useremo un altro bot per questo. Apri Telegram e cerca “IDBot” oppure apri questo link t.me/myidbot:

Call IDBot
Chiama IDBot (source)

Riceverai un messaggio che spiega cosa fa questo bot. Rispondi digitando /getid. Riceverai una risposta con il tuo user ID, es. ‘7221435846’. Come prima, assicurati di salvare l’ID utente perché ci servirà più avanti.

Get User ID via IDBot
Ottieni User ID tramite IDBot (source)

Ora abbiamo tutte le informazioni necessarie. Nella prossima sezione scriveremo il codice che invia un messaggio dall’ESP32 al tuo bot.

Codice per inviare messaggi Telegram

Useremo la UniversalTelegramBot Library per inviare semplicemente messaggi Telegram dall’ESP32. Per installare questa libreria apri il LIBRARY MANAGER dell’Arduino IDE, cerca ‘UniversalTelegramBot’ e clicca sul pulsante INSTALL. Dopo l’installazione vedrai la libreria installata:

Invia messaggio semplice

In questo primo esempio di codice inviamo un messaggio fisso e semplice al nostro bot Telegram come test. Di seguito il codice completo. Dagli una rapida occhiata e poi ne discutiamo i dettagli.

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

const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

void setup() {
  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);

  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
  bot.sendMessage(CHAT_ID, "Message-1", "");
}

void loop() {}

Il codice inizia includendo le librerie necessarie per la comunicazione WiFi e Telegram:

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

Poi definiamo le costanti SSID e PASSWORD per l’autenticazione WiFi e le costanti BOT_TOKEN e CHAT_ID per l’app Telegram. Per CHAT_ID devi usare l’User ID ottenuto da IDBot e per BOT_TOKEN il token ottenuto dal bot BotFather per il tuo bot.

const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";

Con le costanti definite, creiamo gli oggetti per la comunicazione WiFi e Telegram:

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

Infine implementiamo la funzione setup, dove prima stabiliamo la comunicazione WiFi. Poi impostiamo il certificato per una comunicazione Telegram sicura e inviamo il messaggio ‘Message-1’ chiamando bot.sendMessage():

void setup() {
  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);

  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
  bot.sendMessage(CHAT_ID, "Message-1", "");
}

Con questo codice, ogni volta che resetti l’ESP32 verrà trasmesso lo stesso messaggio ‘Message-1’ al tuo bot Telegram.

La funzione loop rimane vuota. Qui potresti inviare messaggi ripetutamente, ma assicurati di mettere un ritardo tra gli invii, altrimenti il tuo bot Telegram sarà sommerso di messaggi!

Invia messaggio con timestamp

Spesso vuoi che il messaggio abbia un timestamp, così sai quando è stato inviato. Il codice seguente è una piccola estensione del precedente che aggiunge un timestamp al messaggio:

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <time.h>

const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

void sendMessage() {
  struct tm t;
  if (getLocalTime(&t)) {
    char msg[64];
    strftime(msg, sizeof(msg), "Message@%H:%M:%S", &t);
    bot.sendMessage(CHAT_ID, msg, "");
  }
}

void setup() {
  configTime(0, 0, "pool.ntp.org");  // UTC
  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);

  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);

  sendMessage();
}

void loop() { }

Le differenze principali sono nella funzione sendMessage() e nel setup. La funzione sendMessage() ottiene l’ora locale, formatta una stringa con il timestamp e invia il messaggio:

void sendMessage() {
  struct tm t;
  if (getLocalTime(&t)) {
    char msg[64];
    strftime(msg, sizeof(msg), "Message@%H:%M:%S", &t);
    bot.sendMessage(CHAT_ID, msg, "");
  }
}

Il messaggio apparirà come ‘Message@12:31:00’, per esempio. Puoi cambiare il testo del messaggio o il formato del timestamp a piacere. Dai un’occhiata alla documentazione della funzione strftime.

Nella funzionesetupconfiguriamo prima l’orologio dell’ESP32 per ricevere l’ora da un servizio internet chiamando configTime(). In questo esempio l’orologio è impostato su ora UTC, ma puoi impostare il tuo fuso orario.

void setup() {
  configTime(0, 0, "pool.ntp.org");  // UTC
  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);

  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);

  sendMessage();
}

Se vuoi approfondire la sincronizzazione dell’orologio e i formati delle stringhe temporali, dai un’occhiata ai tutorial How to synchronize ESP32 clock with SNTP server e magari anche Digital Clock on e-Paper Display.

Poi impostiamo il certificato per la comunicazione Telegram sicura e stabiliamo la connessione WiFi. Infine inviamo il messaggio chiamando sendMessage().

Con questo codice riceverai un nuovo messaggio con timestamp ogni volta che resetti l’ESP32.

Invia messaggio di allarme movimento

Nell’ultimo esempio di codice invieremo un messaggio di allarme al nostro bot Telegram se l’ESP32 rileva un movimento. Questo richiede di collegare un sensore di movimento all’ESP32. L’immagine seguente mostra come collegare il sensore PIR AM312 all’ESP32 lite:

Connect AM312 to ESP32
Collega AM312 all’ESP32

Inizia collegando il pin meno (-) dell’AM312 al pin di massa (G) dell’ESP32 e il pin più (+) al pin 3V. Ho collegato il pin segnale (s) dell’AM312 al pin 17, ma puoi usare praticamente qualsiasi altro pin. Assicurati solo di modificare il codice di conseguenza.

Se vuoi approfondire l’attivazione da movimento dai un’occhiata ai nostri tutorial How to Build a Motion Activated Night LighteHow to use HC-SR501 PIR Motion Sensor with Arduino.

Il codice seguente invia un messaggio di allarme con timestamp quando il sensore PIR collegato all’ESP32 rileva un movimento e poi aspetta un’ora prima di poter inviare un altro allarme:

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <time.h>

const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";
const int PIR_PIN = 17;
const int WAIT_TIME = 60 * 60 * 1000; // wait one hour

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

void sendMessage() {
  struct tm t;
  if (getLocalTime(&t)) {
    char msg[128];
    strftime(msg, sizeof(msg), "Alert @ %Y-%m-%d %H:%M:%S", &t);
    bot.sendMessage(CHAT_ID, msg, "");
  }
}

void setup() {
  pinMode(PIR_PIN, INPUT);
  configTime(0, 0, "pool.ntp.org");  // UTC
  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);

  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(100);
}

void loop() {
  if (digitalRead(PIR_PIN) == HIGH) {
    sendMessage();
    delay(WAIT_TIME);
  }
}

Il codice è molto simile agli esempi precedenti. L’unica vera differenza è nella funzioneloop, dove ora controlliamo se il sensore PIR ha rilevato un movimento. Se sì, inviamo il messaggio di allarme e poi aspettiamo il tempo definito da WAIT_TIME per evitare allarmi troppo frequenti.

Puoi cambiare la costantePIR_PINper collegare il sensore a un pin diverso, e la costante WAIT_TIME per modificare il tempo minimo di attesa tra gli allarmi. Non rendere però WAIT_TIME troppo piccolo, altrimenti il telefono potrebbe essere sommerso di messaggi.

Conclusione

In questo articolo hai imparato come inviare un messaggio all’app Telegram sul tuo telefono da un ESP32.

Abbiamo anche collegato un sensore PIR all’ESP32 per inviare messaggi di allarme quando viene rilevato un movimento. Potresti combinare questa funzione con un sistema di telecamere per essere avvisato quando controllare lo streaming o le registrazioni di sorveglianza. Vedi i tutorial Surveillance Camera with ESP32-CAM,Take Photos with ESP32-CAMeMotion Activated ESP32-CAM per imparare a costruire un sistema simile.

Se non vuoi solo ricevere notifiche ma anche controllare l’ESP32, ad esempio accendere luci, inviando messaggi Telegram, dai un’occhiata al tutorial Control ESP32 from Telegram.

Se hai domande, sentiti libero di lasciarle nella sezione commenti.

Buon divertimento con il tinkering ; )