Sensor de
temperatura
Protocolo TFA
Arduino
Protocolo TFA
Arduino
Mi primera intención era hacer un sensor para una serie de estaciones meteorológicas que tenía sin sensor. Eran de la marca oregon cientific. Esta marca fue una referencia por su buena calidad, pero esta marca fue comprada por otra compañía, y es muy difícil de encontrar sensores, además si se encontraban eran de precio alto, por lo cual no merecía la pena.
Existe muchos modelos, más de 20, y unos no son compatibles con otros.
Hay 3 protocolos de transmisión, pero la documentación es escasa en cuanto a los diferentes sensores.
Existe una documentación que la sacó alguien con ingeniería inversa. Leyendo está documentación encontré que los sensores emiten un byte una variable aleatoria. Después de algunas pruebas, creo que esta variable aleatoria no es tan aleatoria como debería ser. Algunas estaciones base, leen durante algunas horas los sensores perfectamente al resetear los sensores y la estación base, para dejar de leer después, a pesar de que los sensores siguen mandando datos.
Mi sospecha es que la variable aleatoria es una secuencia de bytes que pertenece a un modelo concreto de base, después de ciertas lecturas si no corresponde a la base en concreta, deja de proporcionar dados de ese sensor. Es una forma de asegurarse de que ningún sensor de otra marca ajena funcione en su estación base. Por este motivo no existen sensores chinos compatibles. Desaparecida la marca, ya puedes tirar la estación base.
Como era muy difícil de realizar este tipo de sensores, empecé con otro.
Tengo 3 bases meteorológicas que funcionan con el protocolo TFA, es sencillo y solo transmite temperatura. Solo tengo 1 sensor que leen las 3 estaciones bases, por lo que en este montaje crearé un segundo sensor que funcione en el canal 2.
Existe un programa que lee muchos protocolos de diferentes sensores, desde coches hasta sensores de temperatura. Este programa se llama RTL_433 y utiliza un decodificador USB de televisión digital para la recepción de señales.
Mirando en su código fuente, se puede ver la estructura del protocolo TFA.
Gracias Alexandre Coffignal (rtl_433) por su magnífico programa.
Data layout:
CCCCIIII IIIITTTT TTTTTTTT DDBF
- C: checksum, sum of nibbles - 1
- I: device id (changing only after reset)
- T: temperature
- D: channel number
- B: battery status
- F: first transmission
Como me gusta investigar por mí mismo, voy grabar la señal mediante el programa Gqrx .
Lo analizo con el programa de audio Audacius para la medir los tiempos.
Descubro que los datos se repiten 7 veces y los tiempos son los que se ven en la imagen.
Se puede observar que entre bits el pulso de separación es de 475 micro Segundos. Si se quiere mandar un cero la separación entre pulsos es de 2500 mS, y si es 1 la separación es 5000 mS. La separación entre las 7 repeticiones es de 10mS. Al inicio de la transmisión debe existir un pulso y una separación de 10mS.
Ahora comienza la programación en Arduino para generar este patrón de datos. Mediante un analizador digital barato (7) compruebo la señal generada. Es un patrón de 7 grupos de 4bits, el primero es el la suma de los otros 6 grupos 1 .
A final los diferentes tiempos de la señal son los siguientes.
#define SENAL_ALTA 500
#define SENAL_0 2400
#define SENAL_1 5000
#define SEPARACION 10000
El circuito utiliza el AHT20 como sensor, que utiliza la comunicación I2C. La parte de humedad de este sensor no se utiliza, por lo que me planteo para una revisión posterior el utilizar 18B20 como sensor de temperatura.
Por el pin 13 del arduino se manda la señal a un transmisor de radiofrecuencia en 433MHz cada 36 segundos.
En los pines 3 y 4 se selecciona el canal y el pin 2 se puede utilizar para transmitir la señal cuando se quiera.
El programa está diseñado para la depuración por el puerto serie, aunque el que quiera puede eliminar todo lo relativo a la comunicación serie.
Todo está montado y probado en una protoboard utilizando el arduino nano.
Como lo importante en un sensor es la medición correcta de la temperatura y la autonomía de la batería, utilizo la librería LowPower para dormir el microprocesador mientras no hace nada.
Se puede ver en la imagen los diferentes consumos dependiendo de la alimentación, de cuando está despierto y dormido. Aún así el consumo es alto para un este tipo de sensores.
En este otro montaje solo monto el ATMEGA328 y los componente mínimos.
Esto es otra cosa, el consumo baja hasta los 0.10 mA cuando está dormido, y 7 mA cuando está despierto y transmitiendo.
Haciendo unos cálculo rápidos si demasiada precisión.
Con una batería de 1000mA/H y el micro siempre dormido la autonomía sería de 10000 horas o lo que es lo mismo 416 días.
Como hay que ser más realista y pensando que cada 60 segundos está despierto 4 segundos podría durar la batería 90 días más o menos.
Ahora nos toca el diseño del Circuito integrado y su creación.
Utilizo el programa KIDcad para el diseño de la PCB. Y utilizo el método láser para la creación del circuito impreso.
Colocados los componentes, el prototipo queda bastante compacto, aunque si se soldarían los componentes al circuito impreso directamente quedaría aún más pequeño.
Me lo he pasado bastante bien experimentando con señales, vosotros podéis probar otro tipo de sensores.
Programa
Saludos.
Juan Galaz
Bibliografía:
http://seta43.duckdns.org/ard433.html
http://seta43.duckdns.org/termot.html
http://seta43.duckdns.org/temt3.html