Publicado por el 26 marzo, 2016 Deja tus dudas en los comentarios
Dificultad bajaComplejidad baja
CC BY-SA 4.0

Recibir un número procedente de una página web, por ejemplo de un formulario, no tiene porque ser un suplicio. Quizá la calve de gestionar números en Arduino Ethernet está en comprender que podemos analizar cadenas de caracteres.



Empezamos con el HTML

En este caso crearemos una página web que alojaremos en el propio Arduino. Esta consistirá en un formulario con método get, que quedará como puedes ver a continuación.

<form action="/" method="GET">
<input type="number" name="temp">
<input type="submit">
</form>

Al formulario anterior tendremos que añadirle la estructura normal de una página HTML, ya sabes: html, head y body.

Si el HTML te pilla de sorpresa y te pierdes con ello, te recomiendo altamente que busques algo de información en Internet o en algún libro, para que puedas ir entendiendo poco a poco todo el código HTML que te encuentres en este tipo de tutoriales. Tienes que tener en cuenta que cuando hacemos este tipo de micro-proyectos estamos mezclando ciertos conocimientos que ya conocemos de Arduino con una pequeña base de HTML, puesto que es este último el que genera la interfaz gráfica que ve el usuario del proyecto.

¿Cómo funciona?

Cuando un usuario accede a la web introduciendo la dirección IP de Arduino en un navegador web, le aparecerá la página web que se forma gracias al HTML y será entonces cuando podrá ver el formulario en el que introducir el número, tras introducirlo solo quedará pulsar el botón de enviar.

Pero ¿qué ocurre al pulsar el botón? El navegador que estemos usando envía una petición al servidor, en este caso el servidor es Arduino y debido a que en el formulario esta marcado el método como GET, los datos los recibiremos dentro de la petición GET que habrá que analizar.


Analizar la petición GET

Hasta ahora en los análisis de artículos anteriores simplemente habíamos verificado si recibíamos o no una palabra y actuábamos en consecuencia. Pero ahora vamos a extraer un número de esa petición y lo haremos usando indexOf().

Este análisis lo haremos suponiendo que el número que esperamos recibir es de dos cifras, decenas y unidades. Para trabajar con más o menos cifras tendremos que modificar la estructura y ajustarla al número de cifras o automatizarlo para que el código pueda analizar cuantas cifras hemos enviado.

Un detalle importante es que al recibir el número con readString[posicion+1] en realidad no recibimos el número, si no que recibimos el carácter ASCII que representa a ese número, y debido a que en ASCII el 0 se representa con el decimal 48, a todos los dígitos, le restaremos 48. Vemos un ejemplo: si recibimos un 49 como carácter, 49-48=1, será el número 1.



if(readString.indexOf("Temp")>0){
int posicion = readString.indexOf("=");
int n = ((readString[posicion+1] - 48) * 10) + (readString[posicion+2] - 48);
}

Todo junto

Si unimos todas las pequeñas partes obtendremos el código final que quedará así.

#include <SPI.h>
#include <Ethernet.h>

//Ponemos la dirección MAC e IP que queremos que use nuestro Arduino para conectarse al Router
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

String readString;

//Definimos que el puerto HTTP sera el 80
EthernetServer server2(80);

//Variables de control
int rele = 7;

void setup()
{
//Iniciar la conexión de red y serie
Ethernet.begin(mac, ip);
server2.begin();
}

void loop()
{

// Esperamos que venga algún cliente web al puerto 80
EthernetClient cliente = server2.available();
if (cliente) {
boolean currentLineIsBlank = true;
while (cliente.connected()) {
if (cliente.available()) {
char c = cliente.read();
if (readString.length() < 100) {
//Almacenar caracteres en un string
readString += c;
}
//Si ha terminado la petición del cliente
if (c == 'n') {
if (readString.indexOf("temp") >0){
int posicion = readString.indexOf("=");
int n = ((readString[posicion+1] -48) * 10) + readString[posicion+2] -48;
}
//Enviamos la cabecera web
cliente.println("HTTP/1.1 200 OK");
cliente.println("Content-Type: text/html");
cliente.println();

//Mostrqamos la web de control
cliente.println("<center> <h2>All numbers</h2> ");
cliente.println("<br> <form action='/' method='get'>");
cliente.println("<input type='number' name='temp'>");
cliente.println("<input type='submit'>");
cliente.println("</form>");
cliente.println("</center>");

break;
}

}
}
// Darle un respiro al navegador web para recibir los datos
delay(1);
//Limpiar String para proxima etición HTTP
readString="";
//Cerrar conexión
cliente.stop();
}
}



Sobre el autor
Ingeniero Electrónico Industrial y Automático, amante de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars, cuenta más de lo que parece. Puedes saber más sobre mi y sobre mis trabajos en enrique.rinconingenieril.es
Artículos relacionados
Deja un comentario