// ====== PACKET PROTOCOL ======
// [START][LENGTH][SENSOR_ID][DATA_H][DATA_L][CHECKSUM][END]
#define START_BYTE 0xAA
#define END_BYTE 0xFF
#define TMP 0x01 // Temperature sensor ID
// ====== GLOBAL STORAGE ======
uint8_t packet[32];
uint8_t packetLength = 0;
// ====== SENSOR DATA STRUCT ======
struct SensorData {
uint8_t id;
uint16_t rawValue;
float value;
bool valid;
};
// ====== PACKET CREATOR ======
void createPacket(uint8_t sensorId, uint16_t value) {
uint8_t index = 0;
packet[index++] = START_BYTE; // START
packet[index++] = 0; // LENGTH placeholder
packet[index++] = sensorId; // SENSOR ID
packet[index++] = (value >> 8) & 0xFF; // DATA_H
packet[index++] = value & 0xFF; // DATA_L
// Update LENGTH = number of bytes between SENSOR_ID and DATA_L
packet[1] = index - 2;
// Compute checksum (from LENGTH up to DATA_L)
uint8_t checksum = 0;
for (int i = 1; i < index; i++) {
checksum ^= packet[i];
}
packet[index++] = checksum;
packet[index++] = END_BYTE;
packetLength = index;
}
// ====== PACKET DECODER ======
SensorData decodePacket(uint8_t* pkt, uint8_t length) {
SensorData data = {0, 0, 0.0, false};
if (length < 7) return data; // too short
if (pkt[0] != START_BYTE || pkt[length-1] != END_BYTE) return data;
// Recompute checksum
uint8_t checksum = 0;
for (int i = 1; i < length-2; i++) {
checksum ^= pkt[i];
}
if (checksum != pkt[length-2]) return data; // checksum fail
// Extract values
data.id = pkt[2];
data.rawValue = (pkt[3] << 8) | pkt[4];
data.value = data.rawValue / 10.0; // assuming ×10 scaling
data.valid = true;
return data;
}
// ====== DISPLAY PACKET (HEX) ======
void displayPacket() {
Serial.print("Packet: ");
for (uint8_t i = 0; i < packetLength; i++) {
if (packet[i] < 0x10) Serial.print("0");
Serial.print(packet[i], HEX);
Serial.print(" ");
}
Serial.println();
}
// ====== MAIN ======
void setup() {
Serial.begin(115200);
delay(1000);
// Example: Temperature = 25.6°C (scaled ×10 → 256)
createPacket(TMP, 256);
displayPacket();
// Decode packet
SensorData s = decodePacket(packet, packetLength);
if (s.valid) {
Serial.print("Decoded -> ID: 0x");
Serial.print(s.id, HEX);
Serial.print(" Value: ");
Serial.println(s.value);
} else {
Serial.println("Invalid packet");
}
}
void loop() {
// Nothing here for now
}