Browse Source

更新高低电平采集逻辑

yangfei 1 year ago
parent
commit
112fc0a689
5 changed files with 55 additions and 33 deletions
  1. 3 3
      24G.ino
  2. 6 7
      MQTTHandler.cpp
  3. 17 17
      OTAUpdater.cpp
  4. 1 0
      OTAUpdater.h
  5. 28 6
      WiFiConfig.cpp

+ 3 - 3
esp32_c6.ino → 24G.ino

@@ -14,8 +14,8 @@
 // 数据量统计
 // 数据量统计
 unsigned long lastCheckTime = 0;  // 上次检查时间
 unsigned long lastCheckTime = 0;  // 上次检查时间
 // 当前固件版本
 // 当前固件版本
- const String currentFirmwareVersion = "1.0.3";  // 设备当前的固件版本
-// const String currentFirmwareVersion = "1.0.2 - " __DATE__ " " __TIME__;  // 自动生成版本号
+const String currentFirmwareVersion = "1.0.4";  // 设备当前的固件版本
+//const String currentFirmwareVersion = "1.0.4 - " __DATE__ " " __TIME__;  // 自动生成版本号
 
 
 
 
 long unsigned int lastDebounceTimeNew = 0;
 long unsigned int lastDebounceTimeNew = 0;
@@ -28,7 +28,7 @@ int lastGPIO18State = LOW;  // 保存上一次 GPIO18 的电平状态
 OTAUpdater otaUpdater(otaPort, currentFirmwareVersion);
 OTAUpdater otaUpdater(otaPort, currentFirmwareVersion);
 
 
 void setup() {
 void setup() {
-  Serial.begin(115200);
+  Serial.begin(115200); 
   delay(1000); // 等待串口初始化完成
   delay(1000); // 等待串口初始化完成
   pinMode(BUTTON_PIN, INPUT_PULLUP);
   pinMode(BUTTON_PIN, INPUT_PULLUP);
   pinMode(GPIO3_PIN, INPUT);  // 设置 GPIO18 为输入模式
   pinMode(GPIO3_PIN, INPUT);  // 设置 GPIO18 为输入模式

+ 6 - 7
MQTTHandler.cpp

@@ -1,7 +1,6 @@
 #include "MQTTHandler.h"
 #include "MQTTHandler.h"
 #include "WiFiConfig.h"
 #include "WiFiConfig.h"
 
 
-
 extern Preferences preferences;  // 引用外部定义的 preferences 对象
 extern Preferences preferences;  // 引用外部定义的 preferences 对象
 
 
 WiFiClient espClient;
 WiFiClient espClient;
@@ -15,7 +14,6 @@ static int lastGpio18State = LOW;  // 保存上一次 GPIO18 的电平状态,
 int mqttConnectionAttempts = 0;  // 用于记录 MQTT 连接失败的次数
 int mqttConnectionAttempts = 0;  // 用于记录 MQTT 连接失败的次数
 String targetDeviceID = "";      // 存储从订阅消息中接收的完整数据
 String targetDeviceID = "";      // 存储从订阅消息中接收的完整数据
 
 
-// unsigned long lowGpioStartTime = 0;  // 记录 GPIO18 低电平的开始时间
 bool gpio18HighSent = false;         // 标记是否已经发送过 ON 消息
 bool gpio18HighSent = false;         // 标记是否已经发送过 ON 消息
 
 
 void mqttSetup() {
 void mqttSetup() {
@@ -42,8 +40,8 @@ void mqttCallback(char* topic, byte* payload, unsigned int length) {
   String expectedTopic = "device/24G-" + deviceID + "/control";  // 订阅的主题
   String expectedTopic = "device/24G-" + deviceID + "/control";  // 订阅的主题
   if (String(topic) == expectedTopic) {
   if (String(topic) == expectedTopic) {
     Serial.println("[信息] 收到控制消息: " + message);
     Serial.println("[信息] 收到控制消息: " + message);
-          // 添加闪烁任务:发送第三个 MQTT 消息时闪烁 5 次
-      addBlinkTask(6);
+    // 添加闪烁任务:发送第三个 MQTT 消息时闪烁 5 次
+    addBlinkTask(6);
 
 
     // 将接收到的完整消息存储到 targetDeviceID
     // 将接收到的完整消息存储到 targetDeviceID
     targetDeviceID = message;
     targetDeviceID = message;
@@ -119,7 +117,8 @@ void sendRelayControlMessage(const char* state) {
 // 处理 GPIO18 状态并发送 high/low 消息
 // 处理 GPIO18 状态并发送 high/low 消息
 void handleGpio18State() {
 void handleGpio18State() {
   static int lastGpio18State = HIGH;  // 保存上一次 GPIO18 的电平状态
   static int lastGpio18State = HIGH;  // 保存上一次 GPIO18 的电平状态
-  int gpio18State = digitalRead(GPIO3_PIN);  // 读取 GPIO18 的电平状态
+  int gpio18Voltage = analogRead(GPIO3_PIN);  // 读取 GPIO18 的电压值
+  int gpio18State = (gpio18Voltage > 2 * 1023 / 3.3) ? HIGH : LOW;  // 判断高低电平
 
 
   // 如果电平状态发生变化
   // 如果电平状态发生变化
   if (gpio18State != lastGpio18State) {
   if (gpio18State != lastGpio18State) {
@@ -132,13 +131,13 @@ void handleGpio18State() {
   }
   }
 }
 }
 
 
-
 // 处理继电器控制逻辑,发送 ON/OFF 消息
 // 处理继电器控制逻辑,发送 ON/OFF 消息
 void handleRelayControl() {
 void handleRelayControl() {
   static int lastGpio18State = HIGH;  // 保存上一次 GPIO18 的电平状态
   static int lastGpio18State = HIGH;  // 保存上一次 GPIO18 的电平状态
   static unsigned long lowGpioStartTime = 0;  // 记录低电平的开始时间
   static unsigned long lowGpioStartTime = 0;  // 记录低电平的开始时间
 
 
-  int gpio18State = digitalRead(GPIO3_PIN);  // 读取 GPIO18 的电平状态
+  int gpio18Voltage = analogRead(GPIO3_PIN);  // 读取 GPIO18 的电压值
+  int gpio18State = (gpio18Voltage > 2 * 1023 / 3.3) ? HIGH : LOW;  // 判断高低电平
 
 
   // 如果电平状态发生变化
   // 如果电平状态发生变化
   if (gpio18State != lastGpio18State) {
   if (gpio18State != lastGpio18State) {

+ 17 - 17
OTAUpdater.cpp

@@ -15,6 +15,7 @@ void OTAUpdater::checkForUpdates() {
     while (true) {
     while (true) {
         // 尝试连接 WiFi,超时时间为 30 秒
         // 尝试连接 WiFi,超时时间为 30 秒
         if (connectWiFiWithTimeout(30000)) {
         if (connectWiFiWithTimeout(30000)) {
+            Serial.println("[信息] Wi-Fi 连接成功。");
             break;  // 连接成功,退出循环
             break;  // 连接成功,退出循环
         } else {
         } else {
             Serial.println("[信息] Wi-Fi 连接失败,进入配置模式...");
             Serial.println("[信息] Wi-Fi 连接失败,进入配置模式...");
@@ -25,45 +26,44 @@ void OTAUpdater::checkForUpdates() {
     Serial.println("正在检查更新...");
     Serial.println("正在检查更新...");
 
 
     // 构建完整的 OTA 服务器 URL,使用全局变量 serverAddress 和 _port
     // 构建完整的 OTA 服务器 URL,使用全局变量 serverAddress 和 _port
-    String fullServerUrl = "http://" + serverAddress + ":" + String(_port);
+    String fullServerUrl = "http://" + serverAddress + ":" + otaPort;
     Serial.println("OTA 服务器地址: " + fullServerUrl);
     Serial.println("OTA 服务器地址: " + fullServerUrl);
 
 
     // 向服务器发送设备ID和当前固件版本,检查是否有更新
     // 向服务器发送设备ID和当前固件版本,检查是否有更新
     HTTPClient http;
     HTTPClient http;
     String checkUpdateUrl = fullServerUrl + "/check-update";
     String checkUpdateUrl = fullServerUrl + "/check-update";
     http.begin(checkUpdateUrl);
     http.begin(checkUpdateUrl);
-    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
-
-    // 发送设备ID和当前固件版本
-    String postData = "device_id=" + deviceID + "&version=" + _currentVersion;
-    int httpCode = http.POST(postData);
-
+    http.addHeader("Content-Type", "application/json");
+
+    // 构建JSON请求体
+String json = "{\"device_id\":\"" + deviceID + "\",\"version\":\"" + _currentVersion + "\"}";
+http.addHeader("Content-Type", "application/json");
+int httpCode = http.POST(json);
+ 
+     // 处理响应
     if (httpCode == HTTP_CODE_OK) {
     if (httpCode == HTTP_CODE_OK) {
         String response = http.getString();
         String response = http.getString();
-        Serial.println("服务器响应: " + response);
-
-        // 如果服务器返回"update",则下载固件
         if (response == "update") {
         if (response == "update") {
-            Serial.println("发现新固件,正在下载...");
+            Serial.println("发现新固件,开始下载...");
             if (downloadAndUpdateFirmware()) {
             if (downloadAndUpdateFirmware()) {
-                Serial.println("固件更新完成,即将重启...");
+                Serial.println("固件更新成功,即将重启...");
+                delay(1000);
+                Serial.println("1秒后重启...");
+                delay(1000);
                 ESP.restart();
                 ESP.restart();
-            } else {
-                Serial.println("固件更新失败。");
             }
             }
         } else {
         } else {
-            Serial.println("无可用更新");
+            Serial.println("无可用更新");
         }
         }
     } else {
     } else {
         Serial.println("检查更新失败,HTTP错误代码: " + String(httpCode));
         Serial.println("检查更新失败,HTTP错误代码: " + String(httpCode));
     }
     }
-
     http.end();
     http.end();
 }
 }
 
 
 bool OTAUpdater::downloadAndUpdateFirmware() {
 bool OTAUpdater::downloadAndUpdateFirmware() {
     // 构建完整的 OTA 服务器 URL,使用全局变量 serverAddress 和 _port
     // 构建完整的 OTA 服务器 URL,使用全局变量 serverAddress 和 _port
-    String fullServerUrl = "http://" + serverAddress + ":" + String(_port);
+    String fullServerUrl = "http://" + serverAddress + ":" + otaPort;
     String firmwareUrl = fullServerUrl + "/firmware";
     String firmwareUrl = fullServerUrl + "/firmware";
 
 
     HTTPClient http;
     HTTPClient http;

+ 1 - 0
OTAUpdater.h

@@ -8,6 +8,7 @@
 // 使用 extern 声明全局变量 deviceID 和 serverAddress
 // 使用 extern 声明全局变量 deviceID 和 serverAddress
 extern String deviceID;
 extern String deviceID;
 extern String serverAddress;
 extern String serverAddress;
+extern uint16_t otaPort;      // 新增 OTA 端口号
 
 
 void setupWiFiConfig();
 void setupWiFiConfig();
 bool connectWiFiWithTimeout(uint32_t timeoutMs);
 bool connectWiFiWithTimeout(uint32_t timeoutMs);

+ 28 - 6
WiFiConfig.cpp

@@ -39,33 +39,55 @@ void setupWiFiConfig() {
   WiFiManager wifiManager;
   WiFiManager wifiManager;
   setConstantOn(true);  // LED 常亮
   setConstantOn(true);  // LED 常亮
 
 
+  // 创建 WiFiManagerParameter 对象
   WiFiManagerParameter customServer("server", "服务器地址", serverAddress.c_str(), 40);
   WiFiManagerParameter customServer("server", "服务器地址", serverAddress.c_str(), 40);
   WiFiManagerParameter customPort("port", "服务器端口", String(serverPort).c_str(), 6);
   WiFiManagerParameter customPort("port", "服务器端口", String(serverPort).c_str(), 6);
   WiFiManagerParameter customOtaPort("otaPort", "OTA 端口", String(otaPort).c_str(), 6);  // 新增 OTA 端口配置
   WiFiManagerParameter customOtaPort("otaPort", "OTA 端口", String(otaPort).c_str(), 6);  // 新增 OTA 端口配置
+
+  // 添加参数
   wifiManager.addParameter(&customServer);
   wifiManager.addParameter(&customServer);
   wifiManager.addParameter(&customPort);
   wifiManager.addParameter(&customPort);
   wifiManager.addParameter(&customOtaPort);  // 添加 OTA 端口配置
   wifiManager.addParameter(&customOtaPort);  // 添加 OTA 端口配置
 
 
-  // 修复:捕获 customOtaPort
-  wifiManager.setSaveParamsCallback([&customOtaPort]() {
-    serverAddress = WiFiManagerParameter("server", "服务器地址", serverAddress.c_str(), 40).getValue();
-    serverPort = String(WiFiManagerParameter("port", "服务器端口", String(serverPort).c_str(), 6).getValue()).toInt();
+  // 设置保存参数回调
+  wifiManager.setSaveParamsCallback([&customServer, &customPort, &customOtaPort]() {
+    // 直接从已有的 WiFiManagerParameter 对象中获取值
+    serverAddress = customServer.getValue();
+    serverPort = String(customPort.getValue()).toInt();
     otaPort = String(customOtaPort.getValue()).toInt();  // 保存 OTA 端口号
     otaPort = String(customOtaPort.getValue()).toInt();  // 保存 OTA 端口号
+
+    // 打印调试信息
+    Serial.println("[调试] 保存参数:");
+    Serial.println("服务器地址: " + serverAddress);
+    Serial.println("服务器端口: " + String(serverPort));
+    Serial.println("OTA 端口: " + String(otaPort));
+
+    // 调用保存参数函数
+    saveParamsCallback();
   });
   });
 
 
+  // 设置配置模式超时时间
   wifiManager.setConfigPortalTimeout(50);  // 配置模式超时时间为 60 秒
   wifiManager.setConfigPortalTimeout(50);  // 配置模式超时时间为 60 秒
 
 
+  // 启动配置模式
   if (!wifiManager.startConfigPortal("人体存在感应器_Config")) {
   if (!wifiManager.startConfigPortal("人体存在感应器_Config")) {
     Serial.println("[错误] 配置模式超时或未完成配置!");
     Serial.println("[错误] 配置模式超时或未完成配置!");
     feedWatchdog();
     feedWatchdog();
     setConstantOn(false);  // 关闭 LED
     setConstantOn(false);  // 关闭 LED
   } else {
   } else {
+    // 配置成功,保存参数
     serverAddress = customServer.getValue();
     serverAddress = customServer.getValue();
     serverPort = String(customPort.getValue()).toInt();
     serverPort = String(customPort.getValue()).toInt();
     otaPort = String(customOtaPort.getValue()).toInt();  // 保存 OTA 端口号
     otaPort = String(customOtaPort.getValue()).toInt();  // 保存 OTA 端口号
+
+    // 调用保存参数函数
     saveParamsCallback();
     saveParamsCallback();
-    loadServerParams();  // 重新加载保存的服务器配置
-    setConstantOn(false);  // 关闭 LED
+
+    // 重新加载保存的服务器配置
+    loadServerParams();
+
+    // 关闭 LED
+    setConstantOn(false);
   }
   }
 }
 }