#include <WiFiManager.h>
#include <WiFi.h>
#include <Adafruit_NeoPixel.h>
#include <Ticker.h>

#define BOOT_BUTTON_PIN 0  // BOOT按钮对应GPIO0

// 定义WS2812 LED参数
#define LED_PIN 48
#define LED_COUNT 1
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// LED状态控制
Ticker ledTicker;
bool isConnected = false;
const uint8_t BRIGHTNESS = 12;          // 整体亮度
const uint32_t CONNECTED_COLOR = strip.Color(0, 255, 0); // 绿色
const uint32_t CONNECTING_COLOR = strip.Color(255, 255, 0); // 黄色

unsigned long buttonPressTime = 0;
bool resetTriggered = false;

void updateLed() {
  static bool ledState = false;
  if (!isConnected) {
    uint32_t color = ledState ? CONNECTING_COLOR : 0;
    for(int i=0; i<LED_COUNT; i++) {
      strip.setPixelColor(i, color);
    }
    strip.show();
    ledState = !ledState;
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(BOOT_BUTTON_PIN, INPUT_PULLUP);
  
  // 初始化LED
  strip.begin();
  strip.setBrightness(BRIGHTNESS);
  strip.show();

  // 启动连接状态闪烁
  ledTicker.attach(0.5, updateLed);

  WiFiManager wifiManager;
  wifiManager.setTimeout(180);

  if (!wifiManager.autoConnect("ESP32-Config")) {
    Serial.println("配网失败,重启设备");
    ledTicker.detach();
    delay(5000);
    ESP.restart();
  }

  // 连接成功处理
  ledTicker.detach();
  isConnected = true;
  for(int i=0; i<LED_COUNT; i++) {
    strip.setPixelColor(i, CONNECTED_COLOR);
  }
  strip.show();
  
  Serial.println("\nWiFi已连接!");
  Serial.print("IP地址: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  // 按钮检测(保持原功能)
  if (digitalRead(BOOT_BUTTON_PIN) == LOW && !resetTriggered) {
    delay(50);
    if (digitalRead(BOOT_BUTTON_PIN) == LOW) {
      buttonPressTime = millis();
      resetTriggered = true;
      
      while (digitalRead(BOOT_BUTTON_PIN) == LOW) {
        if (millis() - buttonPressTime > 3000) {
          Serial.println("\n重置WiFi配置...");
          WiFiManager wifiManager;
          wifiManager.resetSettings();
          
          // 重置LED状态
          ledTicker.detach();
          for(int i=0; i<LED_COUNT; i++) {
            strip.setPixelColor(i, 0);
          }
          strip.show();
          delay(2000);
          ESP.restart();
        }
      }
      resetTriggered = false;
    }
  }

  // WiFi状态监测
  if (WiFi.status() != WL_CONNECTED && isConnected) {
    isConnected = false;
    ledTicker.attach(0.5, updateLed);
    Serial.println("WiFi连接丢失,尝试重连...");
  }
  else if (WiFi.status() == WL_CONNECTED && !isConnected) {
    isConnected = true;
    ledTicker.detach();
    for(int i=0; i<LED_COUNT; i++) {
      strip.setPixelColor(i, CONNECTED_COLOR);
    }
    strip.show();
  }
  
  delay(100);
}
最后修改:2025 年 05 月 22 日 09 : 27 AM
如果觉得我的文章对你有用,请随意赞赏