You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Arduino IDE的ESP32-C3-MINI-1状态存储与APP通信代码求助

解决方案:结合Preferences库存储设备状态并同步到APP

以下是完整的代码实现(基于ESP32平台,Preferences为ESP32官方库),包含按键消抖、状态存储、LED控制和APP通信接口:

#include <Preferences.h>

// 硬件引脚定义
const int KEY_PIN = 2;
const int LED1_PIN = 4;
const int LED2_PIN = 5;

Preferences preferences;
int counter = 1; // 状态计数器:1对应LED1亮,2对应LED2亮
int lastKeyState = HIGH; // 上拉按键默认高电平
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50; // 按键消抖延时

void setup() {
  pinMode(KEY_PIN, INPUT_PULLUP);
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
  
  Serial.begin(115200);
  
  // 初始化Preferences命名空间,false表示可读写
  preferences.begin("deviceState", false);
  // 读取存储的计数器值,无存储值时用默认1
  counter = preferences.getInt("counter", 1);
  // 开机加载状态后立即更新LED
  updateLED();
  // 发送初始状态到APP
  syncToAPP();
}

void loop() {
  int currentKeyState = digitalRead(KEY_PIN);
  
  // 按键消抖逻辑
  if (currentKeyState != lastKeyState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // 检测到有效按键按下(上拉模式下按下为LOW)
    if (currentKeyState == LOW && lastKeyState == HIGH) {
      // 切换计数器状态
      counter = counter == 1 ? 2 : 1;
      // 更新LED显示
      updateLED();
      // 将新状态写入Flash存储
      preferences.putInt("counter", counter);
      // 同步状态到APP
      syncToAPP();
    }
  }

  lastKeyState = currentKeyState;
}

// 根据计数器值更新LED状态
void updateLED() {
  digitalWrite(LED1_PIN, counter == 1 ? HIGH : LOW);
  digitalWrite(LED2_PIN, counter == 2 ? HIGH : LOW);
}

// 状态同步到APP的接口,根据你的通信方式修改
void syncToAPP() {
  // 示例:串口输出状态,实际项目替换为BLE/MQTT/HTTP
  Serial.print("Device State: ");
  Serial.println(counter);

  // 示例MQTT同步(需提前初始化MQTT客户端)
  // client.publish("device/led/state", String(counter).c_str());
  
  // 示例BLE同步(需提前初始化BLE服务和特征)
  // pCharacteristic->setValue(String(counter).c_str());
  // pCharacteristic->notify();
}

关键部分说明

1. Preferences库的使用

  • 通过preferences.begin("deviceState", false)创建独立的存储命名空间,避免与其他程序的存储数据冲突
  • preferences.getInt("counter", 1)负责开机加载状态:如果之前存储过counter值就读取,否则用默认值1
  • 每次状态切换后,用preferences.putInt("counter", counter)将新值写入Flash,确保重启后状态不丢失

2. 按键处理优化

  • 加入消抖逻辑,避免按键机械抖动导致的多次误触发
  • 仅在按键从高电平变为低电平时触发状态切换,符合瞬时按键的使用逻辑

3. APP通信适配

  • syncToAPP()是通用接口,你可以根据项目实际使用的通信协议修改:
    • BLE:更新BLE特征值并发送通知
    • WiFi MQTT:将状态发布到指定主题,APP订阅该主题即可实时获取
    • HTTP:发送POST请求到APP后端接口,上传当前状态

注意事项

  • 如果使用的是非ESP32平台(如Arduino Uno),需替换Preferences库为EEPROM库,逻辑类似但API略有不同
  • 存储操作无需频繁执行,这里每次状态切换后存储一次的频率不会对Flash造成过度磨损
  • 请根据你的硬件实际引脚修改代码中的引脚定义

内容的提问来源于stack exchange,提问作者Abhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:40:28