Estoy intentando realizar una ingeniería inversa del protocolo de control remoto para mi Calentador de agua sin tanque EcoSmart .
Desafortunadamente, el dispositivo de control remoto ya no está disponible para la compra, y el fabricante no tiene información sobre el protocolo utilizado. Quiero probar y conectar el calentador directamente a un Arduino para poder monitorearlo / controlarlo a través de Ethernet.
El calentador tiene un conector de 4 pines para el control remoto, y está conectado a la MCU como se muestra aquí:
La unidad envía datos en los siguientes escenarios:
- Se cambió la temperatura girando la perilla de control
- La unidad se enciende / apaga presionando el botón de control
- Calentador activado / desactivado (inicio / parada del flujo de agua)
Mi alcance tiene decodificación RS-232 incorporada, y parece que decodifica algunos datos a 1200bps, pero no estoy seguro de que esté tratando con datos RS-232 / UART aquí. Mi pregunta para ti es: ¿qué tipo de datos te parece?
Esta es parte de la salida de una operación "ENCENDIDA" (es decir, presione el botón para encender el calentador): enlace
Para mí, esto parece demasiadas transiciones altas / bajas para UART ... Me inclino hacia un pulso de ancho variable para indicar 0/1. En el diagrama de tiempo anterior, puedes ver mi interpretación de RS-232 y "Otro" que indica un protocolo desconocido, que tendría un '0' digital como un pulso alto de 720 uS, y un '1' digital como un pulso alto de 24 mS .
Apreciaría cualquier información sobre el protocolo utilizado aquí. Si necesitas aclaraciones, haré mi mejor esfuerzo.
Referencia RS-232 / UART: enlace
Actualización: Después de grabar y transcribir muchas formas de onda de diferentes eventos, he descubierto parte del protocolo.
-
Hay un comando 'Iniciar' al principio de cada secuencia. Consiste en una lógica baja durante al menos 4 ms, luego alta durante 7 ms, luego baja durante 4 ms.
-
Después del comando 'Inicio', los pulsos cortos (720uS) representan la lógica Cero y los pulsos largos (2.4ms) representan la lógica Uno. Los espacios entre pulsos son aproximadamente 840uS.
-
Todas las secuencias tienen una longitud de 5 bytes y se transmiten 6 veces.
-
Los primeros 2 bytes son siempre los mismos: 00: FF: 0F: F0
-
El tercer byte parece ser el comando / identificador de evento:
- Evento de cambio de ajuste de temperatura (rueda girada): 00:70
- Comando ON (botón presionado): 00:00
- Comando OFF (botón presionado): 00:70 (igual que el ajuste de temperatura)
- Evento de inicio de flujo: 02:70
- Evento de detención de flujo: 00:70 (igual que el ajuste de temperatura y el comando de apagado)
-
El cuarto byte es la temperatura en Fahrenheit, MSB a LSB (80 a 140)
-
El quinto byte es la temperatura en grados Celsius, MSB a LSB (26 a 60)
Ahora tengo que determinar si puedo enviar estas mismas secuencias a la línea RX para cambiar las temperaturas y habilitar / deshabilitar el calentador de forma remota. Me pregunto si se usa una dirección diferente
ACTUALIZACIÓN # 2: ¡Éxito! Resulta que el envío de las mismas secuencias al pin RX se puede utilizar para ajustar la temperatura y encender y apagar la unidad. Fue bastante fácil golpear el protocolo con un Arduino Uno, y el calentador responde a los ajustes de temperatura alterando directamente la temperatura de salida (no es necesario subir o bajar un grado cada vez). Planeo publicar la guía de la interfaz completa junto con el código fuente tanto para la entrada como para la salida cuando se complete.
¡Gracias a todos los que ofrecieron sugerencias!
ACTUALIZACIÓN # 3: Se creó el repositorio de Github: enlace
ACTUALIZACIÓN # 4: Consulte el repositorio de github de Phil para obtener más información: enlace