From a30497958a3e1f418db739b50c19c66717e8ba6b Mon Sep 17 00:00:00 2001 From: wangbeihong Date: Wed, 11 Feb 2026 21:05:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=AF=B9=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=8C=87=E7=A4=BA=E7=81=AF=EF=BC=8C=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=8C=87=E7=A4=BA=E7=81=AF=E5=92=8C=E6=B0=B4=E6=B3=B5=E7=9A=84?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=87=BD=E6=95=B0=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 ++ Core/Bsp/BSP_Device/device_ctrl/device_ctrl.c | 32 +++++++++++++++++++ Core/Bsp/BSP_Device/device_ctrl/device_ctrl.h | 19 +++++++++++ Core/Src/freertos.c | 5 ++- README.md | 23 +++++++++++++ 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 Core/Bsp/BSP_Device/device_ctrl/device_ctrl.c create mode 100644 Core/Bsp/BSP_Device/device_ctrl/device_ctrl.h create mode 100644 README.md diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c7ed77..7a4882c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,7 @@ add_executable(${CMAKE_PROJECT_NAME} Core/Bsp/easylogger/src/elog.c Core/Bsp/easylogger/src/elog_utils.c Core/Bsp/BSP_WF_24/dx_wf_24.c + Core/Bsp/BSP_Device/device_ctrl/device_ctrl.c ) # Add STM32CubeMX generated sources @@ -62,6 +63,7 @@ target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE Core/Bsp/easylogger/port Core/Bsp/easylogger/src Core/Bsp/BSP_WF_24 + Core/Bsp/BSP_Device/device_ctrl ) # Add project symbols (macros) diff --git a/Core/Bsp/BSP_Device/device_ctrl/device_ctrl.c b/Core/Bsp/BSP_Device/device_ctrl/device_ctrl.c new file mode 100644 index 0000000..288ddec --- /dev/null +++ b/Core/Bsp/BSP_Device/device_ctrl/device_ctrl.c @@ -0,0 +1,32 @@ +#include "device_ctrl.h" +#include "main.h" + +// 注意:以下引脚宏需与 STM32CubeMX 生成的 main.h 中定义一致 +// 假设: +// LED1 (运行灯) -> LED1_GPIO_Port / LED1_Pin +// 用户需确认错误灯和继电器的引脚命名,这里假设为: +// 错误灯 -> LED2_GPIO_Port / LED2_Pin +// 继电器 -> RELAY_GPIO_Port / RELAY_Pin + +void Device_Control(Device_Type_t device, uint8_t state) +{ + GPIO_PinState pin_state = (state ? GPIO_PIN_SET : GPIO_PIN_RESET); + + switch (device) { + case DEVICE_LED_RUN: + HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, pin_state); + break; + + case DEVICE_LED_ERROR: + // 假设错误灯使用 LED2 + HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, pin_state); + break; + + case DEVICE_RELAY: + HAL_GPIO_WritePin(MOTOR_GPIO_Port, MOTOR_Pin, pin_state); + break; + + default: + break; + } +} \ No newline at end of file diff --git a/Core/Bsp/BSP_Device/device_ctrl/device_ctrl.h b/Core/Bsp/BSP_Device/device_ctrl/device_ctrl.h new file mode 100644 index 0000000..701fb16 --- /dev/null +++ b/Core/Bsp/BSP_Device/device_ctrl/device_ctrl.h @@ -0,0 +1,19 @@ +#ifndef __DEVICE_CTRL_H +#define __DEVICE_CTRL_H + +#include "main.h" // 包含 GPIO 定义 + +typedef enum { + DEVICE_LED_RUN, // 运行指示灯 + DEVICE_LED_ERROR, // 错误指示灯 + DEVICE_RELAY // 继电器 +} Device_Type_t; + +/** + * @brief 控制指定设备的开关状态 + * @param device: 设备类型 + * @param state: 0 = 关闭, 非0 = 打开 + */ +void Device_Control(Device_Type_t device, uint8_t state); + +#endif /* __DEVICE_CTRL_H */ \ No newline at end of file diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 9a9e4c6..d53b7e2 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -28,6 +28,7 @@ #include "dx_wf_24.h" #include "elog.h" #include "string.h" +#include "device_ctrl.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -132,7 +133,9 @@ void StartDefaultTask(void *argument) /* Infinite loop */ for (;;) { - HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); + Device_Control(DEVICE_LED_RUN, 1); // 打开运行灯 + osDelay(1000); + Device_Control(DEVICE_LED_RUN, 0); // 关闭运行灯 osDelay(1000); } /* USER CODE END StartDefaultTask */ diff --git a/README.md b/README.md new file mode 100644 index 0000000..859a220 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# SmartPetFeeder_STM32 + +## WiFi 与 MQTT 通信模块说明 + +本工程中的 `dx_wf_24.c` 实现了基于 ESP8266/ESP32 AT 指令集的 WiFi 与 MQTT 通信功能,主要特性包括: + +- **串口 DMA 接收与发送**:使用 STM32 的 UART + DMA 实现高效数据收发,支持 IDLE 中断检测帧尾。 +- **WiFi 连接管理**:通过 AT 指令自动连接指定 SSID 和密码的 WiFi 网络。 +- **MQTT 客户端功能**: + - 自动生成唯一 ClientID(基于系统 Tick 与 STM32 UID); + - 支持设置用户名、密码; + - 连接指定 MQTT 服务器(支持自定义 Host 和 Port); + - 双主题订阅:`petfeeder/control`(控制指令)和 `petfeeder/config`(配置更新); + - 支持 RAW 数据发布(`AT+MQTTPUBRAW`),适用于 JSON 等结构化数据; + - 自动处理 MQTT 断线重连事件(通过 `+MQTTDISCONNECTED` 监测)。 +- **消息解析**:解析 `+MQTTSUBRECV` 格式的订阅消息,提取主题与负载内容。 +- **状态上报**: + - 设备上线时自动发布 `{"status":"online"}` 到 `petfeeder/status` 主题(retain=1); + - 支持传感器数据上报至 `petfeeder/sensor` 主题。 + +> 注意:当前实现为单任务模型,在 `wifi_task_mqtt` 中完成初始化、连接、订阅及消息处理循环。 + +---