Arduino+Python+RBPi+Twitter: TweetMotica

Arduino+Python+RBPi+Twitter: TweetMotica

tweetmotica portada

Este es el primer tutorial que publico, después de aprender mucho en este sitio.

La idea surge por un profesor que me comento:_"como podríamos implementar un control domestico de bajo coste para el laboratorio". Y gracias a los tutoriales Raspduino y Tweepy pude idear algo interesante que espero les guste.

TweetMotica, consiste en un control de la placa arduino como actuador mediante ordenes enviadas por Twitter. Utilizaremos la Raspberry pi como servidor, de igual manera se puede suprimir el arduino y utilizar los puertos GPIO de la Raspberry Pi.

Lo primero es instalar en nuestra Raspberry las librerías de twitter para python, lo cual lo podemos hacer mirando el tutorial Tweepy.

Terminado esto, precedemos a crear nuestro circuito de pruebas, que constará de 5 led conectados a los puertos digitales de nuestra placa arduino (12, 11, 10, 9, 8 respectivamente) con una resistencia de 220 ohms en común.

Tweetmotica1

Seguidamente, compilamos el código en nuestro Arduino:

int led1 = 12;
int led2 = 11;
int led3 = 10;
int led4 = 9;
int led5 = 8;

void setup () {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  Serial.begin(9600); //Inicializo el puerto serial a 9600 baudios
}

void loop () {
  if (Serial.available()) { //Si está disponible
    char c = Serial.read(); //Guardamos la lectura en una variable char
    if (c == 'q') { //enciendo el LED1
      digitalWrite(led1, HIGH);
    }
    if (c == 'a') { //apago el LED1
      digitalWrite(led1, LOW);
    }
        if (c == 'w') { //enciendo el LED2
      digitalWrite(led2, HIGH);
    }
    if (c == 's') { //apago el LED2
      digitalWrite(led2, LOW);
    }
        if (c == 'e') { //enciendo el LED3
      digitalWrite(led3, HIGH);
    }
    if (c == 'd') { //apago el LED3
      digitalWrite(led3, LOW);
    }
        if (c == 'r') { //enciendo el LED4
      digitalWrite(led4, HIGH);
    }
    if (c == 'f') { //apago el LED4
      digitalWrite(led4, LOW);
    }
        if (c == 't') { //enciendo el LED5
      digitalWrite(led5, HIGH);
    }
    if (c == 'g') { //apago el LED5
      digitalWrite(led5, LOW);
    }
  }
  
}

La base para este código fue gracias el tutorial Raspduino.

Terminado esto, conectamos nuestro Arduino a la Raspberry, es importante que la tengamos conectada a Internet.

Foto0315

Trabajando por SSH

Ahora empieza lo bonito, asumiendo que ya tenemos las raspberry encendida escribimos por consola lo siguiente:

sudo apt-get install python-serial

Esto permitirá que Python pueda trabajar con el puerto donde estará conectado nuestro arduino. Con las Keys obtenidas gracias al tutorial Tweepy completamos nuestro código.

#!/usr/bin/env python
import tweepy
import time
import serial
arduino = serial.Serial('/dev/ttyACM0', 9600)

CONSUMER_KEY = '????????????????' #Aquí coloca Consumer key
CONSUMER_SECRET = '???????????????'#Aquí coloca Consumer secret
ACCESS_KEY = '???????????????????'#Aquí coloca Access token
ACCESS_SECRET = '????????????????'#Aquí coloca Access token secret

#En esta parte nos identifica para poder realizar operaciones

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)

control = "control" #esta variable de control
comando = "comando" #variable donde guardaremos el texto del twitter 
x = tweepy.API(auth)
while True:
    for tweets in x.user_timeline(count=1): #nos permite leer solo el ultimo tweet
                comando = tweets.text
                if control != comando: #este if nos ayuda que sol envié una vez por tweet la orden
                        if comando in "Prender led 1": #prender el led 1 #if ... in es in comparador de que nos permite ingresar a la sentencia solo si la palabla esta tal cual.  
                                arduino.write("q")
                                print("led 1 prendido")
                                control = comando #asignación para no volver a entrar hasta que se escriba un nuevo tweet
                        elif comando in "Apagar led 1": #apaga el led 1 
                                arduino.write("a")
                                print("led 1 apagado")
                                control = comando
                                
                        if comando in "Prender led 2": #prende led 2 
                                arduino.write("w")
                                print("led 2 prendido")
                                control = comando
                        elif comando in "Apagar led 2": #apaga led 2 
                                arduino.write("s")
                                print("led 2 apagado")
                                control = comando
                                
                        if comando in "Prender led 3": # prende led 3 
                                arduino.write("e")
                                print("led 3 prendido")
                                control = comando
                        elif comando in "Apagar led 3": # apaga led 3 
                                arduino.write("d")
                                print("led 3 pagado")
                                control = comando
                                
                        if comando in "Prender led 4": #prende led 4
                                arduino.write("r")
                                print("led 4 prendido")
                                control = comando
                        elif comando in "Apagar led 4": # apaga led 4 
                                arduino.write("f")
                                print("led 4 apagado")
                                control = comando
                                
                        if comando in "Prender led 5": # prende led 5
                                arduino.write("t")
                                print("led 5 prendido")
                                control = comando
                        elif comando in "Apagar led 5": # apaga led 5 
                                arduino.write("g")
                                print("led 5 apagado")
                                control = comando
    time.sleep(1) #leera el ultimo tweet cada un segundo
arduino.close()

Ahora cuando escribamos un tweet "Prender led 1, 2, 3, 4 ó 5 " los encenderá y cuando escribamos " Apagar led 1, 2, 3, 4 ó 5" los apagará. (Tiene que estar escrito tal cual como muestra la sentencia o sino no entra, en mi caso con mayúscula la primera letra ya que mi teléfono la ingresa por defecto).

Foto0314

Las utilidades que se le puede dar a este proyecto son muchas, a mi parecer, desde un simple control domótico hasta utilidades más complejas como para industrias, etc. Pero todo esta en lo que seamos capaces de crear.

Espero que les sea útil y que les guste.

Apunte Final

El tiempo uso al parecer es limitado.

Ya que cuando lo tuve encendido por más o menos 6 horas me arrojo el siguiente error:

ERROR
Traceback (most recent call last):
  File "status.py", line 14, in 
    api.update_status('Tweeting from command line')
  File "/usr/local/lib/python2.7/dist-packages/tweepy-1.10-py2.7.egg/tweepy/binder.py", line 185, in _call
    return method.execute()
.

Me da la idea de que es por memoria, aunque en el código no lo dice explícito. Si alguien me puede ayudar a solucionarlo estaré muy agradecido.

¡Juan!

Deja un comentario


9 comentarios


Osvaldo Cordova A · Hace 1 año

pienso que una mejor opción es usar telegram y la raspberry :)

Adrián Gutiérrez Rodríguez · Hace 1 año

Y para que utilizar Twitter ? creo que seria mas comodo implementar el mismo servidor web o darle las ordenes por ssh mismo no?

Mario Pérez Esteso · Hace 1 año

Ya no es que sea más o menos cómodo. Es simplemente que mola mucho más poder utilizar una herramienta como Twitter para este tipo de cosas. Más eficiente sería montar tu propio servicio porque no dependes de un tercero, eso sí.

Santiago Fernandez · Hace 2 años

Juan, estoy tratando de resolver el error que mencionas. Hice una modificación, donde solamente juego con el python. No envío ordenes al Arduino. Una de las preguntas que me hago, es la siguiente: Con que frecuencia, podemos consultar los servidores de Twitter? Cambie el tiempo, en el bucle, para ver si tenemos mas suerte. Por otro lado, como hiciste con los Tweets duplicados? Una vez que mandas la acción, al Arduino, eliminas el Tweet desde el Phyton? Creo, que si no se puede "agregar" un Timestamp o un ID, como citaron en las respuestas, será necesario eliminar los Tweet's despues de ejecutarlos. Si encontraste la respuesta, por favor, compartila. Saludos!

Santiago · Hace 2 años

Estimados, excelente. Realmente. Se pudo solventar el error? Puedo reemplazar la RaspberryPi por un Ubuntu? Pregunto por la paquetería. Entiendo que no habría problemas para ejecutar ese Python. Saludos! Excelente el tutorial y el sitio en general!

YamakasY · Hace 3 años

Te recomiendo que en vez de utilizar activacion por twitter, utilices activacion por Hangout de google. Solo necesitas una cuenta para la Rpi y otra desde la cual mandar los mensajes. Hay varios tutoriales en internet. Es bastante iteresante el concepto. Yo uso algo parecido para regar las plantas. Saludos y a seguir aprendiendo

Don Felipes Chelas · Hace 3 años

estó está todo el rato leyendo el TL? quizás el contador se sobrecarga (ni idea, sólo un pensamiento)

ANTONIO · Hace 3 años

ESTE CODIGO FUNCIONARIA SI EN BES DE QUE EJECUTE ALGO EN EL ARDUINO QUE HABILITE ALGUN GPIO ?

JUANITO TAPIA · Hace 3 años

La función que cumple al arduino es solo de actuador. El erro que me arroja es por efectos de problemas en la librería, pero de igual manera lo lo a probar con los GPIO y subo el código. Y esta funcionando el código, solo que con un tiempo limitado al parecer, lo otro seria ajustar los relojes de la raspberry ya que un amigo lo probo (modelo A) y dijo que haciendo eso no le arrojo más el error.

antonio · Hace 3 años

gracias por responder hare pruebs y te cuento

Arduino + Python + Raspberry Pi + Twitter: TweetMotica - Raspberry Pi | Python · Hace 3 años

[…] Seguir leyendo el tutorial | GeekyTheory […]