/* * BoardA_Sender.ino — XIAO ESP32-C3 + HC-SR04 * ESP32 Arduino Core v3.x * * Wiring: * TRIG → D1 * ECHO → D2 * VCC → 5V * GND → GND */ #include #include // Board B (XIAO ESP32-S3) MAC address uint8_t receiverMac[] = {0x80, 0xB5, 0x4E, 0xF1, 0xBA, 0x58}; const int TRIG_PIN = D1; const int ECHO_PIN = D2; const unsigned long PULSE_TIMEOUT_US = 30000; const int SAMPLES = 5; const float SEND_THRESHOLD_CM = 1.0; typedef struct Message { float distanceCm; } Message; Message outgoing; float lastSent = -1.0; float readDistanceCm() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US); if (duration == 0) return -1.0; return duration * 0.0343 / 2.0; } float averageDistance() { float sum = 0; int valid = 0; for (int i = 0; i < SAMPLES; i++) { float d = readDistanceCm(); if (d > 0) { sum += d; valid++; } delay(10); } return (valid == 0) ? -1.0 : sum / valid; } // v3.x send callback — first argument is wifi_tx_info_t* void onSent(const wifi_tx_info_t *info, esp_now_send_status_t status) { Serial.print("Send status: "); Serial.println(status == ESP_NOW_SEND_SUCCESS ? "OK" : "FAIL"); } void setup() { Serial.begin(115200); delay(1000); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); WiFi.mode(WIFI_STA); WiFi.STA.begin(); Serial.print("Board A MAC: "); Serial.println(WiFi.macAddress()); if (esp_now_init() != ESP_OK) { Serial.println("ESP-NOW init failed!"); return; } esp_now_register_send_cb(onSent); esp_now_peer_info_t peer = {}; memcpy(peer.peer_addr, receiverMac, 6); peer.channel = 0; peer.encrypt = false; esp_now_add_peer(&peer); Serial.println("Board A (Sender) ready"); Serial.println("Target MAC: 80:B5:4E:F1:BA:58"); } void loop() { float distance = averageDistance(); if (distance > 0) { float delta = distance - lastSent; if (delta < 0) delta = -delta; if (lastSent < 0 || delta >= SEND_THRESHOLD_CM) { outgoing.distanceCm = distance; esp_now_send(receiverMac, (uint8_t *)&outgoing, sizeof(outgoing)); lastSent = distance; Serial.print("Distance: "); Serial.print(distance, 1); Serial.println(" cm → sent"); } } delay(200); }