2020/10/15

Modificaciones al display serial

Había hecho un display serial  para poder ver las temperaturas y la velocidad del controlador de ventilación de un switch y cuando me preparé para comenzar a registrar los valores para estudiarlos y poder parametrizar correctamente al algoritmo me encontré con algunos problemas.

Saga completa

 

 

Hardware


El primero, tal como había contado, había sido perder el max232n del poncho educativo debido a falta de pericia. Me pasé entonces al poncho PLC pero no me sirve pues me complica agregar el sensor de temperatura ambiental que necesito como referencia.


Volví al poncho educativo y le saqué el chip, suponiendo que no había roto todo el chip si no la mitad, pero no resultó. Si supiera un poco más o tuviera más dedicación podría haber medido como corresponde, pero fuí directo a "recablear" para usar la mitad supuestamente sana, no funcionó, mala suerte, algún día conseguiré el repuesto, le conecté al poncho educativo el adaptador.


Edu-ciaa-nxp en todo su esplendor
Edu-ciaa-nxp en todo su esplendor

 

En el display las dos temperaturas internas y la externa en la primera linea, en la segunda las temperaturas de referencia y la velocidad, tapada, dice 0. Y luego un "#" que alterna con "@" como heartbeat.


A la izquierda el sensor externo, atras el switch.



La fuente...

 
...calienta más que el resto, cambié uno de los sensores de lugar, lamentablemente no tomé nota de cuál, luego usaré el "peso" para darle mayor o menor participación en las decisiones.



Temperatura ambiental


El display serial tenía que mostrar en la pantallita los valores y dejar pasar los mensajes ida y vuelta y ahora se le agrega incorporar su propia medición. Esto lo resolví agregando un sensor de temperatura a la EDU-CIAA-NXP y actualizando el mensaje JSON recibido desde el controlador.

 

 

La información y el formato de los mensajes


Aquí cometí varios errores. Para comenzar debí haber generado JSON, pues tiene una fácil lectura para el humano y es inmediatamente integrable a cualquier aplicación, más que espero que el 99.99% de los mensajes sean leidos por un proceso, no por humanos.

Otro, siguiendo en la linea de centrada en el usuario, no estoy publicando en cada mensaje la parametría y tengo que pedirla explícitamente. Esto me complica asociar los valores medidos con esta parametría.

En términos de ancho de banda, más que tengo un solo sensor y es por UART que es como una red interna, no me hace diferencia. Esto no significa que de cada mensaje almacene todos los datos, pero esa decisión la hago al momento de almacenar, no de emitir.

Dado que no quiero estar abriendo y cerrando el switch para reprogramar, debo ingeniármelas con lo que hay adentro. Recordemos: hice un sistema parametrizable justamente para evitar reprogramar, hasta que haya una nueva versión, debo lidiar externamente con todo.

Una posibilidad es sumarle la tarea al display serial: como ya tiene que tomar el mensaje que viene y agregarle su propia medición, puede tambien cuando ve pasar la parametría tanto al comienzo como ante cualquier cambio, tomar nota y agregarla.

Tambien puede hacer la conversión a JSON.

La otra es del lado de la compu, que tiene la ventaja de ser mucho más fácil... recalculando... cuál es la gracia de hacerlo fácil...?

Listo, va todo a la edu-ciaa y luego que la app decida qué y cómo almacenar.


+----------+             +--------+
| sensores |             | sensor |
+-----+----+             +---+----+
      |                      |
+-----v--+              +----v-----+          +-----+
|        |  medición +  |          | +        |     |
| Switch |  parametría  | edu-ciaa | medición | app |
|        +-------------->          +---------->     |
+--------+              +----+-----+          +-----+
                             |
                         +---v-----+
                         | display |
                         +---------+

 

Lo que había implementado es una FSM que va buscando los mensajes de reporte y al hallarlos extrae la información y la va pasando caracter a caracter al display.

Voy a tener que cambiar de enfoque, leer por lineas. El problema es que se me bloquea en la lectura, debe ser por ello que la sAPI no lo implementa.

Una manera de lidiar con esto sería pasar a FreeRTOS, una experiencia interesante pero quiero hacerlo así.

Lo que hice finalmente es una sencilla FSM que busca '{'. Si no la encuentra imprime en USB. Si la encuentra, comienza a copiar en un buffer hasta que encuentra '}'.


En ese momento, corre este lindo:


sscanf(buffer,"{ \"T1\" : \"%f\", \"H1\" : \"%f\", \"T2\" : \"%f\", \"H2\" : \"%f\", \"CS\" : \"%d\", \"R1\" : \"%d\", \"R2\" : \"%d\", \"W1\" : \"%d\", \"W2\" : \"%d\", \"D2\" : \"%d\", \"D1\" : \"%d\", \"D0\" : \"%d\", \"I1\" : \"%d\", \"I2\" : \"%d\", \"I3\" : \"%d\", \"MS\" : \"%d\", \"SC\" : \"%d\", \"DE\" : \"%d\", \"SI\" : \"%d\"}", &t1, &h1, &t2, &h2, &cs, &temp_ref_1, &temp_ref_2, &weight_1, &weight_2, &decrement_2, &decrement_1, &decrement_0, &increment_1, &increment_2, &increment_3, &min_speed, &scale, &delta_eq, &sample_interval);

 

lee la temperatura ambiental:

 
float tmp_t3;
float tmp_h3;
if( dht11Read(&tmp_h3, &tmp_t3) ) {
   t3 = tmp_t3;
   h3 = tmp_h3;
} else {
   t3 = -1;
   h3 = -1;
}

 

y luego imprime en USB:


sprintf(buffer,"{ \"CS\" : \"%d\", \"T1\" : \"%.2f\", \"H1\" : \"%.2f\", \"T2\" : \"%.2f\", \"H2\" : \"%.2f\", \"T3\" : \"%.2f\", \"H3\" : \"%.2f\", \"R1\" : \"%d\", \"R2\" : \"%d\", \"R3\" : \"%d\", \"W1\" : \"%d\", \"W2\" : \"%d\", \"W3\" : \"%d\", \"D2\" : \"%d\", \"D1\" : \"%d\", \"D0\" : \"%d\", \"I1\" : \"%d\", \"I2\" : \"%d\", \"I3\" : \"%d\", \"MS\" : \"%d\", \"SC\" : \"%d\", \"DE\" : \"%d\", \"SI\" : \"%d\"}", cs, t1, h1, t2, h2, t3, h3, temp_ref_1, temp_ref_2, temp_ref_3, weight_1, weight_2,weight_3, decrement_2, decrement_1, decrement_0, increment_1, increment_2, increment_3, min_speed, scale, delta_eq, sample_interval);

uartWriteString( UART_USB, buffer);

 

 y display:

 

sprintf(lcdOut0, "%.1f %.1f %.1f\0", t1,t2,t3);
sprintf(lcdOut1, "%d   %d   %d   %c\0",  temp_ref_1, temp_ref_2, cs);
lcdClearAndHome();
lcdSendStringRaw(lcdOut0);
lcdGoToXY( 0, 1 );
lcdSendStringRaw(lcdOut1);

 

El código actual esta en github: controlador y display



Salida JSON
Salida JSON












 

 




No hay comentarios:

Publicar un comentario