基于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
相关产品推荐
相关产品推荐

