Created
March 6, 2025 03:31
-
-
Save cyrusmeh/de541609d90fcf5271198ce16eb5f8ba to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <Wire.h> | |
| #include <TM1637Display.h> | |
| #include <Keypad.h> | |
| #include <esp_now.h> | |
| #include <WiFi.h> | |
| // TM1637 Setup | |
| #define CLK 4 | |
| #define DIO 5 | |
| TM1637Display tm1637(CLK, DIO); | |
| // Keypad Setup | |
| const byte ROW_NUM = 4; | |
| const byte COLUMN_NUM = 3; | |
| char keys[ROW_NUM][COLUMN_NUM] = { | |
| {'1', '2', '3'}, | |
| {'4', '5', '6'}, | |
| {'7', '8', '9'}, | |
| {'*', '0', '#'} | |
| }; | |
| byte pin_rows[ROW_NUM] = {13, 12, 14, 27}; | |
| byte pin_column[COLUMN_NUM] = {26, 25, 33}; | |
| Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); | |
| // ESPNOW Setup | |
| typedef struct struct_message { | |
| int number; | |
| } struct_message; | |
| struct_message myData; | |
| esp_now_peer_info_t peerInfo1, peerInfo2; | |
| /////////////////////////// | |
| // Variables for Input Handling | |
| String input = ""; // Stores keypad input | |
| ////////////////////////// | |
| // Setup Wi-Fi | |
| void setup() { | |
| Serial.begin(115200); | |
| // Initialize the keypad and display | |
| tm1637.setBrightness(0x0f); | |
| WiFi.mode(WIFI_STA); | |
| esp_now_init(); | |
| // Set up ESPNOW peer | |
| memcpy(peerInfo1.peer_addr, "\x24\x6f\x28\x29\xb8\x10", 6); // Replace with MAC address of Board 2 | |
| peerInfo1.channel = 0; | |
| peerInfo1.encrypt = false; | |
| esp_now_add_peer(&peerInfo1); | |
| memcpy(peerInfo2.peer_addr, "\xa0\xa3\xb3\x28\xa7\xe0", 6); // Replace with MAC address of Board 3 | |
| peerInfo2.channel = 0; | |
| peerInfo2.encrypt = false; | |
| esp_now_add_peer(&peerInfo2); | |
| // Set up ESPNOW send function | |
| esp_now_register_send_cb(OnDataSent); | |
| } | |
| void loop() { | |
| // char key = keypad.getKey(); | |
| // if (key == '1') { | |
| // myData.number = 1012; | |
| // tm1637.showNumberDec(myData.number); // Display 10 | |
| // sendData(); | |
| // } | |
| //////////////////////////////////// | |
| char key = keypad.getKey(); // Check keypad input | |
| if (key) { | |
| handleKeypadInput(key); // Process input | |
| } | |
| /////////////////////////////////// | |
| } | |
| /////////////////////////////////////// | |
| // Function to handle keypad inputs | |
| void handleKeypadInput(char key) { | |
| if (key >= '0' && key <= '9') { | |
| input += key; // Accumulate numeric input | |
| // displayMessage("Input:", input); | |
| // Check for valid combinations | |
| if (input == "17") { | |
| myData.number = 1712; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "16") { | |
| myData.number = 1612; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "11") { | |
| myData.number = 1112; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "12") { | |
| myData.number = 1212; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "13") { | |
| myData.number = 1312; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "14") { | |
| myData.number = 1412; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "15") { | |
| myData.number = 1512; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "21") { | |
| myData.number = 2112; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "22") { | |
| myData.number = 2212; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "23") { | |
| myData.number = 2312; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "24") { | |
| myData.number = 2412; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "48") { | |
| myData.number = 4812; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "49") { | |
| myData.number = 4912; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "50") { | |
| myData.number = 5012; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "51") { | |
| myData.number = 5112; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "52") { | |
| myData.number = 5212; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "53") { | |
| myData.number = 5312; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "55") { | |
| myData.number = 5512; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "58") { | |
| myData.number = 5812; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "59") { | |
| myData.number = 5912; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "61") { | |
| myData.number = 6112; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "62") { | |
| myData.number = 6212; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "63") { | |
| myData.number = 6312; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "65") { | |
| myData.number = 6512; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "69") { | |
| myData.number = 6912; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "70") { | |
| myData.number = 7012; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "71") { | |
| myData.number = 7112; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "72") { | |
| myData.number = 7212; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input == "73") { | |
| myData.number = 7312; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendData(); | |
| input = ""; // Reset input | |
| } else if (input.length() > 2) { | |
| // Invalid input reset | |
| // displayMessage("Error:", "Invalid input"); | |
| input = ""; | |
| } | |
| } else if (key == '*') { | |
| input = ""; // Clear input | |
| // displayMessage("Input cleared", ""); | |
| } | |
| } | |
| /////////////////////////////////////// | |
| void sendData() { | |
| esp_now_send(peerInfo1.peer_addr, (uint8_t *)&myData, sizeof(myData)); | |
| esp_now_send(peerInfo2.peer_addr, (uint8_t *)&myData, sizeof(myData)); | |
| } | |
| void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { | |
| if (status == ESP_NOW_SEND_SUCCESS) { | |
| Serial.println("Data sent successfully!"); | |
| } else { | |
| Serial.println("Data send failed!"); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <Wire.h> | |
| #include <TM1637Display.h> | |
| #include <Keypad.h> | |
| #include <esp_now.h> | |
| #include <WiFi.h> | |
| // TM1637 Setup | |
| #define CLK 4 | |
| #define DIO 5 | |
| TM1637Display tm1637(CLK, DIO); | |
| // Keypad Setup | |
| const byte ROW_NUM = 4; | |
| const byte COLUMN_NUM = 3; | |
| char keys[ROW_NUM][COLUMN_NUM] = { | |
| {'1', '2', '3'}, | |
| {'4', '5', '6'}, | |
| {'7', '8', '9'}, | |
| {'*', '0', '#'} | |
| }; | |
| byte pin_rows[ROW_NUM] = {13, 12, 14, 27}; | |
| byte pin_column[COLUMN_NUM] = {26, 25, 33}; | |
| Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); | |
| // ESPNOW Setup | |
| typedef struct struct_message { | |
| int number; | |
| } struct_message; | |
| struct_message myData; | |
| esp_now_peer_info_t peerInfo1, peerInfo2; | |
| /////////////////////////// | |
| // Variables for Input Handling | |
| String input = ""; // Stores keypad input | |
| ////////////////////////// | |
| // Setup Wi-Fi | |
| void setup() { | |
| Serial.begin(115200); | |
| // Initialize the keypad and display | |
| tm1637.setBrightness(0x0f); | |
| WiFi.mode(WIFI_STA); | |
| esp_now_init(); | |
| // Set up ESPNOW peer for Board 1 | |
| memcpy(peerInfo1.peer_addr, "\x24\x6f\x28\x29\xc4\xc8", 6); // Replace with MAC address of Board 1 | |
| peerInfo1.channel = 0; | |
| peerInfo1.encrypt = false; | |
| esp_now_add_peer(&peerInfo1); | |
| // Set up ESPNOW peer for Board 3 | |
| memcpy(peerInfo2.peer_addr, "\xa0\xa3\xb3\x28\xa7\xe0", 6); // Replace with MAC address of Board 3 | |
| peerInfo2.channel = 0; | |
| peerInfo2.encrypt = false; | |
| esp_now_add_peer(&peerInfo2); | |
| // Register callback function to receive data | |
| esp_now_register_recv_cb(OnDataReceived); | |
| } | |
| void loop() { | |
| // char key = keypad.getKey(); | |
| // if (key == '1') { | |
| // myData.number = 1072; | |
| // tm1637.showNumberDec(myData.number); // Display 10 | |
| // sendDataToBoard3(); | |
| // } | |
| //////////////////////////////////// | |
| char key = keypad.getKey(); // Check keypad input | |
| if (key) { | |
| handleKeypadInput(key); // Process input | |
| } | |
| /////////////////////////////////// | |
| } | |
| /////////////////////////////////////// | |
| // Function to handle keypad inputs | |
| void handleKeypadInput(char key) { | |
| if (key >= '0' && key <= '9') { | |
| input += key; // Accumulate numeric input | |
| // displayMessage("Input:", input); | |
| // Check for valid combinations | |
| if (input == "17") { | |
| myData.number = 1772; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "16") { | |
| myData.number = 1672; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "11") { | |
| myData.number = 1172; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "12") { | |
| myData.number = 1272; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "13") { | |
| myData.number = 1372; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "14") { | |
| myData.number = 1472; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "15") { | |
| myData.number = 1572; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "21") { | |
| myData.number = 2172; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "22") { | |
| myData.number = 2272; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "23") { | |
| myData.number = 2372; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "24") { | |
| myData.number = 2472; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "48") { | |
| myData.number = 4872; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "49") { | |
| myData.number = 4972; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "50") { | |
| myData.number = 5072; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "51") { | |
| myData.number = 5172; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "52") { | |
| myData.number = 5272; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "53") { | |
| myData.number = 5372; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "55") { | |
| myData.number = 5572; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "58") { | |
| myData.number = 5872; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "59") { | |
| myData.number = 5972; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "61") { | |
| myData.number = 6172; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "62") { | |
| myData.number = 6272; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "63") { | |
| myData.number = 6372; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "65") { | |
| myData.number = 6572; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "69") { | |
| myData.number = 6972; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "70") { | |
| myData.number = 7072; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "71") { | |
| myData.number = 7172; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "72") { | |
| myData.number = 7272; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input == "73") { | |
| myData.number = 7372; | |
| tm1637.showNumberDec(myData.number); // Display 10 | |
| sendDataToBoard3(); | |
| input = ""; // Reset input | |
| } else if (input.length() > 2) { | |
| // Invalid input reset | |
| // displayMessage("Error:", "Invalid input"); | |
| input = ""; | |
| } | |
| } else if (key == '*') { | |
| input = ""; // Clear input | |
| // displayMessage("Input cleared", ""); | |
| } | |
| } | |
| /////////////////////////////////////// | |
| void sendDataToBoard3() { | |
| esp_now_send(peerInfo2.peer_addr, (uint8_t *)&myData, sizeof(myData)); | |
| } | |
| void OnDataReceived(const esp_now_recv_info* info, const uint8_t* data, int len) { | |
| if (len == sizeof(myData)) { | |
| memcpy(&myData, data, sizeof(myData)); | |
| tm1637.showNumberDec(myData.number); // Display received number | |
| // Forward the number to Board 3 | |
| sendDataToBoard3(); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <Wire.h> | |
| #include <Adafruit_SSD1306.h> | |
| #include <WiFi.h> | |
| #include <esp_now.h> | |
| #define SCREEN_WIDTH 128 | |
| #define SCREEN_HEIGHT 64 | |
| #define OLED_RESET -1 | |
| Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); | |
| // ESPNOW Setup | |
| typedef struct struct_message { | |
| int number; | |
| } struct_message; | |
| struct_message myData; | |
| esp_now_peer_info_t peerInfo1, peerInfo2, peerInfo3; // Declare the peer information structure | |
| void setup() { | |
| Serial.begin(115200); | |
| // Initialize the display | |
| if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { | |
| Serial.println(F("SSD1306 allocation failed")); | |
| for (;;); | |
| } | |
| display.clearDisplay(); | |
| display.setTextSize(1); | |
| display.setTextColor(SSD1306_WHITE); | |
| display.setCursor(0, 0); | |
| display.println(F("OLED Display Working!")); | |
| display.display(); | |
| delay(2000); | |
| // Initialize Wi-Fi and ESPNOW | |
| WiFi.mode(WIFI_STA); | |
| esp_now_init(); | |
| // Set up ESPNOW peer for Board 1 | |
| memcpy(peerInfo1.peer_addr, "\x24\x6f\x28\x29\xc4\xc8", 6); | |
| peerInfo1.channel = 0; | |
| peerInfo1.encrypt = false; | |
| esp_now_add_peer(&peerInfo1); | |
| // Set up ESPNOW peer for Board 2 | |
| memcpy(peerInfo2.peer_addr, "\x24\x6f\x28\x29\xb8\x10", 6); | |
| peerInfo2.channel = 0; | |
| peerInfo2.encrypt = false; | |
| esp_now_add_peer(&peerInfo2); | |
| // Set up ESPNOW peer for Board 4 | |
| memcpy(peerInfo3.peer_addr, "\xa0\xa3\xb3\x28\x93\x10", 6); | |
| peerInfo3.channel = 0; | |
| peerInfo3.encrypt = false; | |
| esp_now_add_peer(&peerInfo3); | |
| // Register callback function to receive data | |
| esp_now_register_recv_cb(OnDataReceived); | |
| } | |
| void loop() { | |
| // Nothing to do in loop as everything is handled via ESPNOW callback | |
| } | |
| void OnDataReceived(const esp_now_recv_info* info, const uint8_t* data, int len) { | |
| if (len == sizeof(myData)) { | |
| memcpy(&myData, data, sizeof(myData)); | |
| // Clear the display | |
| display.clearDisplay(); | |
| display.setTextSize(1); | |
| display.setTextColor(SSD1306_WHITE); | |
| display.setCursor(0, 0); | |
| if (myData.number == 1712) { | |
| display.println("Device 112-Active Part Not Approved"); | |
| } else if (myData.number == 1612) { | |
| display.println("Device 112-Active Material Feeding in Progress"); | |
| } else if (myData.number == 1112) { | |
| display.println("Device 112-Active Normal Operation"); | |
| } else if (myData.number == 1212) { | |
| display.println("Device 112-Active Material Testing"); | |
| } else if (myData.number == 1312) { | |
| display.println("Device 112-Active Mold Testing"); | |
| } else if (myData.number == 1412) { | |
| display.println("Device 112-Active In Setup Process"); | |
| } else if (myData.number == 1512) { | |
| display.println("Device 112-Active In Startup Process"); | |
| } else if (myData.number == 2112) { | |
| display.println("Device 112-Normal Under Maintenance"); | |
| } else if (myData.number == 2212) { | |
| display.println("Device 112-Maintenance Delay Due to Lack of Maintenance Personnel"); | |
| } else if (myData.number == 2312) { | |
| display.println("Device 112-Maintenance Delay Due to Production Scheduling"); | |
| } else if (myData.number == 2412) { | |
| display.println("Device 112-Maintenance Delay Due to Lack of Spare Parts"); | |
| } else if (myData.number == 4812) { | |
| display.println("Device 112-Power Outage"); | |
| } else if (myData.number == 4912) { | |
| display.println("Device 112-Machine Failure"); | |
| } else if (myData.number == 5012) { | |
| display.println("Device 112-Mold Failure"); | |
| } else if (myData.number == 5112) { | |
| display.println("Device 112-Operator Shortage"); | |
| } else if (myData.number == 5212) { | |
| display.println("Device 112-Mold Replacement"); | |
| } else if (myData.number == 5312) { | |
| display.println("Device 112-No Order"); | |
| } else if (myData.number == 5512) { | |
| display.println("Device 112-Holidays"); | |
| } else if (myData.number == 5812) { | |
| display.println("Device 112-Other"); | |
| } else if (myData.number == 5912) { | |
| display.println("Device 112-Material Shortage"); | |
| } else if (myData.number == 6112) { | |
| display.println("Device 112-Chiller Failure"); | |
| } else if (myData.number == 6212) { | |
| display.println("Device 112-Material Feeder Failure"); | |
| } else if (myData.number == 6312) { | |
| display.println("Device 112-Hot Runner System Failure"); | |
| } else if (myData.number == 6512) { | |
| display.println("Device 112-Air Pump Failure"); | |
| } else if (myData.number == 6912) { | |
| display.println("Device 112-Nozzle Section"); | |
| } else if (myData.number == 7012) { | |
| display.println("Device 112-Pallet,Carton,Basket"); | |
| } else if (myData.number == 7112) { | |
| display.println("Device 112-Semi-Finished (Insert)"); | |
| } else if (myData.number == 7212) { | |
| display.println("Device 112-Runner Blockage"); | |
| } else if (myData.number == 7312) { | |
| display.println("Device 112-Material Backflow"); | |
| } else if (myData.number == 1772) { | |
| display.println("Device 172-Active Part Not Approved"); | |
| } else if (myData.number == 1672) { | |
| display.println("Device 172-Active Material Feeding in Progress"); | |
| } else if (myData.number == 1172) { | |
| display.println("Device 172-Active Normal Operation"); | |
| } else if (myData.number == 1272) { | |
| display.println("Device 172-Active Material Testing"); | |
| } else if (myData.number == 1372) { | |
| display.println("Device 172-Active Mold Testing"); | |
| } else if (myData.number == 1472) { | |
| display.println("Device 172-Active In Setup Process"); | |
| } else if (myData.number == 1572) { | |
| display.println("Device 172-Active In Startup Process"); | |
| } else if (myData.number == 2172) { | |
| display.println("Device 172-Normal Under Maintenance"); | |
| } else if (myData.number == 2272) { | |
| display.println("Device 172-Maintenance Delay Due to Lack of Maintenance Personnel"); | |
| } else if (myData.number == 2372) { | |
| display.println("Device 172-Maintenance Delay Due to Production Scheduling"); | |
| } else if (myData.number == 2472) { | |
| display.println("Device 172-Maintenance Delay Due to Lack of Spare Parts"); | |
| } else if (myData.number == 4872) { | |
| display.println("Device 172-Power Outage"); | |
| } else if (myData.number == 4972) { | |
| display.println("Device 172-Machine Failure"); | |
| } else if (myData.number == 5072) { | |
| display.println("Device 172-Mold Failure"); | |
| } else if (myData.number == 5172) { | |
| display.println("Device 172-Operator Shortage"); | |
| } else if (myData.number == 5272) { | |
| display.println("Device 172-Mold Replacement"); | |
| } else if (myData.number == 5372) { | |
| display.println("Device 172-No Order"); | |
| } else if (myData.number == 5572) { | |
| display.println("Device 172-Holidays"); | |
| } else if (myData.number == 5872) { | |
| display.println("Device 172-Other"); | |
| } else if (myData.number == 5972) { | |
| display.println("Device 172-Material Shortage"); | |
| } else if (myData.number == 6172) { | |
| display.println("Device 172-Chiller Failure"); | |
| } else if (myData.number == 6272) { | |
| display.println("Device 172-Material Feeder Failure"); | |
| } else if (myData.number == 6372) { | |
| display.println("Device 172-Hot Runner System Failure"); | |
| } else if (myData.number == 6572) { | |
| display.println("Device 172-Air Pump Failure"); | |
| } else if (myData.number == 6972) { | |
| display.println("Device 172-Nozzle Section"); | |
| } else if (myData.number == 7072) { | |
| display.println("Device 172-Pallet,Carton,Basket"); | |
| } else if (myData.number == 7172) { | |
| display.println("Device 172-Semi-Finished (Insert)"); | |
| } else if (myData.number == 7272) { | |
| display.println("Device 172-Runner Blockage"); | |
| } else if (myData.number == 7372) { | |
| display.println("Device 172-Material Backflow"); | |
| } | |
| display.display(); | |
| // Send the received data to Board 4 | |
| esp_now_send(peerInfo3.peer_addr, (uint8_t*)&myData, sizeof(myData)); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <Wire.h> | |
| #include <WiFi.h> | |
| #include <esp_now.h> | |
| #include <HardwareSerial.h> | |
| #define RTC_ADDRESS 0x68 | |
| HardwareSerial mySerial(2); // Serial2 for OpenLog (TX2: 17, RX2: 16) | |
| HardwareSerial espSerial(1); // Serial1 for second ESP32 (TX1: 4, RX1: 5) | |
| typedef struct struct_message { | |
| int number; | |
| } struct_message; | |
| struct_message myData; | |
| esp_now_peer_info_t peerInfo3; | |
| byte lastSecond, lastMinute, lastHour, lastDay, lastDate, lastMonth, lastYear; | |
| bool hasValidTime = false; | |
| byte bcd2dec(byte val) { | |
| return (val / 16 * 10) + (val % 16); | |
| } | |
| void readRTC(byte *second, byte *minute, byte *hour, byte *day, byte *date, byte *month, byte *year) { | |
| Wire.beginTransmission(RTC_ADDRESS); | |
| Wire.write(0); | |
| Wire.endTransmission(); | |
| Wire.requestFrom(RTC_ADDRESS, 7); | |
| *second = bcd2dec(Wire.read() & 0x7F); | |
| *minute = bcd2dec(Wire.read()); | |
| *hour = bcd2dec(Wire.read() & 0x3F); | |
| *day = bcd2dec(Wire.read()); | |
| *date = bcd2dec(Wire.read()); | |
| *month = bcd2dec(Wire.read()); | |
| *year = bcd2dec(Wire.read()); | |
| } | |
| void setup() { | |
| Serial.begin(115200); | |
| mySerial.begin(9600, SERIAL_8N1, 16, 17); // OpenLog data logger | |
| espSerial.begin(115200, SERIAL_8N1, 4, 5); // Communication with second ESP32 | |
| Wire.begin(); | |
| WiFi.mode(WIFI_STA); | |
| esp_now_init(); | |
| memcpy(peerInfo3.peer_addr, "\xa0\xa3\xb3\x28\xa7\xe0", 6); | |
| peerInfo3.channel = 0; | |
| peerInfo3.encrypt = false; | |
| esp_now_add_peer(&peerInfo3); | |
| esp_now_register_recv_cb(OnDataReceived); | |
| } | |
| void loop() { | |
| } | |
| void OnDataReceived(const esp_now_recv_info *info, const uint8_t *data, int len) { | |
| if (len == sizeof(myData)) { | |
| memcpy(&myData, data, sizeof(myData)); | |
| String logMessage = ""; | |
| if (myData.number == 1712) { | |
| logMessage = "Device 112-Active Part Not Approved"; | |
| } else if (myData.number == 1612) { | |
| logMessage = "Device 112-Active Material Feeding in Progress"; | |
| } else if (myData.number == 1112) { | |
| logMessage = "Device 112-Active Normal Operation"; | |
| } else if (myData.number == 1212) { | |
| logMessage = "Device 112-Active Material Testing"; | |
| } else if (myData.number == 1312) { | |
| logMessage = "Device 112-Active Mold Testing"; | |
| } else if (myData.number == 1412) { | |
| logMessage = "Device 112-Active In Setup Process"; | |
| } else if (myData.number == 1512) { | |
| logMessage = "Device 112-Active In Startup Process"; | |
| } else if (myData.number == 2112) { | |
| logMessage = "Device 112-Normal Under Maintenance"; | |
| } else if (myData.number == 2212) { | |
| logMessage = "Device 112-Maintenance Delay Due to Lack of Maintenance Personnel"; | |
| } else if (myData.number == 2312) { | |
| logMessage = "Device 112-Maintenance Delay Due to Production Scheduling"; | |
| } else if (myData.number == 2412) { | |
| logMessage = "Device 112-Maintenance Delay Due to Lack of Spare Parts"; | |
| } else if (myData.number == 4812) { | |
| logMessage = "Device 112-Power Outage"; | |
| } else if (myData.number == 4912) { | |
| logMessage = "Device 112-Machine Failure"; | |
| } else if (myData.number == 5012) { | |
| logMessage = "Device 112-Mold Failure"; | |
| } else if (myData.number == 5112) { | |
| logMessage = "Device 112-Operator Shortage"; | |
| } else if (myData.number == 5212) { | |
| logMessage = "Device 112-Mold Replacement"; | |
| } else if (myData.number == 5312) { | |
| logMessage = "Device 112-No Order"; | |
| } else if (myData.number == 5512) { | |
| logMessage = "Device 112-Holidays"; | |
| } else if (myData.number == 5812) { | |
| logMessage = "Device 112-Other"; | |
| } else if (myData.number == 5912) { | |
| logMessage = "Device 112-Material Shortage"; | |
| } else if (myData.number == 6112) { | |
| logMessage = "Device 112-Chiller Failure"; | |
| } else if (myData.number == 6212) { | |
| logMessage = "Device 112-Material Feeder Failure"; | |
| } else if (myData.number == 6312) { | |
| logMessage = "Device 112-Hot Runner System Failure"; | |
| } else if (myData.number == 6512) { | |
| logMessage = "Device 112-Air Pump Failure"; | |
| } else if (myData.number == 6912) { | |
| logMessage = "Device 112-Nozzle Section"; | |
| } else if (myData.number == 7012) { | |
| logMessage = "Device 112-Pallet,Carton,Basket"; | |
| } else if (myData.number == 7112) { | |
| logMessage = "Device 112-Semi-Finished (Insert)"; | |
| } else if (myData.number == 7212) { | |
| logMessage = "Device 112-Runner Blockage"; | |
| } else if (myData.number == 7312) { | |
| logMessage = "Device 112-Material Backflow"; | |
| } else if (myData.number == 1772) { | |
| logMessage = "Device 172-Active Part Not Approved"; | |
| } else if (myData.number == 1672) { | |
| logMessage = "Device 172-Active Material Feeding in Progress"; | |
| } else if (myData.number == 1172) { | |
| logMessage = "Device 172-Active Normal Operation"; | |
| } else if (myData.number == 1272) { | |
| logMessage = "Device 172-Active Material Testing"; | |
| } else if (myData.number == 1372) { | |
| logMessage = "Device 172-Active Mold Testing"; | |
| } else if (myData.number == 1472) { | |
| logMessage = "Device 172-Active In Setup Process"; | |
| } else if (myData.number == 1572) { | |
| logMessage = "Device 172-Active In Startup Process"; | |
| } else if (myData.number == 2172) { | |
| logMessage = "Device 172-Normal Under Maintenance"; | |
| } else if (myData.number == 2272) { | |
| logMessage = "Device 172-Maintenance Delay Due to Lack of Maintenance Personnel"; | |
| } else if (myData.number == 2372) { | |
| logMessage = "Device 172-Maintenance Delay Due to Production Scheduling"; | |
| } else if (myData.number == 2472) { | |
| logMessage = "Device 172-Maintenance Delay Due to Lack of Spare Parts"; | |
| } else if (myData.number == 4872) { | |
| logMessage = "Device 172-Power Outage"; | |
| } else if (myData.number == 4972) { | |
| logMessage = "Device 172-Machine Failure"; | |
| } else if (myData.number == 5072) { | |
| logMessage = "Device 172-Mold Failure"; | |
| } else if (myData.number == 5172) { | |
| logMessage = "Device 172-Operator Shortage"; | |
| } else if (myData.number == 5272) { | |
| logMessage = "Device 172-Mold Replacement"; | |
| } else if (myData.number == 5372) { | |
| logMessage = "Device 172-No Order"; | |
| } else if (myData.number == 5572) { | |
| logMessage = "Device 172-Holidays"; | |
| } else if (myData.number == 5872) { | |
| logMessage = "Device 172-Other"; | |
| } else if (myData.number == 5972) { | |
| logMessage = "Device 172-Material Shortage"; | |
| } else if (myData.number == 6172) { | |
| logMessage = "Device 172-Chiller Failure"; | |
| } else if (myData.number == 6272) { | |
| logMessage = "Device 172-Material Feeder Failure"; | |
| } else if (myData.number == 6372) { | |
| logMessage = "Device 172-Hot Runner System Failure"; | |
| } else if (myData.number == 6572) { | |
| logMessage = "Device 172-Air Pump Failure"; | |
| } else if (myData.number == 6972) { | |
| logMessage = "Device 172-Nozzle Section"; | |
| } else if (myData.number == 7072) { | |
| logMessage = "Device 172-Pallet,Carton,Basket"; | |
| } else if (myData.number == 7172) { | |
| logMessage = "Device 172-Semi-Finished (Insert)"; | |
| } else if (myData.number == 7272) { | |
| logMessage = "Device 172-Runner Blockage"; | |
| } else if (myData.number == 7372) { | |
| logMessage = "Device 172-Material Backflow"; | |
| } | |
| byte second, minute, hour, day, date, month, year; | |
| readRTC(&second, &minute, &hour, &day, &date, &month, &year); | |
| if (year < 25 || month == 0 || month > 12 || date == 0 || date > 31 || hour > 23 || minute > 59 || second > 59) { | |
| if (hasValidTime) { | |
| second = lastSecond; | |
| minute = lastMinute; | |
| hour = lastHour; | |
| day = lastDay; | |
| date = lastDate; | |
| month = lastMonth; | |
| year = lastYear; | |
| } else { | |
| Serial.println("Invalid RTC data detected, skipping log entry."); | |
| return; | |
| } | |
| } else { | |
| lastSecond = second; | |
| lastMinute = minute; | |
| lastHour = hour; | |
| lastDay = day; | |
| lastDate = date; | |
| lastMonth = month; | |
| lastYear = year; | |
| hasValidTime = true; | |
| } | |
| String logEntry = String(2000 + year) + "/" + String(month) + "/" + String(date) + " " | |
| + String(hour) + ":" + String(minute) + ":" + String(second) + " - " | |
| + logMessage; | |
| mySerial.println(logEntry); // Log to OpenLog | |
| Serial.println(logEntry); // Display on Serial Monitor | |
| espSerial.println(logEntry); // Send to second ESP32 | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <WiFi.h> | |
| #include <WebServer.h> | |
| const char* ssid = "POCOX3GT"; | |
| const char* password = "q2fghwvray2023rty"; | |
| WebServer server(80); | |
| HardwareSerial espSerial(1); // Serial1 (TX1: 4, RX1: 5) | |
| // Use PROGMEM to store constant HTML strings in Flash memory | |
| const char HTML_HEADER[] PROGMEM = "<html><head><meta http-equiv='refresh' content='5'></head><body>"; | |
| const char HTML_FOOTER[] PROGMEM = "</body></html>"; | |
| #define MAX_MESSAGES 2000 // Max messages before reset | |
| String messageBuffer[MAX_MESSAGES]; // Store messages in an array | |
| int messageCount = 0; // Number of unique messages | |
| void setup() { | |
| Serial.begin(115200); | |
| espSerial.begin(115200, SERIAL_8N1, 4, 5); // Receiving from first ESP32 | |
| WiFi.begin(ssid, password); | |
| Serial.print("Connecting to WiFi..."); | |
| while (WiFi.status() != WL_CONNECTED) { | |
| delay(500); | |
| Serial.print("."); | |
| } | |
| Serial.println("\nConnected to WiFi"); | |
| server.on("/", HTTP_GET, []() { | |
| server.send(200, "text/html", getHTMLPage()); | |
| }); | |
| server.begin(); | |
| Serial.println("HTTP server started"); | |
| } | |
| void loop() { | |
| server.handleClient(); | |
| if (espSerial.available()) { | |
| String receivedData = espSerial.readStringUntil('\n'); // Read incoming data | |
| Serial.println("Received: " + receivedData); | |
| // Extract timestamp from the message (assuming format: "YYYY/MM/DD HH:MM:SS - Device ...") | |
| String timestamp = receivedData.substring(0, receivedData.indexOf(" - ")); | |
| // Check if this timestamp already exists in the buffer | |
| bool isDuplicate = false; | |
| for (int i = 0; i < messageCount; i++) { | |
| if (messageBuffer[i].startsWith(timestamp)) { | |
| isDuplicate = true; | |
| break; | |
| } | |
| } | |
| // Store only if it's not a duplicate | |
| if (!isDuplicate) { | |
| if (messageCount < MAX_MESSAGES) { | |
| messageBuffer[messageCount] = receivedData; | |
| messageCount++; | |
| } else { | |
| // Reset buffer when full | |
| messageCount = 0; | |
| } | |
| } | |
| } | |
| } | |
| String getHTMLPage() { | |
| String htmlPage = FPSTR(HTML_HEADER); | |
| htmlPage += "<h2>Device Logs</h2><pre>"; | |
| for (int i = 0; i < messageCount; i++) { | |
| htmlPage += messageBuffer[i] + "\n"; | |
| } | |
| htmlPage += "</pre><h3>Total Unique Messages: " + String(messageCount) + "</h3>"; | |
| htmlPage += FPSTR(HTML_FOOTER); | |
| return htmlPage; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment