Arduino + Telegram BOT + Python

Iniciado por Riojas, Marzo 07, 2017, 04:56:42 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.


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:


Lo primero que tenemos que hacer es descargar Telegram. En este link están todas las versiones, para móviles y Desktop.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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.

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.


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.


Código: c
#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 : No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Libreria Telepot: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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
#!/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
python "nombreFihero".py

Si no les ha marcado ningún error verán algo como esto:

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:


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]

De nada amigo Riojas! Fue un placer hacerte la firma! Muy buen post!

Lo probare y te cuento, se ve interesante ;)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


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!!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Hey si aun sigues vivo quizas me puedas ayudarme... Me sale este error:
C:\Python27>python No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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 :)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hey si aun sigues vivo quizas me puedas ayudarme... Me sale este error:
C:\Python27>python No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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