sábado, 4 de junio de 2016

Programándole un feedback a un servidor web Arduino

     Siguiendo con los artículos anteriores sobre la programación de Arduino como servidor web y la programación en Java de una consola de comunicación que nos sirva tanto del puerto serie como comunicaciones ethernet, ahora traigo este código el cual prepara un feedback del servidor web para que los clientes tanto web como consolar Java puedan saber el estado de las salidas de nuestro dispositivo Arduino.

     Las siguientes líneas corresponden a una web tipo (descarga ejemplo web):
<!DOCTYPE html>
<html>
    <head>
        <title>T&iacute;itulo</title>
    </head>
    <body>
        <form method="get" action="">
            ...
        </form>
        <script type='text/javascript'>


            L5=0;
            L6=0;
            L7=1;
            A=100;
            if (L5 == 1)
                document.write("Pin 5: encendido.<br>");
            else
                document.write("Pin 5: apagado.<br>");
            if (L6 == 1)
                document.write("Pin 6: encendido.<br>");
            else
                document.write("Pin 6: apagado.<br>");
            if (L7 == 1)
                document.write("Pin 7: encendido.<br>");
            else
                document.write("Pin 7: apagado.<br>");
           
            document.write("Pin 9 (anal&oacute;gico): " + A + "<br>");
           
            var URLactual = window.location;
            var patron = /^http:\/\/192.168.0.20\/$/i; 
            if (!patron.test(URLactual))
                window.location='http://192.168.0.20/';
        </script>
    </body>
</html>

     Las siguientes líneas corresponden a la código Javascript embebidas en el código de Arduino (descarga código fuente control_leds.zip):
          // Codigo con metadatos
          client.println("<script type='text/javascript'>");
         
          client.println("var URLactual = window.location;");
          //client.println("var patron = /^http:\/\/192.168.0.20\/$/i;");
          //client.println("if (!patron.test(URLactual))");
          //client.println("      window.location='http://192.168.0.20/';");         
          client.println("document.write(URLactual + '<br><br>');");
         
          //pinString = String(digitalRead(5));
          client.println("L5="+String(digitalRead(5))+";");
          client.println("L6="+String(digitalRead(6))+";");
          client.println("L7="+String(digitalRead(7))+";");
          if (lastValueA.length() == 1)
            client.println("A=00"+lastValueA+";");  // String(analogRead(9))
          if (lastValueA.length() == 2)
            client.println("A=0"+lastValueA+";"); 
          if (lastValueA.length() == 3)
            client.println("A="+lastValueA+";"); 
           
          // Aunque Javascript acepta la comparacin de igualdad de valor y tipo
          // si ponemos: if (L5 === 1) el ejemplo no trabaja correctamente
          client.println("if (L5 == 1)");
          client.println("  document.write('<b>Pin 5: encendido.</b><br>');");
          client.println("else");
          client.println("  document.write('Pin 5: apagado.<br>');");
          client.println("if (L6 == 1)");
          client.println("  document.write('<b>Pin 6: encendido.</b><br>');");
          client.println("else");
          client.println("  document.write('Pin 6: apagado.<br>');");
          client.println("if (L7 == 1)");
          client.println("  document.write('<b>Pin 7: encendido.</b><br>');");
          client.println("else");
          client.println("  document.write('Pin 7: apagado.<br>');");
         
          // La siguiente linea no funciona bien.
          //client.println("  document.write('Pin 9 (analógico): " + lastValueA +"<br>');");
          client.println("document.write('Pin 9 (anal&oacute;gico): <b>' + A +'</b><br>');");
         
          /*
              Cuidado con tener errores en el codigo Javascript puede hacer que
              no funcione la web en el cliente               
           */
          client.println("</script>");

     El siguiente código corresponde a la búsqueda de un patrón dentro de una cadena de carácteres (descarga código fuente RegExp.zip):
public static void main( String args[] ){
public static void main( String args[] ){
    String linea = "L7=1;";
    String expresionL7 = "L7=";
    int mNumber;
    char caracter;

    Pattern regla = Pattern.compile(expresionL7);

    // Objeto para comprobar las coincidencias
    Matcher mCoincidencia = regla.matcher(linea);
    if (mCoincidencia.find()) {
        System.out.println("Found value: " + mCoincidencia.group(0) );
        try {
            mNumber = Integer.parseInt(""+linea.charAt(mCoincidencia.group(0).length()) );

            caracter = linea.charAt(3);
            System.out.println("Caracter: " + caracter);

            if (mNumber == 1)
                System.out.println("El LED 7 está encendido.");
            else
                System.out.println("El LED 7 está apagado.");
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
        System.out.println("NO MATCH");
    } 
}

     Y por último el código de búsqueda de patrón en nuestra consola Java, repetido tantas veces como pines de Arduino estén configurados para salida de datos (descarga código fuente Consola.zip):
String expresionL5 = "L5=";
String expresionL6 = "L6=";
String expresionL7 = "L7=";
String expresionA  = "A=";
int mNumber;
String mNumberA = "";

Pattern reglaL5 = Pattern.compile(expresionL5);
Pattern reglaL6 = Pattern.compile(expresionL6);
Pattern reglaL7 = Pattern.compile(expresionL7);
Pattern reglaA = Pattern.compile(expresionA);           

while ((linea = in.readLine()) != null) {
    System.out.println(linea);
    // Objeto para comprobar las coincidencias
    Matcher mCoincideL5 = reglaL5.matcher(linea);
    if (mCoincideL5.find()) {
        System.out.println("Found value: " + mCoincideL5.group(0) );
        try {
            mNumber = Integer.parseInt(""+linea.charAt(mCoincideL5.group(0).length()) );

            if (mNumber == 1) {
                jTextAreaTransferencias.append("El LED 5: encendido.\n");
            } else {
                jTextAreaTransferencias.append("El LED 5: apagado.\n");
            }
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
       // System.out.println("NO MATCH");
    }
    // Comprobar LED 6
    Matcher mCoincideL6 = reglaL6.matcher(linea);
    if (mCoincideL6.find()) {
        System.out.println("Found value: " + mCoincideL6.group(0) );
        try {
            mNumber = Integer.parseInt(""+linea.charAt(mCoincideL6.group(0).length()) );

            if (mNumber == 1) {
                jTextAreaTransferencias.append("El LED 6: encendido.\n");
            } else {
                jTextAreaTransferencias.append("El LED 6: apagado.\n");
            }
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
        //System.out.println("NO MATCH");
    }
    // Comrpobar LED 7
    Matcher mCoincideL7 = reglaL7.matcher(linea);
    if (mCoincideL7.find()) {
        System.out.println("Found value: " + mCoincideL7.group(0) );
        try {
            mNumber = Integer.parseInt(""+linea.charAt(mCoincideL7.group(0).length()) );

            if (mNumber == 1) {
                jTextAreaTransferencias.append("El LED 7: encendido.\n");
            } else {
                jTextAreaTransferencias.append("El LED 7: apagado.\n");
            }
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
        //System.out.println("NO MATCH");
    }
    // Valor LED con salida analógica
    Matcher mCoincideA = reglaA.matcher(linea);
    if (mCoincideA.find()) {
        System.out.println("Found value: " + mCoincideA.group(0) );
        try {
            mNumberA = ""+linea.charAt(mCoincideA.group(0).length())+linea.charAt(mCoincideA.group(0).length()+1)+linea.charAt(mCoincideA.group(0).length()+2);

            jTextAreaTransferencias.append("Valor LED analógico: "+ mNumberA +"\n");
        } catch(Exception Ex) {
            System.out.println("Excepción: " + Ex);
        }
    } else {
        //System.out.println("NO MATCH");
    }
}


     Solo deciros que tiene un pequeño problema en la actualización de datos ya que en el momento de realizar la petición no muestra el último valor cambiado (problemas entre la petición GET y la recepción de datos, quizás prematura, de los clientes). Pero el código es totalmente válido y funcional.

     @eltiopacote      @pacovalverdecom
Listado de artículos: http://www.pacovalverde.es/indice/

Artículos relacionados:
Entrada 129 - Enviar comandos vía ethernet a Arduino con Java 3/X
Entrada 128 - Mi primera clase en YouTube sobre Java y Swing
Entrada 126 - Seguimiento del proyecto Arduino ethernet SD + Java
Entrada 124 - Programando una consola en Java con NetBeans 2/X
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 120 - Proyecto Arduino ethernet SD + consola en Java 1/X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

No hay comentarios:

Publicar un comentario