• Autor de la entrada:
  • Categoría de la entrada:Arduino

Cuantos habéis soñado con poder tener en un mismo Arduino dos o tres páginas web corriendo a la vez, esto realmente es un mundo de posibilidades, el ejemplo más típico es montar dos páginas, una para control y otra para administración, podemos preparar la de control con los botones, enlaces y funciones que permitan que un usuario sin conocimientos técnicos gestione la máquina/instalación y montar la página de administración con las funciones que solo un técnico puede modificar (por ejemplo podrían ser funciones de calibración, de depuración, etc.)

Si analizamos los códigos que tenemos de otros tutoriales, nos vamos a dar cuenta que siempre tenemos una línea que es la clave de este nuevo rompecabezas «» puesto que esta nos permite definir el «servidor» en Arduino y lo que es aun más importante definir el puerto en el que vamos a trabajar.

Una vez que sabemos esto solo nos queda usar la mejor función desarrollada en la historia de la informática el «CopyPaste», es decir vamos a copiar y a pegar el código duplicando nuestro servidor y abriendo dos puertos distintos.

En el código de ejemplo que vemos a continuación mezclamos las webs de dos tutoriales anteriores en los que mostrábamos la temperatura y controlábamos un relé usando una página web, por lo que te recomiendo que eches un vistazo a los tutoriales anteriores: control de temperatura y control de relés

Vídeo explicativo

El código que usamos

/*

Ejemplo sobre uso de libreria ethernet
para crear dos páginas web.

*/

#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 server(80);
EthernetServer server2(81);

//Variables de control
int rele = 7;

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

void loop()
{
//Leemos el valor analógico
float temperatura = analogRead(0);
//Calculamos la temperatura
temperatura = ((5.0*temperatura*1000.0/1024.0)-500)/10;
//Imprimimos la temperatura usando el puerto serie
Serial.println(temperatura);
delay(1000);
// Esperamos que venga algún cliente web al puerto 80
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
//Si ha terminado la petición del cliente
if (c == 'n' && currentLineIsBlank) {
//Enviamos la cabecera web
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

//Mostrqamos la temperatura
client.print("La temperatura es ");
client.print(temperatura);
client.println("<br />");

break;
}
if (c == 'n') {
currentLineIsBlank = true;
}
else if (c != 'r') {
currentLineIsBlank = false;
}
}
}
// Darle un respiro al navegador web para recibir los datos
delay(1);
//Cerrar conexión
client.stop();
}
//Cerrar sesión en puerto 80

// Esperamos que venga algún cliente web al puerto 81
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("?encender") >0)
{
digitalWrite(rele,HIGH);
}
if(readString.indexOf("?apagar") >0)
{
digitalWrite(rele,LOW);
}
//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>Bienvenido al control de reles</h2> <br> Clic en los enlace para encender o apagar: <br> <a href='./?encender'>Encender</a> - <a href='./?apagar'>Apagar</a>  </center>");
cliente.println("<br />");

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();
}
}

Enrique Gómez

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 www.enriquegomez.me