#include #include #include #include // ====================================================================== // 1. ตั้งค่าหมายเลขของ Slave ตัวนี้ (0-5) // ====================================================================== const int SLAVE_ID = 5; String vname = "101"; // กำหนด Channel ที่ต้องการล็อกให้ตรงกับ Master const int WIFI_CHANNEL = 1; // ====================================================================== // 2. กำหนดขา GPIO สำหรับ Relay (7-Segment A-G) // ====================================================================== const int pinA = 13; const int pinB = 12; const int pinC = 14; const int pinD = 27; const int pinE = 26; const int pinF = 25; const int pinG = 33; const int pinDP = 32; const int segmentPins[7] = {pinA, pinB, pinC, pinD, pinE, pinF, pinG}; // ====================================================================== // 3. กำหนดสถานะ Active สำหรับ Relay // ====================================================================== #define RELAY_ON HIGH #define RELAY_OFF LOW // ====================================================================== // โครงสร้างข้อมูลที่ใช้รับ (ต้องตรงกับฝั่ง Master 100%) // ====================================================================== typedef struct struct_message { uint8_t h_tens[7]; // ชั่วโมง หลักสิบ uint8_t h_units[7]; // ชั่วโมง หลักหน่วย uint8_t m_tens[7]; // นาที หลักสิบ uint8_t m_units[7]; // นาที หลักหน่วย uint8_t s_tens[7]; // วินาที หลักสิบ uint8_t s_units[7]; // วินาที หลักหน่วย char namex[32]; // ✅ ตรงกับ Master ที่แก้ไขแล้ว } struct_message; struct_message timeData; // ====================================================================== // ฟังก์ชันขับขา Relay ด้วยข้อมูล Array 7 เซกเมนต์ที่ได้มาจาก Master // ====================================================================== void displaySegments(uint8_t segments[7]) { for (int i = 0; i < 7; i++) { // ถ้า Master ส่งมาเป็น 1 ให้เปิด Relay (RELAY_ON) ถ้าส่งมาเป็น 0 ให้ปิด (RELAY_OFF) int relayState = (segments[i] == 1) ? RELAY_ON : RELAY_OFF; digitalWrite(segmentPins[i], relayState); } } // ====================================================================== // Callback เมื่อได้รับข้อมูลจาก Master // ====================================================================== #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) void OnDataRecv(const esp_now_recv_info_t *esp_now_info, const uint8_t *incomingData, int len) { #else void OnDataRecv(const uint8_t *mac_addr, const uint8_t *incomingData, int len) { #endif // คัดลอกข้อมูลที่ได้รับเข้า struct memcpy(&timeData, incomingData, sizeof(timeData)); Serial.print("Received Namex: "); Serial.println(timeData.namex); // ตรวจสอบเงื่อนไขชื่อบอร์ด (เปรียบเทียบ char array กับ String) if (String(timeData.namex) == vname) { Serial.print("Data Matched! Slave ID: "); Serial.println(SLAVE_ID); // เลือกอาเรย์เซกเมนต์ให้ตรงกับตำแหน่งของ Slave ตัวเอง switch(SLAVE_ID) { case 0: displaySegments(timeData.h_tens); break; case 1: displaySegments(timeData.h_units); break; case 2: displaySegments(timeData.m_tens); break; case 3: displaySegments(timeData.m_units); break; case 4: displaySegments(timeData.s_tens); break; case 5: displaySegments(timeData.s_units); break; } } } void setup() { Serial.begin(115200); // ตั้งค่าขา Relay ทั้งหมดเป็น OUTPUT for (int i = 0; i < 7; i++) { pinMode(segmentPins[i], OUTPUT); digitalWrite(segmentPins[i], RELAY_OFF); } pinMode(pinDP, OUTPUT); digitalWrite(pinDP, RELAY_OFF); // ตั้งค่า Wi-Fi และล็อก Channel WiFi.mode(WIFI_STA); esp_wifi_set_channel(WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE); if (esp_now_init() != ESP_OK) { Serial.println("Error initializing ESP-NOW"); return; } esp_now_register_recv_cb((esp_now_recv_cb_t)OnDataRecv); Serial.print("Slave Node Started on Channel "); Serial.println(WIFI_CHANNEL); } void loop() { delay(100); }