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

Otra vez más resuelvo una de vuestras dudas y es como podemos recibir con una Ethernet Shield un número procedente de una página web, por ejemplo de un formulario. Quizá la calve de gestionar número 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 y la cual 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 para 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
Enrique Gómez
Amante de la ingeniería electrónica, de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars desde el principio. Puedes saber más sobre mi y sobre mis trabajos en enrique.rinconingenieril.es
Artículos relacionados
Deja un comentario