Utilizzo dei bot di  Telegram Bot con i moduli ESP8266 / NODEMCU / SONOFF

Era da tempo che volevo realizzare un dispositivo che mi permettesse di ricevere messaggi siano essi allarmi o simili e di poter inviare contestualmente comandi per eseguire operazioni varie.

 

La scelta si e' focalizzata quindi sull'utilizzo dei moduli ESP8266 oppure NODEMCU oppure i comuni SONOFF questi ultimi ovviamente con firmware da modificare a seconda delle necessita'.

 

Per chi non  lo sapesse il NODEMCU ed il SONOFF sono praticamente dei dispositivi che hanno come cuore pulsante il diffusissimo e versatile modulo ESP8266.

 

                                                          INIZIAMO

Come prima cosa stabilisco cosa voglio ottenere ...... per esempio mi interessa essere avvisato nel momento in cui si verifica un evento e tale evento puo' essere rappresentato dal cambio di stato di un ingresso di uno dei moduli sopra elencati causato per esempio da un pulsante , da un modulo pir e cosi' via.

 

Trattandosi di ingressi digitali GPIOn , si trattera' quindi di rilevare un cambio di stato 0 oppure 1.

 

Facciamo un esempio : io ho un pulsante collegato tra il GPIO14 e GND e per facilita' trattero questo esempio con un SONOFF ma solo per il fatto che dispone gia' di alimentatore integrato nel modulo stesso e quindi non devo utilizzare altro per realizzare velocemente il circuito.

 

Il GPIO14 ed il GND sono facilmente utilizzabili in quanto sono posizionati in maniera molto visibile e facilmente raggiungibile nel pcb.

La strip di solito non e' presente ma va semplicemente saldata...si tratta di una strip a 5 pin.

 

A parte il pin GPIO14 , gli altri sono necessari per la programmazione di un nuovo firmware nel modulo che quindi andra' a sostituire l'originale che NON SARA' PIU' RECUPERABILE.... non mi venite a dire poi che il modulo non vi funziona piu' come prima !!!!

Collegando quindi un pulsante tra il pin GPIO14 ed il GND possiamo rilevare quando avviene il cambio di stato e decidere tramite il codice da caricare nel modulo , cosa dovra' accadere in quel caso.

 

Il pin GPIO14 io l'ho trovato a circa 1,8 Volt e visto che era una tensione che si attestava troppo vicino alla "zona dell'incertezza" , ho preferito forzarlo al positivo mediante una resistenza da 270 ohm che ho saldato nel lato inferiore tra il GPIO14 ed il 3,3 Volt cosi' da tenere alto il GPIO14.

Con questa semplice aggiunta ho stabilito quindi che a riposo il GPIO14 e in stato HIGH mentre quando lo chiudo a GND tramite il pulsante lo portero' allo stato LOW.

Adesso si tratta di trasferire il codice scritto con l'IDE di Arduino nel SONOFF e per fare cio' utilizzo un modulo USB FTDI facendo attenzione che le tensioni di tale modulo FTDI siano impostate a 3,3 Volt.

 

Precisazione che ho dimenticato di fare.... i moduli ESP8266 lavorano a 3,3 Volt e di conseguenza gli ingressi e le uscite lavorano anch'essi a 3,3 Volt , ecco perche' i segnali di programmazione che saranno inviati dall'IDE tramite l'FTDI verso il SONOFF dovranno essere a 3,3 Volt.

 

A questo punto apriamo dal telefono Android l'applicazione TELEGRAM ed andiamo a cercare tra i canali quello denominato BotFather ;

ci si deve iscrivere al canale BotFather e dopo averlo fatto si puo' digitare il comando /start che ci elenchera' i comandi possibili.

 

Siccome abbiamo deciso di creare un nuovo bot digitiamo /newbot e ci verra' richiesto di digitare il nome che vogliamo dare a questo nostro nuovo bot ..... per esempio digitiamo 123pippo456 e subito dopo il sistema ci chiedera' di digitare nuovamente il nome appena scelto aggiungendo alla fine il trattino basso ed il suffisso bot (123pippo456_bot).

 

A questo punto il sistema di restituisce una schermata di congratulazioni per aver creato il bot e ci fornisce una chiave di accesso detta TOKEN che dovremo utilizzare dopo nel codice del firmware da caricare nel sonoff ; sempre nel codice del firmware pero' ci serve un altro valore che sempre telegram ci fornisce ricercando il canale Show Me ID dal quale canale digitando /start e dopo /getid , otterremo un codice id che utilizzaremo qppunto dopo.

 

Adesso abbiamo il nostro nuovo bot con un nome (123pippo456_bot) una chiave token (12338857739:AAet443034.............................) ed in id che identifichera' il telefono.

 

questi tre valori li dovremo utilizzare nel codice che vediamo sotto.

 

Attenzione !!!!! Per caricare questo codice nel SonOff si deve collegare a SonOff scollegato dalla rete il dispositivo FTDI seriale , tenere premuto il tasto del SonOff ed inserire la presa nella 220v.

Sul monitor seriale dell'IDE di Arduino si vedranno dei caratteri segno che si puo' dare inizio alla compilazione ed al successivo caricamento.

Mi raccomando di scegliere nell'IDE di Arduino la scheda Generic ESP8266 Module usando questa configurazione :

Ecco il codice da caricare sul SonOff:

 

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include "CTBot.h"
CTBot myBot;

int porta = 21201;
const char* update_path = "/firmware";
const char* update_username = "admin";
const char* update_password = "zorrozorro";

ESP8266WebServer httpServer(porta);
ESP8266HTTPUpdateServer httpUpdater;

String ssid = "WIFISSID"; //nome mia rete wifi
String pass = "WIFIPWD"; // pwd mia rete wifi

String token = "140770074:AAG9tdP......................................................."; //Token ottenuto da telegram
int codice_1 = 14076...........; //Id ottenuto da telegram

uint8_t GPIO_Pin = 2;
uint8_t led = 13;
void ICACHE_RAM_ATTR IntCallback();
int attivo = 0;

void setup() {
  Serial.begin(115200);
  pinMode(GPIO_Pin, INPUT);
  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);

  httpUpdater.setup(&httpServer, update_path, update_username, update_password);
  httpServer.begin();

  Serial.println("Avvio di TelegramBot...");
  myBot.wifiConnect(ssid, pass);

  myBot.setTelegramToken(token);

  if (myBot.testConnection()) {
    Serial.println("\nConnessione avvenuta con successo OK");
    digitalWrite(led, LOW);
  } else
    Serial.println("\ntestConnection NO");

  attachInterrupt(digitalPinToInterrupt(GPIO_Pin), IntCallback, FALLING);

  myBot.sendMessage(codice_1, "SISTEMA PRONTO");
  myBot.sendMessage(codice_1, "IP = " + WiFi.localIP().toString());
  myBot.sendMessage(codice_1, "MAC = " + WiFi.macAddress());
  myBot.sendMessage(codice_1, "PORT = 21201");
  myBot.sendMessage(codice_1, "Stop - Stato - Reset - Rete");

}

void loop() {
  httpServer.handleClient();

  TBMessage msg;

  if (myBot.getNewMessage(msg)) {

    if (msg.text == "Rete") {
      myBot.sendMessage(codice_1, "IP = " + WiFi.localIP().toString());
      myBot.sendMessage(codice_1, "MAC = " + WiFi.macAddress());
      myBot.sendMessage(codice_1, "PORT = " + String(porta));
    }
  }

  if (attivo == 1) {
    for (int z = 1; z < 11; z++) {
      myBot.sendMessage(codice_1, "ALLARME PULSANTE PREMUTO " + String(z));
      delay(500);
    }
   attivo = 0;
  }
  delay(100);
}

void IntCallback() {
  Serial.println("Premuto");
  attivo = 1;
}