STM32F407 + ML307 阿里云物联网项目总结
一、今日完成的功能
| 功能模块 | 状态 | 说明 |
|---|---|---|
| DHT11 温湿度采集 | ✅ 完成 | 温度、湿度正常读取 |
| 超声波测距 | ✅ 完成 | 距离数据正常测量 |
| ML307 4G 通信 | ✅ 完成 | AT 指令连接稳定 |
| 阿里云 MQTT 连接 | ✅ 完成 | 设备在线,数据上报成功 |
| 数据上报(温湿度+距离) | ✅ 完成 | 三合一数据正常上传 |
| 结构体管理数据 | ✅ 完成 | 代码模块化,易扩展 |
| 云平台物模型 | ✅ 完成 | 温度、湿度、距离属性已添加 |
| 独立供电问题 | ⚠️ 待解决 | 需要 5V/2A 独立电源 |
二、代码架构
1. 结构体定义(ml307.h)
c
typedef struct
{
float temperature; // 温度 (°C)
float humidity; // 湿度 (%)
uint32_t distance; // 距离 (mm)
} SensorData_t;
2. 上报函数(ml307.c)
c
void ML307_ReportSensor(SensorData_t *data)
{
char json[192];
sprintf(json, "{\"id\":\"1\",\"params\":{\"temperature\":%.1f,\"humidity\":%.1f,\"distance\":%lu}}",
data->temperature, data->humidity, data->distance);
// 通过 AT+MQTTPUB 上报
}
3. 主循环(main.c)
c
SensorData_t sensor_data;
while(1)
{
// 读取温湿度
DHT_GetData(dht_buf);
sensor_data.temperature = dht_buf[2];
sensor_data.humidity = dht_buf[0];
// 读取距离
sensor_data.distance = SR04_GetDistance();
// 上报数据
ML307_ReportSensor(&sensor_data);
Delay_ms(30000); // 30秒一次
}
三、阿里云平台配置
| 属性 | 标识符 | 数据类型 | 步长 | 单位 |
|---|---|---|---|---|
| 温度 | temperature |
float | 0.1 | °C |
| 湿度 | humidity |
float | 0.1 | % |
| 距离 | distance |
int32 | 1 | mm |
四、硬件接线(最终确认)
| ML307 | STM32F407 | 说明 |
|---|---|---|
| VCC | 独立 5V/2A | 必须独立供电 |
| GND | GND | 共地 |
| TXD | PB11 | 模块发送 → 单片机接收 |
| RXD | PB10 | 单片机发送 → 模块接收 |
| 传感器 | 引脚 | 说明 |
|---|---|---|
| DHT11 DATA | PG9 | 温湿度(需上拉电阻) |
| 超声波 TRIG | PB6 | 触发信号 |
| 超声波 ECHO | PE6 | 回响信号 |
五、关键参数记录
阿里云连接参数
c
#define ALI_PRODUCT_KEY "k067yCVEsI7"
#define ALI_DEVICE_NAME "test"
#define ALI_MQTT_HOST "iot-06z00ab4mcvi9le.mqtt.iothub.aliyuncs.com"
#define ALI_CLIENT_ID "k067yCVEsI7.test|securemode=2,signmethod=hmacsha256,timestamp=1774405660503|"
#define ALI_USERNAME "test&k067yCVEsI7"
#define ALI_PASSWORD "86c4ffc040da26d56a34f369a897899a98244dd0d96e9a51f68c9b16a14456e8"
上报 JSON 格式
json
{
"id": "1",
"params": {
"temperature": 20.0,
"humidity": 62.0,
"distance": 27
}
}
六、遇到的问题及解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| DHT11 读取失败 | 开始信号拉高 30ms 太长 | 改为 30us |
| ML307 无响应 | 供电不足(4.53V) | 独立 5V/2A 电源 |
上报时无 > 响应 |
中断函数只检测 \n |
增加 > 检测 |
| 云端离线但程序运行 | MQTT 连接检测失败 | 手动验证连接成功 |
| 拔掉下载线掉电 | 下载线同时供电 | 独立供电 |
七、待解决问题
-
独立供电:ML307 需要 5V/2A 独立电源,STM32 需要另一路供电
-
电源稳定性:长时间运行不掉线
-
云端数据验证:确认数据持续更新
八、后续扩展建议
-
添加更多传感器:GPS、电池电量、空气质量等
-
云端下发指令:控制 LED、蜂鸣器等
-
数据本地存储:网络不好时暂存数据
-
告警功能:温湿度超限时推送通知