viernes, 13 de julio de 2012

Servidor WEB desde cero. Monitorización(III)

Aunque pensaba que en una sola entrada podría explicar todo lo referente al firmware del servidor web, me he dado cuenta que si quiero explicarlo bien deberé hacerlo en varias entradas. En las entradas anteriores he hablado de, en primer lugar de los materiales que vamos a utilizar, y en segundo lugar os hablé de como modificar el stack para utilizar un PIC de una familia diferente a la familia por defecto, y como introducir una página web en nuestro micro. El siguiente paso es la monitorización, es decir, poder observar variables del microcontrolador desde la interfaz web. Para ello tenemos que hacer dos cosas, en primer lugar modificar nuestra página web para que incluya variables dinámicas, y en segundo lugar, modificar el firmware para que el micro de valor a esas variables dinámicas.
Lo primero que vamos a hacer es modificar nuestra página web para introducir en ella variables dinámicas. Estas variables, cuando se cargue la página, esta le pedirán al micro el valor de esas variables, este se las devolverá y aparecerán en la página web. Incluir variables dinámicas en páginas web es tan fácil como poner el nombre de la variable de esta forma: ~nombre_variable~, por ejemplo:
<span>Estado de la entrada : ~led~</span>
De esta forma, cuando el micro llegue a esta línea, sustituirá el texto ~led~, por lo que nosotros queramos. La página quedará de la siguiente manera.

image
Bien, una vez preparada la página web, tenemos que modificar el firmware del micro para que sea capaz de sustituir el nombre de esas variables, por su valor. Para ello tenemos que modificar el archivo CustomHTTPApp.c. En archivo se encuentran las callback, las cuales son llamadas a funciones que darán valor a las variables dinámicas. Las Callback tienen la siguiente forma:

void HTTPPrint_NombreVariable(void)
{    
TCPPutROMString(sktHTTP, [valor asignado]);
}
Hay que tener en cuenta que por ethernet solo podemos enviar strings, por lo que utilizaremos bastantes las sentencias del tipo itoa. Por ejemplo, si queremos que la variable led valga “on” cuando el led1 este encendido, y valga “off” cuando el led1 esté apagado, sería algo así.

void HTTPPrint_led(void)
{    
TCPPutROMString(sktHTTP, (LED1_IO?"ON":"OFF"));
}
y si queremos, por ejemplo mostrar una temperatura que adquirimos desde un sensor analógico sería algo así:

void HTTPPrint_temperatura(void)
{    
    BYTE AN0String[8];    
    unsigned int ADval;    
    WORD ADval_ch;    
    ADCON0 = 0x02;    
    while(ADCON0bits.GO);        
    ADval = ADRESH;    
    ADval = ADval * 330;    
    ADval = ADval / 255;   
    ADval = ADval - 50;    
    ADval_ch = (WORD)ADval;    
    uitoa(ADval_ch, AN0String);       
    TCPPutString(sktHTTP, AN0String);
}
De forma que nuestra página quedará se verá de la siguiente forma:
image
En la próxima entrada os explicaré el tema de control mediante WEB, que aunque es sencillo también, lleva más tiempo que la monitorización.

13 comentarios:

  1. Te está quedando muy bien el tuto, no se si se, puede pero si fuera posible utilizar tecnologia AJAX para tener una página dinámica mediante Javascript ya sería...y encima se reduciría el consumo del aparatito que es el mayor defecto de los servidores web aunque si no se va a alimentar por bateria tampoco tiene tanto problema.
    Cuando hice mi PFC de WSN mi primera opción fué esa, pero al final lo acabe cambiando para utilizar los nodos de la red como clientes por el tema del consumo y estaban todos conectados a un servidor que almacenaba las medidas en una base de datos.
    Te lo digo por si te sirve de inspiración ;)
    Un saludo

    ResponderEliminar
  2. Si que puedes utilizar AJAX, de hecho el ejemplo que trae microchip lo utiliza y mediante un archivo "status.xml", donde están todas las variables dinámicas, haces que la página se actualice sola cuando alguna variable cambia. Lo único que pasa es que si de html voy muy justo, de java ni te cuento... jaja pero mientras te quepa en la memoria del micro puedes hacer lo que quieras. En tema de visualización poder utilizar java estaría muy bien. Un saludo!

    ResponderEliminar
  3. Es Javascript, no Java, pese al nombre no se parecen en nada. Creo que HTML, Javascript y CSS va a ser la combinación del futuro, visto como están pegando las aplicaciones Web ultimamente.
    Yo de HTML poco, de Javascript casi nada y AJAX ya es todo un mundo. Pero estaría bien empezar con un proyecto de este tipo ¿Sabes si venden placas con lo que tu has montado ya hechas? No muy caras, que estamos en crisis.

    ResponderEliminar
  4. jaja si que venden pero pese a ser placas muy sencillas son caras, tienes una de OLIMEX, la PIC-WEB (https://www.olimex.com/dev/index.html, que son 30 euros mas 10 o 15 de gastos de envío y utiliza un PIC18F67j60 que incluye ya el controlador web. Por ebay hay una de Sure Electronics que lleva un pic24 y perifericos como LCD y pulsadores y vale 54 dolares, en microchip tienes placas pero caras y la opción que seguro más te gusta, si compras un arduino UNO por ejemplo hay una shield que por ebay vale 12 o 13 dolares que te permite crear un servidor web por ethernet, a parte de tener un slot para tarjetas sd (http://www.ebay.com/itm/Ethernet-Shield-W5100-For-Arduino-2009-UNO-Mega-1280-2560-/270955738702?pt=LH_DefaultDomain_0&hash=item3f1638764e#ht_2396wt_1396), asi que 16 euros de la arduino mas 10 de la ethernet shield, por 25 euros lo tienes todo, tambien hay vendedores que lo venden todo junto. Un saludo

    ResponderEliminar
  5. Compre en Olimex la pic web en Chile y me costo u$s 57 mas u$s 17 el envío a mi país, me decidí a esta placa porque está muy bien documentada con ejemplo de aplicación, esta gente no se guarda nada.
    http://www.olimex.cl/product_info.php?products_id=228&product__name=PIC_WEB_Web_Server_TCP_IP_Development_Board_REV.B
    Amigo el tutorial está quedando muy bueno, y como todo es nuevo para mi me lleva bastante tiempo poder asimilarlo.
    La dirección de correo que tu me diste me da msj de error cuando te envío un mail.
    Saludos!!

    ResponderEliminar
  6. pues esa si que está ya bien, prueba a esta pablet87@hotmail.com. Gracias!

    Un saludo

    ResponderEliminar
  7. Ahora si pude!! te mande mail al de @ono.com, me gustaría saber si llego el material.
    Saludos!

    ResponderEliminar
  8. Si que me llegó. Cuando me mire un poco lo de los comandos AT y entienda el codigo lo publico. Muchas gracias.

    ResponderEliminar
  9. De nada es una manera de agradecerte por este tutorial, cualquier cosa me avisas si tienes alguna duda.
    Saludos!!

    ResponderEliminar
  10. Hola, ahora tengo otro problema.(Todos son problemas).

    He conectado el ENC28J60 a un switch y este a un router y si conecto un PC al switch, desde este se puede hacer ping y acceder a la pagina web a traves del navegador.
    En cambio si conecto el PC al router solo puedo hacer ping, la pagina web no se abre.

    He observado que las luces del switch, en la boca que esta conectado el ENC28J60 solo se enciende el led de link, pero no se enciende la de velocidad(10Mb, 100Mb), sin embargo en la boca del PC se encienden las dos.

    Sabe alguien cual es el problema si hay que modificar algo de velocidades en el codigo?

    Gracias por la ayuda.

    Saludos.

    ResponderEliminar
  11. Hola Roberto! que yto sepa en el código no hay nada referente a la velocidad y demás. Puede que sea problema de las direcciones ip, intenta dejar que sea el router el que le de una dirección al PIC y no poder una preestablecida.
    Un saludo

    ResponderEliminar
  12. Estoy tratando de obtener el valor de la distancia de un sonar.
    La variable es el archivo main.c y es: unsigned long int distancia;
    Que tengo que hacer: (WORD) nuevo = distancia;
                                     final = (WORD) nuevo;?

    ¿Me pueden ayudar ¿cómo debo hacer?

    ResponderEliminar
    Respuestas
    1. Hola!, no recuerdo como funciona el sensor, hace mucho tiempo que no lo utilizo así que en eso no puedo ayudarte, lo siento.
      Un saludo.

      Eliminar