// ESP32-C3 - SLAVE (Temp Receiver, Reply Sender) - Revised Serial Output #include <esp_now.h> #include <WiFi.h> #include <esp_wifi.h> // For esp_now_recv_info_t // MAC Address of the MASTER (ESP32-S3) uint8_t masterMacAddress[] = {0xF0, 0x9E, 0x9E, 0x3B, 0xDF, 0xBC}; // YOUR S3 MASTER MAC // Data structures (must match master) typedef struct struct_temp_message { float temperature; int id; } struct_temp_message; typedef struct struct_reply_message { char status_text[20]; int original_id; } struct_reply_message; struct_temp_message tempReceived; struct_reply_message replyToSend; esp_now_peer_info_t peerInfo; volatile bool newTempPacketArrived = false; // Callback when reply is sent void OnReplySent(const uint8_t *mac_addr, esp_now_send_status_t status) { // This confirms the ESP-NOW packet was queued or sent at a low level // Serial.print("C3_SLAVE: Low-level reply send status to S3: "); // Serial.println(status == ESP_NOW_SEND_SUCCESS ? "OK" : "Fail"); } // Callback when temperature data is received void OnTempDataRecv(const esp_now_recv_info_t *recv_info, const uint8_t *incomingData, int len) { if (len == sizeof(tempReceived)) { memcpy(&tempReceived, incomingData, sizeof(tempReceived)); // Acknowledge temperature received Serial.printf("C3_SLAVE: Received Temp from S3: %.1f%cC (ID: %d)\n", tempReceived.temperature, (char)223, tempReceived.id); newTempPacketArrived = true; } else { Serial.println("C3_SLAVE: Temp packet length mismatch."); } } void setup() { delay(500); Serial.begin(115200); unsigned long startWait = millis(); while (!Serial && (millis() - startWait < 2000)) { delay(10); } Serial.println("\n--- C3 SLAVE Initializing ---"); WiFi.mode(WIFI_STA); Serial.print("C3_SLAVE MAC: "); Serial.println(WiFi.macAddress()); if (esp_now_init() != ESP_OK) { Serial.println("C3_SLAVE: ESP-NOW Init FAILED"); while(1) delay(100); } esp_now_register_send_cb(OnReplySent); esp_now_register_recv_cb(OnTempDataRecv); memcpy(peerInfo.peer_addr, masterMacAddress, 6); peerInfo.channel = 0; peerInfo.encrypt = false; if (esp_now_add_peer(&peerInfo) != ESP_OK) { Serial.println("C3_SLAVE: Master Peer Add FAILED"); } Serial.println("--- C3 SLAVE Ready ---"); } void loop() { if (newTempPacketArrived) { newTempPacketArrived = false; if (tempReceived.temperature <= 21.0) strcpy(replyToSend.status_text, "cool"); else if (tempReceived.temperature <= 27.0) strcpy(replyToSend.status_text, "nice"); else strcpy(replyToSend.status_text, "scorchio"); replyToSend.original_id = tempReceived.id; // Acknowledge sending reply Serial.printf("C3_SLAVE: Sending Reply to S3: '%s' (for ID: %d)\n\n", replyToSend.status_text, replyToSend.original_id); esp_now_send(masterMacAddress, (uint8_t *) &replyToSend, sizeof(replyToSend)); } delay(10); }