Underc0de - La Casa de los Informáticos

Informática => Electrónica y Robótica => Arduino - Raspberry PI => Mensaje iniciado por: Riojas en Marzo 07, 2017, 04:56:42 PM

Título: Arduino + Telegram BOT + Python
Publicado por: Riojas en Marzo 07, 2017, 04:56:42 PM

Que tal underc0ders!!!
Ahora les traigo este aporte en el que aprenderemos a hacer un "bot" de Telegram que interactue con Arduino. Espero les guste y manos a la obra!!

Materiales necesarios:
1 Arduino UNO.
1 Sensor de Temperatura y Humedad DHT11.
2 Leds cualquier color.
1 Protoboard.
Cables para conexión.

Les dejo la conexión de los componentes en la siguiente imagen:
(http://i.imgur.com/wg0Vts5.png)

Lo primero que tenemos que hacer es descargar Telegram. En este link están todas las versiones, para móviles y Desktop.
https://telegram.org/apps
En mi caso usare la aplicación para Windows.

Una vez instalada y que ya se registraron tienen que iniciar una conversación con @BotFather(es como el jefe de todos los Bots) para hacerlo solo tienen que seguir este link https://telegram.me/botfather o bien buscarlo dentro de sus contactos en Telegram.
Cuando se abra la ventana de conversación tienen que escribir el comando "/start" y así iniciara la conversación con @BotFather. Enseguida les mostrara una lista de comandos.
(http://i.imgur.com/T9FF0lu.png?2)
Ahora enviaremos el comando "/newbot" para empezar a crear el Bot. Después de introducir este comando nos preguntara el nombre y el nickname que aparecerá en los chats, en caso de que ya exista un Bot llamado igual lo dirá y tendremos que elegir otro.
Si todo ha ido bien ya hemos creado nuestro Bot satisfactoriamente.
(http://i.imgur.com/oqutXNP.png?2)

En el mensaje de respuesta nos dara el "TOKEN" para accesar a nuestro Bot desde la API, hay que guardarlo para su posterior uso.

Bien, dejemos a un lado Telegram para ir a programar Arduino.
El código es muy sencillo, de todas formas se los dejo explicado linea por linea.


#include "DHT.h" //Incluimos la libreria DHT para el control de el Sensor DHT 11.

#define PinOutDHT 3 //Definimos el Pin 3 para la lectura de el sensor.
#define TypeDHT DHT11 //Definimos el Tipo de Sensor.
DHT dht(PinOutDHT, TypeDHT); //Cramos un objeto dht con las variables definidas anteriormente.

const int led1=12; //Declaramos la variable led1.
const int led2=2; //Declaramos la variable led2.

unsigned int dato; //Declaramos una variable "dato" en donde se guardaran los valores recibidos desde Python.

void setup() {
  Serial.begin(9600); //Inicializamos la comunicacion Serial a 9600 Baudios
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT); //Definimos los pines de los leds como Salidas
 
}

void loop() {
    while(Serial.available()>0){  //Comprobamos que la comunicacion serial este disponible.
      dato=Serial.read(); //Leemos el puerto serial y guardamos los valores en la variable "dato"
     
      /*En el siguiente codigo se compara el valor de "dato" y segun sea el caso actua de distintas maneras*/
      //Enciende o apaga los leds
        if(dato=='Y')digitalWrite(led1,HIGH);
        if(dato=='N')digitalWrite(led1,LOW);
        if(dato=='E')digitalWrite(led2,HIGH);
        if(dato=='F')digitalWrite(led2,LOW);

      //Manda Temperatura o Humedad segun el caso
        if(dato=='T')Serial.println(int(dht.readTemperature())+String("°C"));
        if(dato=='H')Serial.println(int(dht.readHumidity())+String("%"));
       
    }
 
}



Después de haber cargado el programa a Arduino nos iremos a programar en Python, yo he usado Python 2.7 y corre sin ningun problema.
Aquí los links para descargar las herramientas:
Python : https://www.python.org/downloads/
Libreria Telepot: https://github.com/nickoala/telepot

Nota: Al ejecutar el código de Python háganlo desde la terminal, asi no les marcara ningun error relacionado con el puerto COM de Arduino.
Nota 2: Antes de ejecutar el código de Python asegúrense de tener cerrado el monitor serial en Arduino.
Aclarados estos puntos les dejo el código en Python.

Código (python) [Seleccionar]
#!/usr/bin/python
import telepot, time, serial, sys
ser = serial.Serial('COM10', 9600)

print('Bot activado.')
print('Esperando comandos...')
   
def handle(msg):

userName = msg['from']['first_name']

content_type, chat_type, chat_id = telepot.glance(msg)

if (content_type == 'text'):
command = msg['text']
print ('Comando obtenido: %s' % command)

if  '/start' in command:
bot.sendMessage(chat_id, "Hola, "+userName+"\n"+"Mi nombre es: BotDuino,Te muestro la lista de comandos que puedo reconocer:"+"\n"
                                        +"/encender_led1"+" -Enciendo el Led 1"+"\n"
                                        +"/apagar_led1"+" -Apago el Led 1"+"\n"
                                        +"/encender_led2"+" -Enciendo el Led 2"+"\n"
                                        +"/apagar_led2"+" -Apago el Led 2"+"\n"
                                        +"/ubicacion"+" -Envio mi ubicacion actual"+"\n"
                                        +"/humedad"+" -Te muestro la Humedad en el ambiente"+"\n"
                                        +"/temperatura"+" -Te muestro la temperatura")

elif '/encender_led1' in command:
ser.write(b'Y')
bot.sendMessage(chat_id, "Led 1 Encendido!")

elif '/apagar_led1' in command:
ser.write(b'N')
bot.sendMessage(chat_id, "Led 1 Apagado!")
       
                elif '/encender_led2' in command:
ser.write(b'E')
bot.sendMessage(chat_id, "Led 2 Encendido!")

elif '/apagar_led2' in command:
ser.write(b'F')
bot.sendMessage(chat_id, "Led 2 Apagado!")

elif '/ubicacion' in command:
                        bot.sendLocation(chat_id, "cambiar por latitud","cambiar por longitud")

elif '/temperatura' in command:
                        ser.write(b'T')
                        linea=ser.readline()
                        bot.sendMessage(chat_id, "Temperatura: " +linea)


                elif '/humedad' in command:
                        ser.write(b'H')
                        linea=ser.readline()
                        bot.sendMessage(chat_id, "Humedad Relativa: " +linea)
else:
                    bot.sendMessage(chat_id, "Lo siento, no reconozco ese comando!")

bot = telepot.Bot('"cambiar por tu TOKEN"')

bot.message_loop(handle)

# Espera por nuevos mensajes
while 1:
time.sleep(20)


Abran una terminal en Windows y ejecuten el script que acabamos de hacer
Código (bash) [Seleccionar]
python "nombreFihero".py
Si no les ha marcado ningún error verán algo como esto:
(http://i.imgur.com/rNuezGV.png?1)
Este sera nuestro "monitor" en el cual se mostraran los mensajes que mande el usuario a nuestro Bot.

Para iniciar la conversación tenemos que enviar el comando "/start", y nos contestara de esta manera mostrando los comandos a los que puede reaccionar. Así se vera en Telegram y en la terminal:
(http://i.imgur.com/s5Zc07P.png?1)

Aquí un vídeo del resultado:


Cabe señalar que esto es solo el comienzo ya que con este método podrán controlar infinidad de dispositivos en Arduino, como relevadores para prender o apagar dispositivos de 120 v o lo que se les venga a la mente.

Hasta aquí este post, espero les guste y les sea de utilidad.

PD: Muchas gracias a @xcivix o @Panda por mi nueva firma!!!

Hasta el próximo post underc0ders.
[/b]
Título: Re:Arduino + Telegram BOT + Python
Publicado por: Panda en Marzo 07, 2017, 05:28:24 PM
De nada amigo Riojas! Fue un placer hacerte la firma! Muy buen post!
Título: Re:Arduino + Telegram BOT + Python
Publicado por: rush en Marzo 07, 2017, 07:17:31 PM
Lo probare y te cuento, se ve interesante ;)
Título: Re:Arduino + Telegram BOT + Python
Publicado por: rob01_alo06 en Marzo 07, 2017, 07:58:32 PM
Holaa Riojas, soy nuevo en este mundillo pero me parece muy interesante, estoy en 4 ESO y estamos con Arduino y el S4

Muy interesante el aporte!!
Un saludo!!
Título: Re:Arduino + Telegram BOT + Python
Publicado por: Riojas en Marzo 08, 2017, 01:13:18 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Holaa Riojas, soy nuevo en este mundillo pero me parece muy interesante, estoy en 4 ESO y estamos con Arduino y el S4

Muy interesante el aporte!!
Un saludo!!

Hola, pasate por este post de Snap4Arduino.
https://underc0de.org/foro/arduino-raspberry-pi/arduino-snap4arduino-presentacion/
Título: Re:Arduino + Telegram BOT + Python
Publicado por: Bubupi27 en Julio 13, 2018, 05:04:44 AM
Hey si aun sigues vivo quizas me puedas ayudarme... Me sale este error:
C:\Python27>python bot.py
Traceback (most recent call last):
  File "bot.py", line 3, in <module>
    ser = serial.Serial('COM3', 9600)
AttributeError: module 'serial' has no attribute 'Serial'

Tienes alguna idea de como solucionarlo????

Gracias :)
Título: Re:Arduino + Telegram BOT + Python
Publicado por: hielasangre en Agosto 27, 2018, 03:24:31 AM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Hey si aun sigues vivo quizas me puedas ayudarme... Me sale este error:
C:\Python27>python bot.py
Traceback (most recent call last):
  File "bot.py", line 3, in <module>
    ser = serial.Serial('COM3', 9600)
AttributeError: module 'serial' has no attribute 'Serial'

Tienes alguna idea de como solucionarlo????

Gracias :)
pip install serial