×

ARDUINO

Control d’accés amb contrasenya. Orgue de llums. Comparativa de editors Arduino. Projecte bon Nadal. Sensor de gas i de fums. Control de la qualitat del aire interior (CO2) amb semàfor LED.

NodeMCU

NodeMCU-ThingSpeak. ThingSpeak. NodeMCU com AccessPoint. Control de la llum de casa per web. Control de un led per el mòbil. Sistema de fitxers en ESP8266. Altura del nivell d'aigua. Avis d’alarma a Telegram. Control de la llum de casa des de Telegram. Control de la intensitat de llum de un LED per Internet. Magatzematge de temperatura i humitat en Thinger. Publicar temperatura i humitat en Google Sheets. ESP8266 i Firebase. ESP8266-BME280 Firebase. La bàscula. ESP8266 NodeMCU amb cèl·lula de càrrega..

ESP32

ESP32-CAM, exemple de prova. Esp32-Cam captura fotos per ser vistes en la WEB. Pujar fotos a un servidor FTP amb ESP32-CAM. Foto amb ESP32-CAM i Telegram. Alarma amb avis a Telegram, utilitzant la placa ESP32-CAM.

PROGRAMACIÓ

Matemàtiques. App Inventor tutorial. MicroPython en ESP8266. Visual Estudio Code per Arduino

Intel·ligència artificial

Classificador d’imatges.

SERVIDORS

Instal·lar i configurar Apache en Ubuntu. Accés a un servidor Linux remotament. Client i Servidor FTP.

MÀQUINES VIRTUALS

Màquina virtual UBUNTU. WindowsXP en Virtualbox.

ELECTRÒNICA

Simulador Multisim. Simulador Proteus.

BASE DE DADES

MySQL. Instal·lació. MySQL. Aplicacions.

JAVA

Netbeans Maven MySQL. Java+Netbeans+Maven+EclipseLink+MySQL Aplicació d’escriptori JavaFX App JavaFX amb SceneBuilder App Java-Swing
favicon
logo

Tresavis

Benvinguts al blog de tresavis de noves tecnologies i més.

Correu : tresavis3@gmail.com

facebook   Instagram   youtube   x   tiktok

☰ Pràctiques   ☰ Articles

Descripció.

Es vol controlar la llum de la casa per Internet, fen servir la aplicació Telegram. En aquesta practica es l’encesa de la llum, però pot ser qualsevol dispositiu.

Components.

1.- Placa NodeMCU.

2.- Relé.

3.- Bombeta a 220V.

4.- IDE de Arduino.

protocol

Bibliografia.

Per desenvolupar aquesta practica ens hem basat en la pàgina de ESPloradores

Comandos del BOT de Telegram:

/start. Per iniciar el BOT.

/llum_on. Per encendre la llum.

/llum_off. Per apagar la llum.

/estat. Per saber l’estat de la llum ON o OFF.

Missatges que retorna el NodeMCU:

ENCENEM LA LLUM. Resposta al comando /llum_on.

APAGUEM LA LLUM. Resposta al comando /llum_off.

La llum està encesa o apagada. Resposta al comando /estat.

Passos a seguir:

1.- Crear un BOT de Telegram per el ESP8266.

2.- Circuit elèctric.

3.- Programa a pujar a la placa.

4.- Resultat final.

BOT de Telegram.

Primer de tot es te que instal·lar Telegram, per mòbil o per ordinador. Fem servir la versió de ordinador, per poder explicar millor el procés de creació del BOT.

Bot es un programari que corre dins de Telegram i nosaltres podem interactuar amb el BOT de la següent manera:

1.- Enviant missatges des de la nostre placa al BOT.

2.- Escrivint comandos en la conversa en el BOT Telegram, que son enviats al NodeMCU.

Pas 1. Botfather.

En el buscador escrivim botfather per estar en la conversa a ell.

botfather

Pas 2. @ManyBot.

Cliquem en @Manybot i s’obre una interfície amb 4 passos a seguir.

manyBot

Seguim els 4 passos, cliquem en @Botfather i escrivim /newbot en el xat de botfather.

Pas 3. /newbot.

newBot

Pas 4. Nom del BOT.

Posem el nom del nou BOT, en el nostre cas llumBot.

nomBot

Pas 5. Nom del usuari.

Escrivim el nom del usuari, en el nostre cas userLlumBot.

nomUser

Pas 6. Obtenim el token.

Guardem el token, que srvira per poder connectar amb el BOT, via HTTP API.

Pas 7. Tornem a @ManyBot.

En ManyBot enviem el token copiat.

manyBot

Pas 8. Obtenim el User ID.

Telegram User ID, serveix perquè el NodeMCU pugui saber si el missatge que rep correspon verdaderament al nostre usuari i poder acceptar-lo o ignorar-lo.

En el buscador de la pantalla principal de Telegram escrivim IDBot.

userID

Escrivim /getid.

userID2

Guardem el UserID, servirà després per inserir en el programa. El UserID es identificador de cada usuari i es el mateix per tots els BOTS de un mateix usuari.

Ja tenim el BOT amb el nom del BOT, el nom del usuari el token i el UserID.

Circuit elèctric.

Esquema creat gracies a l’aplicació de https://circuit.io

circuit
hardware

IDE de Arduino.

Llibreria Universal Telegram Bot Library.

Creada per Brian Lough.

Descarrega la llibreria de github

Anar a Esbós > Inclou biblioteca > Afegeix biblioteca .ZIP i buscar la nova llibreria descarregada.

Important: NO instal·lar la llibreria amb el gestor de biblioteques, perquè la versió no esta actualitzada.

Llibreria ArduinoJson Library.

Per instal·lar-la ho fem amb el gestor de biblioteques:

Anar a Esbós > Inclou biblioteca > Gestiona les biblioteques...

Busquem ArduinoJson i la instal·lem.

Programa a pujar a la placa.

llum-telegram.ino


#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
// by Brian Lough: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
#include <UniversalTelegramBot.h>   
#include <ArduinoJson.h>

//WiFi
const char* ssid = "mirablau";
const char* password = "XXXXXXXX";

//Telegram BOT token
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXX"  

// Usem idbot per obtenir el userID, que es persolal i igual per els diferents tokens
#define USER_ID "XXXXXXXXXXXXXX"

// Per poder enviar i rebre missatges primer escrivim "/start" en el bot
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

// Missatges cada 1 segon.
int intervalPeticions = 1000;
unsigned long tempsBotFuncionant;

//definim el pin del relay
#define llumPin D1 
// Estat inicial de la llum apagat
bool llumEstat = LOW;

// Manipula els nou missatges rebuts
void manipulaNousMissatges(int numNousMissatges) {
  Serial.println("manipulaNousMissatges");
  Serial.println(String(numNousMissatges));

  for (int i=0; i<numNousMissatges; i++) {
    // Comprovem el user_id del solicitant.
    String user_id = String(bot.messages[i].chat_id);
    if (user_id != USER_ID){
      bot.sendMessage(user_id, "Usuari no permés", "");
      continue;
    }
    
    // Imprimir el missatge rebut
    String text = bot.messages[i].text;
    Serial.println(text);

    String from_name = bot.messages[i].from_name;

    if (text == "/start") {
      String benvinguda = "Benvinguda, " + from_name + ".\n";
      benvinguda += "Comandos per controlar la llum.\n\n";
      benvinguda += "/llum_on per encendre \n";
      benvinguda += "/llum_off per apagar \n";
      benvinguda += "/estat per solicitar el estat actual \n";
      bot.sendMessage(user_id, benvinguda, "");
    }

    if (text == "/llum_on") {
      bot.sendMessage(user_id, "ENCENÉM LA LLUM", "");
      llumEstat = HIGH;
      digitalWrite(llumPin, llumEstat);
    }
    
    if (text == "/llum_off") {
      bot.sendMessage(user_id, "APAGUEM LA LLUM", "");
      llumEstat = LOW;
      digitalWrite(llumPin, llumEstat);
    }
    
    if (text == "/estat") {
      if (digitalRead(llumPin)){
        bot.sendMessage(user_id, "LA LLUM ESTÀ ENCESA", "");
      }
      else{
        bot.sendMessage(user_id, "LA LLUM ESTÀ APAGADA", "");
      }
    }
  }
}

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

  client.setInsecure();

  pinMode(llumPin, OUTPUT);
  digitalWrite(llumPin, llumEstat);
  
  // Connectar a la xarxa Wifi. Mode estació:
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connectan a la WiFi..");
  }
  // Imprimir la IP Local de la placa
  Serial.println(WiFi.localIP());
}

void loop() {
  if (millis() > tempsBotFuncionant + intervalPeticions)  {
    int numNousMissatges = bot.getUpdates(bot.last_message_received + 1);

    while(numNousMissatges) {
      Serial.println("va obtenir resposta ");
      manipulaNousMissatges(numNousMissatges);
      numNousMissatges = bot.getUpdates(bot.last_message_received + 1);
    }
    tempsBotFuncionant = millis();
  }
}

Explicació del codi.

Tenim que posar el SSID i la contrasenya de la nostre WiFi. També el Telegram Bot token i el User ID.

Definim les sortides:

//definim el pin del relay
#define llumPin D1 
// Estat inicial de la llum apagat
bool llumEstat = LOW;

Bot token i el IDBot.

//Telegram BOT token
#define BOTtoken "XXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX"  

// Usem idbot per obtenir el userID, que es persolal i igual per els diferents tokens
#define USER_ID "XXXXXXXXX"

Creem un nou WiFi client:

WiFiClientSecure client;

Creem un Bot amb el token i el client:

UniversalTelegramBot bot(BOTtoken, client);

Seguretat. Fem servir:

  client.setInsecure();

Pero per información mes important es millor usar: client.setFingerPrint;

Escoltar el enviament de missatges del BOT cada 1 segon.

// Missatges cada 1 segon.
int intervalPeticions = 1000;
unsigned long tempsBotFuncionant;

Funció manipulaNousMissatges(numNousMissatges):

Mira cada un dels missatges rebuts, amb un bucle.

Obtenim el user_id de cada missatge i el comparem amb el nostre USER_ID, si es diferente enviem missatge de no permis i descartem el missatge.

  for (int i=0; i<numNousMissatges; i++) {
    // Comprovem el user_id del solicitant.
    String user_id = String(bot.messages[i].chat_id);
    if (user_id != USER_ID){
      bot.sendMessage(user_id, "Usuari no permés", "");
      continue;
    }

Altrament si la comprovació anterior es satisfactori, guardem el missatge rebut i el nom del remitent:

    // Imprimir el missatge rebut
    String text = bot.messages[i].text;
    Serial.println(text);

    String from_name = bot.messages[i].from_name;

Si el text es /start, el BOT envia un missatge de benvinguda:

    if (text == "/start") {
      String benvinguda = "Benvinguda, " + from_name + ".\n";
      benvinguda += "Comandos per controlar la llum.\n\n";
      benvinguda += "/llum_on per encendre \n";
      benvinguda += "/llum_off per apagar \n";
      benvinguda += "/estat per solicitar el estat actual \n";
      bot.sendMessage(user_id, benvinguda, "");
    }

Si el text es /llum_on, la placa encén la llum i el BOT envia el missatge de ENCENÉM LA LLUM:

Si el text es /llum_off, la placa apaga la llum i el BOT envia el missatge de APAGUEM LA LLUM:

    if (text == "/llum_on") {
      bot.sendMessage(user_id, "ENCENÉM LA LLUM", "");
      llumEstat = HIGH;
      digitalWrite(llumPin, llumEstat);
    }
    
    if (text == "/llum_off") {
      bot.sendMessage(user_id, "APAGUEM LA LLUM", "");
      llumEstat = LOW;
      digitalWrite(llumPin, llumEstat);
    }

Si el text es /estat, llegeix el estat del pin i el BOT envia missatge del seu estat:

    if (text == "/estat") {
      if (digitalRead(llumPin)){
        bot.sendMessage(user_id, "LA LLUM ESTÀ ENCESA", "");
      }
      else{
        bot.sendMessage(user_id, "LA LLUM ESTÀ APAGADA", "");
      }
    }

loop(), mira si hi ha missatges cada segon:

void loop() {
  if (millis() > tempsBotFuncionant + intervalPeticions)  {
    int numNousMissatges = bot.getUpdates(bot.last_message_received + 1);

    while(numNousMissatges) {
      Serial.println("va obtenir resposta ");
      manipulaNousMissatges(numNousMissatges);
      numNousMissatges = bot.getUpdates(bot.last_message_received + 1);
    }
    tempsBotFuncionant = millis();
  }
}

Resultat.

Contingut.


Nosaltres

sagulla
sagulla2

termo
mates
aigua
sagulla3
alba
ponent
anecs

Tags

Noves tecnologies WEB Arduino Domótica MycroPython NodeMCU IoT Java ESP8266 Lora C++ Programació Server-Client