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 los números, 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 para rescatar los números
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(); } }
Quizá te interesa saber cómo controlar un relé con Arduino Ethernet