#include #include #include #include #include "TFT_eSPI.h" #include "images.h" const char* ssid = "X.factory2.4G"; const char* password = "make0314"; const char* serverUrl = "http://192.168.100.18:3000/api/status?device=s3"; EPaper epaper; int currentPosterID = 0; bool wifiConnected = false; unsigned long lastPollMs = 0; const unsigned long pollInterval = 5000; unsigned long lastWifiRetryMs = 0; const unsigned long wifiRetryInterval = 30000; void connectWiFi(); void showPoster(int id); int fetchPosterID(); void pushDisplay() { uint8_t* buf = (uint8_t*)epaper.getPointer(); if (!buf) return; delay(500); epaper.writecommand(0x04); epaper.writedata(0x00); delay(30); unsigned long t; t = millis(); while (digitalRead(TFT_BUSY) == LOW && (millis() - t) < 8000) delay(10); epaper.writecommand(0x10); for (int row = 0; row < 480; row++) { for (int col = 0; col < 400; col++) { uint8_t b = buf[row * 400 + col]; uint8_t hi = (b >> 4) & 0x0F, lo = b & 0x0F; auto m = [](uint8_t v)->uint8_t{ return v==0x0F?0x00:v==0x00?0x01:v==0x0D?0x05:v==0x02?0x06:v==0x0B?0x02:v==0x06?0x03:0x01; }; epaper.writedata((m(hi)<<4)|m(lo)); } } epaper.writecommand(0x12); epaper.writedata(0x00); delay(30); t = millis(); while (digitalRead(TFT_BUSY) == LOW && (millis() - t) < 60000) delay(10); } void setup() { Serial.begin(115200); delay(1000); epaper.begin(); showPoster(1); currentPosterID = 1; WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); connectWiFi(); } void loop() { unsigned long now = millis(); if (WiFi.status() == WL_CONNECTED) { if (!wifiConnected) { wifiConnected = true; Serial.printf("WiFi OK IP:%s\n", WiFi.localIP().toString().c_str()); } if (now - lastPollMs >= pollInterval) { lastPollMs = now; int newID = fetchPosterID(); if (newID >= 1 && newID <= 3 && newID != currentPosterID) { Serial.printf("%d->%d\n", currentPosterID, newID); currentPosterID = newID; showPoster(newID); } } } else { if (wifiConnected) { wifiConnected = false; Serial.println("WiFi lost"); } if (now - lastWifiRetryMs >= wifiRetryInterval) { lastWifiRetryMs = now; connectWiFi(); } } delay(100); } void connectWiFi() { if (WiFi.status() == WL_CONNECTED) return; for (int i = 0; i < 60 && WiFi.status() != WL_CONNECTED; i++) { delay(500); } if (WiFi.status() == WL_CONNECTED) Serial.printf("WiFi %s\n", WiFi.localIP().toString().c_str()); } void showPoster(int id) { const unsigned char* data; if (id == 1) data = gImage_poster1; else if (id == 2) data = gImage_poster2; else if (id == 3) data = gImage_poster3; else return; if (currentPosterID > 0 && WiFi.status() == WL_CONNECTED) { WiFi.disconnect(); delay(300); } epaper.pushImage(0, 0, 800, 480, (uint16_t*)data); pushDisplay(); if (currentPosterID > 0) { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); } Serial.println("done"); } int fetchPosterID() { if (WiFi.status() != WL_CONNECTED) return -1; HTTPClient http; http.begin(serverUrl); http.setTimeout(5000); int code = http.GET(); if (code <= 0) { http.end(); return -1; } String body = http.getString(); http.end(); JsonDocument doc; if (deserializeJson(doc, body)) return -1; return doc["currentPoster"] | -1; }