Este post es la continuación de Comunicando dos placas Arduino usando WiFi UDP, y donde usaremos las funciones que aprendimos en Conversión de cadenas de texto en matrices (arrays) para enviar una cadena de texto que tenga dos variables de tipo entero y la otra placa responderá con un valor de temperatura.
Para el ejercicio usare dos placas Arduino MKR1000.
Comencemos con el sketch de la placa transmisora que tiene el joystick.
Ejemplo 1 – Placa transmisora con un joystick
#include <SPI.h>
#include <WiFi101.h>
#include <WiFiUdp.h>
int status = WL_IDLE_STATUS;
char ssid[] = "Nombredelared"; // El nombre de tu red wifi
char pass[] = "contraseña"; // la clave de tu red wifi
unsigned int localPort = 2390; // numero del puerto de la placa para recibir mensajes
IPAddress ipremoto(192, 168, 1, 131); //direccion IP de placa remota
unsigned int puertoRemoto = 1500; //numero de puerto de la placa remota
char packetBuffer[20]; // buffer para guardar el paquete de datos entrantes
char convBuffer[4]; // bufer para extraer cada dato de entrada
char msg[20]; // bufer de datos de salida
WiFiUDP Udp; //nombre de la instancia
void setup() {
//Inicia el puerto serial y espera hasta que se complete:
Serial.begin(9600);
while (!Serial) {
; // espera la conexion del puerto serie. Solo es necesario para placas con puerto USB nativo
// Remover este while si la placa no estara conectada al ordenador
}
// revision de la presencia del shield de comunicación:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("El shield WiFi no esta presente");
// no continua:
while (true);
}
if (status != WiFi.status()) {
status = WiFi.status();} // actualiza la variable status
// intenta conectar a la red wifi:
while ( status != WL_CONNECTED) {
Serial.print("Conectando a SSID: ");
Serial.println(ssid);
// Conecta a una red WPA/WPA2:
status = WiFi.begin(ssid, pass);
// espera 10 segundos por la coneccion:
delay(10000);
}
Serial.println("Conectado a wifi");
printWiFiStatus();
Udp.begin(localPort); // Inicia el socket WiFiUDP, y escucha el puerto local
}
void loop() {
// lee los valores del joistick y arma el mensaje
int valorx = analogRead(A1); //leo el valor del eje x
int valory = analogRead(A2); //leo el valor del eje y
sprintf(msg, "%4i%4i", valorx,valory); // Crea una cadena de texto con los valores de los ejes
Serial.println(msg); //Imprimo la cadena de texto al monitor serie
Udp.beginPacket(ipremoto, puertoRemoto); //configura el envio del paquete de datos
Udp.write(msg); //coloca en el buffer los datos de salida
Udp.endPacket(); //envia el paquete de datos
// recepcion de datos - recibira un paquete de 4 caracteres con el valor de temperatura
int packetSize = Udp.parsePacket(); // pregunto si hay paquetes de datos por leer
if (packetSize)
{
Serial.print("Tamaño del paquete recibido ");
Serial.println(packetSize);
Serial.print("De ");
IPAddress remoteIp = Udp.remoteIP();
Serial.print(remoteIp);
Serial.print(", puerto ");
Serial.println(Udp.remotePort());
// lee el paquete y lo guarda en el buffer
int len = Udp.read(packetBuffer, 20); //lee el paquete y lo guarda en el buffer
if (len > 0) packetBuffer[len] = 0; // coloca el caracter null al final de la cadena
Serial.println("Contents:");
Serial.println(packetBuffer); // imprime el contenido del paquete de datos
convBuffer[0]=packetBuffer[0];
convBuffer[1]=packetBuffer[1];
convBuffer[2]=packetBuffer[2];
convBuffer[3]=packetBuffer[3];
convBuffer[4]=0; // coloca el caracter null al final de la cadena
int temp=atoi(convBuffer); //convierte la cadena de caracteres a entero
// muestra el valor de temperatura recibido
Serial.print("El valor extraido es:");
Serial.println(temp);
float voltage = (temp / 1024.0) * 3.3;
float temperature = (voltage - .5) * 100;
Serial.println("La temperatura remota es de ");
Serial.print(temperature);
Serial.println(" grados Celsius");
}
delay(200);
}
void printWiFiStatus() {
// imprime el nombre de la red a la cual estas conectado:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// imprime la direcion IP del shield o placa con la cual estas conectado:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// imprime la intensidad de señal recibida:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
Y el sketch de la placa receptora con los servos y el sensor de temperatura.
Ejemplo 2 – Placa receptora con servos y sensor de temperatura
#include <SPI.h>
#include <WiFi101.h>
#include <WiFiUdp.h>
#include <Servo.h>
Servo servox; // crea un objeto servo para x
Servo servoy; // crea un objeto servo para y
int status = WL_IDLE_STATUS;
char ssid[] = "Nombredelared"; // El nombre de tu red wifi
char pass[] = "contraseña"; // la clave de tu red wifi
unsigned int localPort = 1500; // numero del puerto de la placa para recibir mensajes
char packetBuffer[20]; // buffer para guardar el paquete de datos entrantes
char convBuffer[4];// bufer para extraer cada dato de entrada
char msg[20]; //bufer de datos de salida
WiFiUDP Udp; //nombre de la instancia
void setup() {
servox.attach(2); // asocia el servo en el pin D2 al objeto servo
servoy.attach(3); // asocia el servo en el pin D3 al objeto servo
//Inicia el puerto serial y espera hasta que se complete:
Serial.begin(9600);
while (!Serial) {
; // espera la conexion del puerto serie. Solo es necesario para placas con puerto USB nativo
// Remover este while si la placa no estara conectada al ordenador
}
// revision de la presencia del shield de comunicación:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("El shield WiFi no esta presente");
// no continua:
while (true);
}
if (status != WiFi.status()) {
status = WiFi.status();} // actualiza la variable
// intenta conectar a la red wifi:
while ( status != WL_CONNECTED) {
Serial.print("Conectando a SSID: ");
Serial.println(ssid);
// Conecta a una red WPA/WPA2:
status = WiFi.begin(ssid, pass);
// espera 10 segundos por la coneccion:
delay(10000);
}
Serial.println("Conectado a wifi");
printWiFiStatus();
Udp.begin(localPort); // Inicia el socket WiFiUDP, y escucha el puerto local
}
void loop() {
// recepcion de datos - recibira un paquete de 8
// caracteres con los valores de "x" y "y" del joystick
int packetSize = Udp.parsePacket(); // pregunto si hay paquetes de datos por leer
if (packetSize)
{
Serial.print("Tamaño del paquete recibido ");
Serial.println(packetSize);
Serial.print("De ");
IPAddress remoteIp = Udp.remoteIP();
Serial.print(remoteIp);
Serial.print(", puerto ");
Serial.println(Udp.remotePort());
// lee el paquete y lo guarda en el buffer
int len = Udp.read(packetBuffer, 20); //lee el paquete y lo guarda en el buffer
if (len > 0) packetBuffer[len] = 0; // coloca el caracter null al final de la cadena
Serial.print("Contents:");
Serial.println(packetBuffer); // imprime el contenido del paquete de datos
convBuffer[0]=packetBuffer[0];
convBuffer[1]=packetBuffer[1];
convBuffer[2]=packetBuffer[2];
convBuffer[3]=packetBuffer[3];
convBuffer[4]=0; // coloca el caracter null al final de la cadena
int valServox=atoi(convBuffer); //convierte la cadena de caracteres a entero
convBuffer[0]=packetBuffer[4];
convBuffer[1]=packetBuffer[5];
convBuffer[2]=packetBuffer[6];
convBuffer[3]=packetBuffer[7];
convBuffer[4]=0; // coloca el caracter null al final de la cadena
int valServoy=atoi(convBuffer); //convierte la cadena de caracteres a entero
// muestra los valores recibidos
Serial.print("El valor extraido de X es:");
Serial.println(valServox);
Serial.print("El valor extraido de Y es:");
Serial.println(valServoy);
// proceso los datos y los envio a los servos
valServox = map(valServox, 0, 1023, 0, 180); // escalo los datos de 0 a 180
servox.write(valServox); // posiciono el servo de acuerdo al valor recibido
valServoy = map(valServoy, 0, 1023, 0, 180); // escalo los datos de 0 a 180
servoy.write(valServoy); // posiciono el servo de acuerdo al valor recibido
//envio la temeratura de respuesta
int temp = analogRead(A1); //leo el sensor de temperatura
sprintf(msg, "%i", temp); // Crea una cadena de texto con el valor
Serial.print("El valor de temperatura enviado es: "); //Imprimo la cadena de texto al monitor serie
Serial.println(msg); //Imprimo la cadena de texto al monitor serie
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); //configura el envio del paquete de datos
Udp.write(msg); //coloca en el buffer los datos de salida
Udp.endPacket(); //envia el paquete de datos
}
}
void printWiFiStatus() {
// imprime el nombre de la red a la cual estas conectado:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// imprime la direcion IP del shield o placa con la cual estas conectado:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// imprime la intensidad de señal recibida:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
