// Arduino SENDER - Reads Sensor Data and Sends Hex Packets
// Upload this to the Arduino that will act as the sensor device
#include <Wire.h>
// Hex codes for data types
#define TEMP_CODE 0x01
#define HUMIDITY_CODE 0x02
#define CO2_CODE 0x03
#define RTC_HOUR_CODE 0x04
#define RTC_MIN_CODE 0x05
#define STATUS_CODE 0x0A
#define PACKET_START 0xAA
#define PACKET_END 0xFF
// Device Configuration
#define DEVICE_ID 0x05 // This device's unique ID
#define MASTER_ID 0x01 // Master device ID
// Simulated sensor pins
#define TEMP_SENSOR_PIN 32
#define HUM_SENSOR_PIN 33
#define CO2_SENSOR_PIN 34
// Global variables
float temperature = 0.0;
float humidity = 0.0;
uint16_t co2 = 0;
uint8_t rtc_hour = 14;
uint8_t rtc_minute = 30;
uint8_t system_status = 0b00001111; // All sensors OK
uint32_t packet_counter = 0;
// Packet storage
uint8_t packet[32];
uint8_t packetLength = 0;
void setup() {
Serial.begin(9600);
// Initialize analog pins
pinMode(TEMP_SENSOR_PIN, INPUT);
pinMode(HUM_SENSOR_PIN, INPUT);
pinMode(CO2_SENSOR_PIN, INPUT);
// Initialize random seed
randomSeed(analogRead(0));
Serial.println("========================================");
Serial.println(" ARDUINO SENSOR DEVICE (SENDER)");
Serial.println(" Device ID: 0x05");
Serial.println("========================================");
Serial.println("Generating sensor data and hex packets...");
Serial.println("Connect this to RECEIVER for testing");
Serial.println("========================================");
delay(2000);
}
void loop() {
// Read sensor data
readSensorData();
// Create hex packet
createHexPacket();
// Display what we're sending (for debugging)
displayPacketInfo();
// Send the hex packet over serial
sendHexPacket();
// Update time for next reading
updateTime();
// Wait before next transmission (simulate polling interval)
delay(10000);
}
void readSensorData() {
// Read analog sensors and convert to realistic values
int tempReading = analogRead(TEMP_SENSOR_PIN);
int humReading = analogRead(HUM_SENSOR_PIN);
int co2Reading = analogRead(CO2_SENSOR_PIN);
// Convert analog readings to realistic sensor values
// Temperature: -10.0 to 50.0°C
temperature = map(tempReading, 0, 1023, -100, 500) / 10.0;
// Humidity: 0.0 to 100.0%
humidity = map(humReading, 0, 1023, 0, 1000) / 10.0;
// CO2: 300 to 2000 ppm
co2 = map(co2Reading, 0, 1023, 300, 2000);
// Simulate occasional sensor errors (5% chance)
if (random(0, 100) < 5) {
system_status = 0b00001011; // Temperature sensor error
} else {
system_status = 0b00001111; // All sensors OK
}
packet_counter++;
}
void createHexPacket() {
uint8_t index = 0;
// Build packet with device addressing
packet[index++] = PACKET_START; // 0xAA - Start marker
packet[index++] = DEVICE_ID; // 0x05 - Source device ID
packet[index++] = MASTER_ID; // 0x01 - Destination (master)
uint8_t length_pos = index++; // Reserve space for length
packet[index++] = 5; // Data count (5 measurements)
// Temperature (multiply by 10 for decimal precision)
packet[index++] = TEMP_CODE;
uint16_t temp_encoded = (uint16_t)(temperature * 10);
packet[index++] = (temp_encoded >> 8) & 0xFF; // High byte
packet[index++] = temp_encoded & 0xFF; // Low byte
// Humidity (multiply by 10 for decimal precision)
packet[index++] = HUMIDITY_CODE;
uint16_t hum_encoded = (uint16_t)(humidity * 10);
packet[index++] = (hum_encoded >> 8) & 0xFF;
packet[index++] = hum_encoded & 0xFF;
// CO2 (direct value)
packet[index++] = CO2_CODE;
packet[index++] = (co2 >> 8) & 0xFF;
packet[index++] = co2 & 0xFF;
// RTC Hour
packet[index++] = RTC_HOUR_CODE;
packet[index++] = 0x00;
packet[index++] = rtc_hour;
// RTC Minute
packet[index++] = RTC_MIN_CODE;
packet[index++] = 0x00;
packet[index++] = rtc_minute;
// Set packet length (total bytes - start - length byte itself)
packet[length_pos] = index - 3;
// Calculate XOR checksum
uint8_t checksum = 0;
for (uint8_t i = 3; i < index; i++) {
checksum ^= packet[i];
}
packet[index++] = checksum;
packet[index++] = PACKET_END; // 0xFF - End marker
packetLength = index;
}
void displayPacketInfo() {
Serial.print("PKT #");
Serial.print(packet_counter);
Serial.print(" | Device 0x");
Serial.print(DEVICE_ID, HEX);
Serial.print(" -> Master 0x");
Serial.print(MASTER_ID, HEX);
Serial.println();
Serial.print("Data: T=");
Serial.print(temperature, 1);
Serial.print("C, H=");
Serial.print(humidity, 1);
Serial.print("%, CO2=");
Serial.print(co2);
Serial.print("ppm, Time=");
if (rtc_hour < 10) Serial.print("0");
Serial.print(rtc_hour);
Serial.print(":");
if (rtc_minute < 10) Serial.print("0");
Serial.print(rtc_minute);
Serial.print(", Status=0b");
Serial.println(system_status, BIN);
Serial.print("Hex Packet (");
Serial.print(packetLength);
Serial.print(" bytes): ");
for (uint8_t i = 0; i < packetLength; i++) {
if (packet[i] < 0x10) Serial.print("0");
Serial.print(packet[i], HEX);
Serial.print(" ");
}
Serial.println();
Serial.println("----------------------------------------");
}
void sendHexPacket() {
// Send binary data over serial
Serial.write(packet, packetLength);
Serial.flush(); // Ensure all data is sent
}
void updateTime() {
rtc_minute++;
if (rtc_minute >= 60) {
rtc_minute = 0;
rtc_hour++;
if (rtc_hour >= 24) rtc_hour = 0;
}
}