#include #include #include #include #include // ==================== WiFi ==================== const char* ssid = "X.factory2.4G"; const char* password = "make0314"; const char* serverUrl = "http://192.168.100.18:3000/api/status"; // ==================== OLED ==================== U8G2_SH1107_SEEED_128X128_F_HW_I2C u8g2(U8G2_R0); // ==================== Touch ==================== const int touchPin = D2; unsigned long lastTouchMs = 0; const unsigned long debounceMs = 1500; const unsigned long cooldownMs = 3000; bool isPressing = false; String lastIP = ""; bool wifiWasConnected = false; // ==================== Forward ==================== void connectWiFi(); void drawIdleScreen(); void sendTouchEvent(); // ==================== Idle screen ==================== void drawIdleScreen() { u8g2.clearBuffer(); // Main greeting u8g2.setFont(u8g2_font_logisoso22_tf); u8g2.drawStr(12, 45, "WELCOME"); u8g2.setFont(u8g2_font_logisoso18_tf); u8g2.drawStr(14, 78, ">> TOUCH ME"); // Bottom status bar u8g2.setFont(u8g2_font_5x7_tf); String status; if (WiFi.status() == WL_CONNECTED) { status = "WiFi " + WiFi.localIP().toString(); } else { status = "WiFi ..."; } u8g2.drawStr(0, 125, status.c_str()); u8g2.sendBuffer(); } // ==================== WiFi ==================== void connectWiFi() { if (WiFi.status() == WL_CONNECTED) return; Serial.print("Connecting WiFi: "); Serial.println(ssid); WiFi.begin(ssid, password); int tries = 0; while (WiFi.status() != WL_CONNECTED && tries < 40) { delay(500); Serial.print("."); tries++; } if (WiFi.status() == WL_CONNECTED) { Serial.println("\nWiFi OK"); Serial.print("IP: "); Serial.println(WiFi.localIP()); } else { Serial.println("\nWiFi FAIL"); } } // ==================== Touch send ==================== void sendTouchEvent() { if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi down, skip send"); return; } HTTPClient http; http.begin(serverUrl); http.addHeader("Content-Type", "application/x-www-form-urlencoded"); int code = http.POST("status=coming"); if (code > 0) { Serial.print("POST ok, code: "); Serial.println(code); } else { Serial.print("POST fail: "); Serial.println(http.errorToString(code).c_str()); } http.end(); } // ==================== Setup ==================== void setup() { Serial.begin(115200); pinMode(touchPin, INPUT_PULLUP); Wire.begin(); u8g2.begin(); connectWiFi(); drawIdleScreen(); } // ==================== Loop ==================== void loop() { unsigned long now = millis(); // Static idle screen unless WiFi state changes bool wifiNow = (WiFi.status() == WL_CONNECTED); String ipNow = wifiNow ? WiFi.localIP().toString() : ""; if (wifiNow != wifiWasConnected || (wifiNow && ipNow != lastIP)) { wifiWasConnected = wifiNow; lastIP = ipNow; drawIdleScreen(); } int raw = digitalRead(touchPin); bool touched = (raw == HIGH); if (touched && !isPressing && (now - lastTouchMs > debounceMs)) { isPressing = true; lastTouchMs = now; Serial.println("Touch detected"); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_logisoso32_tf); u8g2.drawStr(14, 50, "Hello"); u8g2.setFont(u8g2_font_logisoso18_tf); u8g2.drawStr(14, 82, "My Friend"); u8g2.sendBuffer(); sendTouchEvent(); delay(2000); drawIdleScreen(); } if (!touched && isPressing) { isPressing = false; } if (touched && isPressing && (now - lastTouchMs < cooldownMs)) { delay(10); return; } if (WiFi.status() != WL_CONNECTED) { connectWiFi(); } delay(50); }