All multi-byte values are transmitted in big-endian format.
Board IDs
Board
Source / Dest ID
ESP32 Wireless Gateway
0x01
Sensor + HMI PIC
0x02
Actuator PIC
0x03
Broadcast
0xFF
Message Responsibility Summary
Messages Sent (by ESP32)
0x0001 — Motor Speed Command
0x0002 — Sensor Data Request
0x0005 — Emergency Stop
0x0008 — System Status
0x00FF — Acknowledgement (ACK)
Messages Received (by ESP32)
0x0003 — Sensor Data Response
0x0004 — Motor Telemetry
0x0006 — Error Code
0x0007 — Error Message
0x0043 — Button Event
Broadcast Messages Handled
0x0005 Emergency Stop → immediate safe-stop
0x0008 System Status → logged + forwarded
Firmware Overview
The ESP32 firmware performs:
Periodic sensor polling (UART)
UART message reception and forwarding
MQTT publish (telemetry, status, errors)
MQTT subscribe → UART command translation
System failsafe (WiFi loss → emergency stop)
Firmware Constants
MY_ID=0x01SENSOR_ID=0x02ACTUATOR_ID=0x03BROADCAST_ID=0xFFHEADER=bytes([0x41,0x5A])FOOTER=bytes([0x59,0x42])PACKET_LEN=64SEND_INTERVAL_MS=1000defbuild_packet(dest_id:int,msg_type:int,data:bytes)->bytes:"""Build a valid UART packet."""assertlen(data)<=56,"Payload too long"assertb'\x41\x5A'notindataandb'\x59\x42'notindatapayload=bytes([msg_type>>8,msg_type&0xFF])+datapayload=payload.ljust(58,b'\x00')returnHEADER+bytes([MY_ID,dest_id])+payload+FOOTERdefuart_send(packet:bytes):assertlen(packet)==PACKET_LENuart.write(packet)defis_valid_packet(frame:bytes)->bool:return(len(frame)==PACKET_LENandframe[0:2]==HEADERandframe[62:64]==FOOTER)