martes, 22 de abril de 2014

Arduino controlado por Twitter

Este proyecto es un pequeño desafió que tenia pendiente. Consiste en un programa en Visual Basic que lee datos de una Web y los envía al Arduino. Aunque funciona en cualquier Web (que no haya usuarios y contraseñas), lo he enfocado a Twitter, porque me ha gustado la idea de controlar con tweets una placa de Arduino.

 Esta es la placa a controlar, un Arduino Nano,
tiene 4 salidas digitales con un led en cada una.
Para poder filtrar los tweets, he creado una "palabra a buscar" (una especie de hashtag), en este caso he escogido la palabra "PruebaComunicacionTA". El último tweet que contenga esta palabra, es el que enviara la información al Arduino.





Para este caso he enviado el siguiente tweet:

PruebaComunicacionTA +  0101 + T +005
Palabra a Buscar + Estados leds + T Si se quiere temporizar + tiempo en segundos  (El segundo y cuarto led permanecerán 5 segundos encendidos)

Código Arduino:

 
// By: jsslxs 
// 21 de Abrl del 2014

int led1= 12; 
int led2= 10; 
int led3= 8; 
int led4= 6; 

void setup()
{
   pinMode(led1,OUTPUT); 
   pinMode(led2,OUTPUT); 
   pinMode(led3,OUTPUT);
   pinMode(led4,OUTPUT);   
   Serial.begin(9600); //Inicio puerto serie
}

void loop()
{ 
  if (Serial.available())
  { 
     
    delay(100);  //Espera 100ms    
   
    while  (Serial.available()>0) // ejemplo datos recibidos: 0101
    {
      int cuenta=Serial.available();
      int numser[cuenta]; //matriz de bytes 
      for (int i = 0; i < cuenta; i = i++)   
      {
         numser[i]=  Serial.read();
         //Serial.println(i);
         //Serial.write(numser[i]);         
      }
             
      if (numser[0]== '1'){ digitalWrite( led1, HIGH);}  else { digitalWrite( led1, LOW);} 
      if (numser[1]== '1'){ digitalWrite( led2, HIGH);}  else { digitalWrite( led2, LOW);}
      if (numser[2]== '1'){ digitalWrite( led3, HIGH);}  else { digitalWrite( led3, LOW);} 
      if (numser[3]== '1'){ digitalWrite( led4, HIGH);}  else { digitalWrite( led4, LOW);}
      if (numser[4]== 'T') // Timer, si se introduce una T, al cabo de un tiempo la salidas se podran LOW
      {
        int num0 = numser[5]-'0';    
        int num1 = numser[6]-'0';
        int num2 = numser[7]-'0'; 
        int tiempo= (num0*100+ num1*10 + num2) *1000; // en segundos
        
        delay(tiempo);
        
        digitalWrite( led1, LOW);
        digitalWrite( led2, LOW);
        digitalWrite( led3, LOW);
        digitalWrite( led4, LOW);
      }

    }

    Serial.flush();
 }
}   

 


Aquí la Interfaz:
Los números de caracteres a enviar están limitados a 140 como es en un tweet.
El Timer es el tiempo que tardara en leer el último tweet con la palabra a buscar.

Código Visual Basic:
Imports System.Net

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Conectar.Enabled = False
        Conectar.Visible = True
        Desconectar.Enabled = False
        Desconectar.Visible = False

    End Sub


    Private Sub button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Conectar.Click

        Conectar.Enabled = False
        Conectar.Visible = False
        Desconectar.Enabled = True
        Desconectar.Visible = True

        SerialPort1.BaudRate = ComboBox2.SelectedItem 'Velocidad

        SerialPort1.DataBits = ComboBox5.SelectedItem

        If ComboBox3.Text = "None" Then                 'paridad
            SerialPort1.Parity = IO.Ports.Parity.None
        ElseIf ComboBox3.Text = "Odd" Then
            SerialPort1.Parity = IO.Ports.Parity.Odd
        ElseIf ComboBox3.Text = "Even" Then
            SerialPort1.Parity = IO.Ports.Parity.Even
        ElseIf ComboBox3.Text = "Mark" Then
            SerialPort1.Parity = IO.Ports.Parity.Mark
        ElseIf ComboBox3.Text = "Space" Then
            SerialPort1.Parity = IO.Ports.Parity.Space
        End If


        If ComboBox4.Text = "None" Then                 'stopbits
            SerialPort1.Parity = IO.Ports.StopBits.None
        ElseIf ComboBox4.Text = "OnePointFive" Then
            SerialPort1.Parity = IO.Ports.StopBits.OnePointFive
        ElseIf ComboBox4.Text = "One" Then
            SerialPort1.Parity = IO.Ports.StopBits.One
        ElseIf ComboBox4.Text = "Two" Then
            SerialPort1.Parity = IO.Ports.StopBits.Two
        End If

        SerialPort1.PortName = ComboBox1.SelectedItem

        SerialPort1.Open()
        Timer1.Interval = Tiempo.Value * 1000

        Timer1.Start()

    End Sub

    Private Sub Habilitar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Habilitar.Click

        ComboBox1.Items.Clear()
        For Each PuertoDisponible As String In My.Computer.Ports.SerialPortNames
            ComboBox1.Items.Add(PuertoDisponible)
        Next
        If ComboBox1.Items.Count > 0 Then
            ComboBox1.Text = ComboBox1.Items(0)
            Conectar.Enabled = True
            Conectar.Visible = True
        Else
            MessageBox.Show("Ningún puerto encontrado")
            Conectar.Enabled = False
            Conectar.Visible = True
        End If

    End Sub


   
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        Dim n As Integer = 0
        Dim m As Integer = 140
        Dim i As Integer = 0

        n = Len(PalabraAbuscar.Text)
        m = m - n
        NumeroCarac.Maximum = m

        Dim url As WebRequest = WebRequest.Create(Seturl.Text)
        Dim response As WebResponse = url.GetResponse()
        Dim stream As New IO.StreamReader(response.GetResponseStream())

        Urlmostrar.Text = stream.ReadToEnd()

        Dim SearchForThis As String = PalabraAbuscar.Text
        Dim FirstCharacter As Integer = Urlmostrar.Text.IndexOf(SearchForThis)
        num.Text = ""
        While NumeroCarac.Value > i
            num.Text = num.Text & Urlmostrar.Text(FirstCharacter + n + i)
            i = i + 1
        End While
        SerialPort1.Write(num.Text)

    End Sub

    Private Sub Desconectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Desconectar.Click

        Conectar.Enabled = True
        Conectar.Visible = True
        Desconectar.Enabled = False
        Desconectar.Visible = False

        SerialPort1.Close()
        Timer1.Stop()
    End Sub
End Class
 

Descargar proyecto: http://www.4shared.com/zip/ICVVXetfce/Arduino_controlado_por_twitter.html