Una de las mejores características de la electrónica es su capacidad de lograr grandes cosas con conceptos simples. En este artículo te quiero mostrar cómo lograr la comunicación entre un arduino y una aplicación WPF por medio de un puerto serial.
La aplicación de Arduino
En el caso de Arduino, la base radica en la clase Serial. Esta clase cuenta con un método de gran utilidad, es el método ReadString() el que te permitirá todo lo que necesitas. El código es simple.
const int myRelee = 8; String c; void setup() { pinMode(myRelee, OUTPUT); Serial.begin(9600); } void loop() { c = Serial.readString(); if(c == "Foco1On") { digitalWrite(myRelee, HIGH); Serial.println("Rele encendido"); } else if (c == "Foco1Off") { digitalWrite(myRelee, LOW); Serial.println("Rele apagado"); } delay(1000); } |
Primero, una constante que servirá para indicar el pin que utilizarás, es importante que recuerdes el buadrate que estableces con el método Begin(), como puedes ver todo se trata acerca de una simple sentencia de selección que se basará en una comparación de cadenas. Puse un relevador de corriente para indicar que en función de la comparación el relevador se prenda o se apague. El diagrama es el siguiente.
Ya que tienes listo tu proyecto es necesario que conozcas el puerto que el IDE de Arduino está utilizando para comunicarse con tu tarjeta. Para ello, lo que debes hacer es ir a Tools > Port y ahí podrás ver el nombre que necesitas.
Ahora que tu solución está lista, puedes probarla desde el Serial del mismo IDE.
La solución desde Visual Studio
Inicia una nueva aplicación de WPF, después de crear el proyecto solo agrega un botón, nada del otro mundo, a este botón debes agregarle un manejador de eventos para el evento “Click”.
<Grid> <Button x:Name="btnControlFocoUno" Content="Encender foco uno" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="153" Height="36" Click="btnControlFocoUno_Click"/> </Grid> |
En el lado de C# declara dos variables, una de tipo SerialPort (requieres agregar el espacio de nombres System.IO.Ports) y una variable booleana, en el constructor, establece la configuración del puerto serial.
SerialPort puertoArduino; bool estaPrendidoFoco1 = false; public MainWindow() { InitializeComponent(); puertoArduino = new SerialPort(); puertoArduino.PortName = "COM3"; //aquí pones el nombre del puerto serial que sacaste de Arduino puertoArduino.BaudRate = 9600; //el baudrate es el mismo que usas en el IDE de Arduino puertoArduino.Handshake = Handshake.None; } |
En el manejador de eventos, primero abres el puerto, después una sentencia de selección escribes el valor que deseas, inviertes el valor booleano y cierras el puerto. El código, al final, completo queda de la siguiente manera.
using System.Windows; using System.IO.Ports; namespace ControlSerial { public partial class MainWindow : Window { SerialPort puertoArduino; bool estaPrendidoFoco1 = false; public MainWindow() { InitializeComponent(); puertoArduino = new SerialPort(); puertoArduino.PortName = "COM3"; puertoArduino.BaudRate = 9600; puertoArduino.Handshake = Handshake.None; } private void btnControlFocoUno_Click(object sender, RoutedEventArgs e) { puertoArduino.Open(); if (estaPrendidoFoco1) { puertoArduino.Write("Foco1Off"); } else { puertoArduino.Write("Foco1On"); } puertoArduino.Close(); estaPrendidoFoco1 = !estaPrendidoFoco1; } } } |
El resultado es el siguiente.