From 0d8ab3ea6e0bce6ef0a613e822bc5fb0e6868dae Mon Sep 17 00:00:00 2001 From: a2nr Date: Wed, 11 Jun 2025 11:27:49 +0700 Subject: [PATCH] update dengan fitur NTP --- platformio.ini | 1 + src/main.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 113 insertions(+), 5 deletions(-) diff --git a/platformio.ini b/platformio.ini index 0043be4..9d9b690 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,6 +18,7 @@ lib_deps = adafruit/Adafruit BusIO adafruit/Adafruit GFX Library https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA.git + arduino-libraries/NTPClient @ ^3.2.1 upload_speed = 460800 monitor_speed = 115200 monitor_filters = esp32_exception_decoder diff --git a/src/main.cpp b/src/main.cpp index 9daa1b4..7611699 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,20 +1,127 @@ #include #include +#include +#include +#include LedMetrix32x16 ledMatrix; // Create an instance of the LedMetrix32x16 class +#define YOUR_WIFI_SSID "WiFi - Mekatronika" +#define YOUR_WIFI_PASSWD "tanyapakimron" +#define SHOW_TIME_PERIOD 1000 + +// Reduce memory usage by using static allocation +static MatrixPanel_I2S_DMA *display = nullptr; +static CustomPxBasePanel *virtualDisplay = nullptr; + +// NTP Client setup +WiFiUDP ntpUDP; +NTPClient timeClient(ntpUDP, "pool.ntp.org", 25200); // UTC+7 for Jakarta void setup() { Serial.begin(115200); // Initialize serial communication for debugging - ledMatrix.begin(1, 3); // Initialize the LED matrix with 1 rows and 3 column of panels - MatrixPanel_I2S_DMA *display = ledMatrix.getDisplay(); // Get the DMA display object - display->setBrightness(50); // Set the brightness of the display to 50% + delay(1000); // Give time for system to stabilize + + // Initialize WiFi with optimized settings + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + delay(1000); + + // Optimize WiFi power and performance + WiFi.setTxPower(WIFI_POWER_19_5dBm); + WiFi.setSleep(false); // Disable WiFi sleep mode + + // Connect to WiFi + Serial.println("Connecting to WiFi..."); + Serial.print("SSID: "); + Serial.println(YOUR_WIFI_SSID); + + WiFi.begin(YOUR_WIFI_SSID, YOUR_WIFI_PASSWD); + + // Wait for connection with timeout + int timeout = 0; + while (WiFi.status() != WL_CONNECTED && timeout < 20) { + delay(500); + Serial.print("."); + Serial.print("Status: "); + switch(WiFi.status()) { + case WL_IDLE_STATUS: + Serial.println("WL_IDLE_STATUS"); + break; + case WL_NO_SSID_AVAIL: + Serial.println("WL_NO_SSID_AVAIL"); + break; + case WL_CONNECT_FAILED: + Serial.println("WL_CONNECT_FAILED"); + break; + case WL_CONNECTION_LOST: + Serial.println("WL_CONNECTION_LOST"); + break; + case WL_DISCONNECTED: + Serial.println("WL_DISCONNECTED"); + break; + default: + Serial.println("Unknown status"); + } + timeout++; + } + + if (WiFi.status() != WL_CONNECTED) { + Serial.println(""); + Serial.println("WiFi connection failed!"); + Serial.println("Please check:"); + Serial.println("1. WiFi SSID and password are correct"); + Serial.println("2. WiFi router is in range"); + Serial.println("3. WiFi router is working properly"); + while (true) { + delay(1000); + Serial.print("Retrying connection... Status: "); + Serial.println(WiFi.status()); + WiFi.begin(YOUR_WIFI_SSID, YOUR_WIFI_PASSWD); + } + } + + Serial.println(""); + Serial.println("WiFi connected!"); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + Serial.print("Signal strength (RSSI): "); + Serial.println(WiFi.RSSI()); + + // Initialize LED matrix after WiFi is connected + ledMatrix.begin(1, 3); + display = ledMatrix.getDisplay(); + virtualDisplay = ledMatrix.getVirtualDisplay(); + display->setBrightness(50); + + // Initialize NTP + timeClient.begin(); + timeClient.update(); } +int last = 0; void loop() { - MatrixPanel_I2S_DMA *display = ledMatrix.getDisplay(); // Get the DMA display object - CustomPxBasePanel *virtualDisplay = ledMatrix.getVirtualDisplay(); // Get the virtual display object + // Use static display pointers to reduce memory allocation + if (!display || !virtualDisplay) + while(1); + // Update time every minute + if (millis() - last >= 60000) { + timeClient.update(); + last = millis(); + } + + // Get current time + String timeString = timeClient.getFormattedTime(); + + // Display time + virtualDisplay->clearScreen(); + virtualDisplay->setTextSize(2); + virtualDisplay->setTextColor(virtualDisplay->color565(255, 255, 255)); + virtualDisplay->setCursor(0, 0); + virtualDisplay->println(timeString); + delay(3000); + // draw a red pixel at each position on the display for (int i = 0; i < virtualDisplay->height(); i++) {