本文提供从需求分析、系统架构、硬件与软件设计、云平台接入、通信协议、测试与部署到成本估算的全流程可落地方案,附关键代码与工程结构建议。

关键词

  • STM32FreeRTOSIIC/ADC/UARTMQTT/HTTPESP8266/ESP32SHT30/BH1750土壤湿度卷帘电机灌溉控制云平台(EMQX/OneNet/阿里云/腾讯云)低功耗看门狗EMC 防护

你将获得

  • 系统化方案:从传感器采集到云端可视化的端到端设计
  • 可复制工程:架构图、引脚表、主题/数据模型、控制策略、测试清单
  • 上手代码:HAL + FreeRTOS 关键片段,便于快速搭建验证

目录


1. 项目概述与需求

  • 监测:空气温度/湿度、土壤湿度、光照强度,周期采集、异常告警。
  • 控制:灌溉(泵/电磁阀)、卷帘(上/下,限位保护),支持自动/手动/远程。
  • 联网:MQTT/HTTP 上报,远程参数与控制,历史可视化与告警通知。
  • 可靠性:掉电自恢复、看门狗、掉线重连、EMC 防护、异常自检与降级。
  • 扩展性:支持 CO₂、风速雨量、摄像头、4G/NB-IoT 等模块化扩展。

应用场景:蔬菜瓜果育苗、温室花卉、科研试验大棚、教学演示等。


2. 系统总体架构

在这里插入图片描述

设计要点:传感器与执行器电气隔离/抗干扰;控制策略本地闭环,云端仅作监控与策略下发;网络不稳定时启用本地兜底阈值。


3. 硬件设计

3.1 主控与外设选型

  • MCU:STM32F103C8T6(入门常用)、STM32G0(低功耗)、STM32F411(性能更高)。
  • 温湿度:SHT30/SHT31(I²C,高精度,抗干扰);或 DHT22(性价比高)。
  • 土壤湿度
    • 电容式模拟探头(0–3.3V):直接 ADC 采样+标定
    • 工业 4–20 mA/0–10 V:采样电阻/分压→ADC,精度与抗干扰更优
  • 光照:BH1750(I²C,勒克斯直接输出)或 LDR+分压+ADC(成本低)。
  • 网络:ESP8266(UART)、ESP32(UART/并行),蜂窝 SIM7600/SIM7070 可选。
  • 执行器
    • 灌溉:12/24V 直流水泵或 AC 水泵 + 继电器/SSR;注意回灌与防干转
    • 卷帘:DC 电机用 H 桥(BTS7960/L298N),AC 电机双继电器互锁/接触器
    • 限位:常闭触点,失效安全
  • 电源:AC-DC 12/24V → DC-DC 5V/3.3V 分级供电;TVS/ESD、保险丝、共模电感、RC 吸收。

3.2 接口与防护建议

  • I²C 4.7k 上拉,线长>30cm 选屏蔽线或分段节点;必要时隔离。
  • ADC 前级 RC 滤波+TVS;模拟地与数字地分区,单点汇接。
  • 继电器线圈并二极管/RC;电机端并 TVS/压敏;AC 端口加 RC 吸收回路。
  • 限位常闭,端口硬件上拉/下拉,避免悬空抖动;输入加 RC 去抖。
  • 串口与无线模块共地,模块上电电容缓冲,预留电源裕量。

3.3 参考引脚分配

功能 引脚 说明
I2C1_SCL/SDA PB6/PB7 SHT30 与 BH1750 共总线
ADC_IN0 PA0 土壤湿度模拟输入
UART1_TX/RX PA9/PA10 连接 ESP8266/ESP32
RELAY_PUMP PB0 灌溉继电器控制
RELAY_UP/DOWN PB1/PB10 卷帘上/下互锁控制
LIMIT_UP/DOWN PA1/PA2 卷帘行程开关输入
SWD PA13/PA14 调试与下载

4. 软件架构与任务划分

  • 开发环境:STM32CubeIDE 或 Keil MDK + CubeMX 生成 HAL。
  • RTOS:推荐 FreeRTOS;小型场景可裸机实现,但需注意时序与可靠性。
  • 中间件:cJSON(配置/消息解析)、环形缓冲、NTP(通过模块同步)。

任务建议(优先级从低到高):

  • LogTask(低):环形日志、异常持久化。
  • SensorTask(中):周期采集温湿度/土壤/光照,滤波与异常检测。
  • MqttTask(中):联网、心跳、上报与指令处理、重连退避。
  • ControlTask(高):灌溉与卷帘控制,互锁与限位安全。
  • WatchdogTask(高):统一喂狗,检测任务卡死/超时。

系统流程:上电自检 → 载入参数 → 启动网络 → 拉取策略 → 正常采集与控制 → 周期上报 → 异常降级与告警。


5. 控制策略(灌溉/卷帘)

  • 灌溉(阈值 + 滞回)
    • 例:soil < 30% → 开泵;soil > 40% → 关泵,避免频繁启停。
    • 安全限制:最大连续运行时间、最小冷却间隔、缺水/干转检测。
    • 时段优化:清晨/傍晚优先,结合光照与气温。
  • 卷帘(多条件 + 互锁 + 限位)
    • 过亮/过热自动下卷;过暗/过冷上卷;支持手动强制,超时回退自动。
    • 互锁保证同向单通:上/下命令互斥;限位到位立即断电。
  • 优先级:安全 > 手动 > 自动;掉网/掉电后恢复到可预期状态。

6. 通信协议与云平台接入

6.1 云平台选择

  • 入门/教学:OneNet、自建 EMQX/Mosquitto(上手快)。
  • 商用/规模:阿里云 IoT、腾讯云 IoT(设备管理与安全完善)。

6.2 MQTT 主题与消息(示例)

  • 主题
    • 上报:greenhouse/{deviceId}/telemetry
    • 下发:greenhouse/{deviceId}/control
    • 心跳:greenhouse/{deviceId}/status

上报 JSON:

{
  "ts": 1730698800000,
  "env": {"t": 26.3, "h": 62.1, "lux": 15800},
  "soil": {"moisture": 31.5},
  "state": {"pump": 0, "shade": "stop"},
  "rssi": -58,
  "fw": "1.2.0"
}

控制下发 JSON:

{
  "cmd": "set",
  "pump": {"mode": "auto", "force": 0, "maxOnSec": 300},
  "shade": {"action": "up", "timeoutSec": 25},
  "threshold": {"soilLow": 30, "soilHigh": 40, "luxHigh": 20000, "luxLow": 5000}
}

6.3 连接与保活

  • QoS1;KeepAlive 60s;遗嘱消息标记离线。
  • 重连退避:1→2→4→…≤60s;断线缓存上报(环形队列 10–50 条)。

7. 关键代码片段(HAL + FreeRTOS)

任务创建(示例):

void app_create_tasks(void) {
    xTaskCreate(sensor_task,   "SensorTask",  512, NULL, tskIDLE_PRIORITY+2, NULL);
    xTaskCreate(control_task,  "ControlTask", 512, NULL, tskIDLE_PRIORITY+3, NULL);
    xTaskCreate(mqtt_task,     "MqttTask",   1024, NULL, tskIDLE_PRIORITY+2, NULL);
    xTaskCreate(watchdog_task, "WdtTask",     256, NULL, tskIDLE_PRIORITY+4, NULL);
}

I²C 读取 SHT30(简化示例):

bool sht30_read(float *tempC, float *rh) {
    uint8_t cmd[2] = {0x24, 0x00};
    HAL_I2C_Master_Transmit(&hi2c1, 0x44<<1, cmd, 2, 50);
    vTaskDelay(pdMS_TO_TICKS(15));
    uint8_t buf[6] = {0};
    if (HAL_I2C_Master_Receive(&hi2c1, 0x44<<1, buf, 6, 50) != HAL_OK) return false;
    uint16_t t_raw = (buf[0]<<8)|buf[1];
    uint16_t h_raw = (buf[3]<<8)|buf[4];
    *tempC = -45.0f + 175.0f * (t_raw / 65535.0f);
    *rh    = 100.0f * (h_raw / 65535.0f);
    return true;
}

ADC 读取土壤湿度(滑动平均):

float read_soil_moisture(void) {
    const int N = 16;
    uint32_t acc = 0;
    for (int i=0;i<N;i++) {
        HAL_ADC_Start(&hadc1);
        HAL_ADC_PollForConversion(&hadc1, 10);
        acc += HAL_ADC_GetValue(&hadc1);
    }
    float avg = (float)acc / N;
    return (avg / 4095.0f) * 100.0f; // 需结合实物标定修正
}

卷帘互锁与限位:

void shade_control(Action act) {
    if (act == ACTION_UP) {
        if (limit_up_triggered()) { relay_off_all(); return; }
        relay_down_off();
        relay_up_on();
    } else if (act == ACTION_DOWN) {
        if (limit_down_triggered()) { relay_off_all(); return; }
        relay_up_off();
        relay_down_on();
    } else {
        relay_off_all();
    }
}

看门狗与任务心跳:

void watchdog_task(void *arg) {
    for(;;) {
        if (all_tasks_healthy()) {
            HAL_IWDG_Refresh(&hiwdg);
        }
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

8. 数据存储与可靠性设计

  • 参数存储:阈值/模式/校准因子存于 Flash(双分区 A/B + 校验),掉电不丢。
  • 日志与离线缓存:环形缓冲 + 简单 wear-leveling;上电后补发未上报数据。
  • 异常降级:传感器失联→使用最近可信值/默认阈值;网络掉线→本地自动策略继续。
  • 看门狗:IWDG 必开;任务心跳+超时复位;启动自检与失败安全状态。
  • 低功耗(可选):使用 STOP/Standby 模式;降低采样与上报频率;唤醒源为定时器/外部中断。

9. 工程结构与命名建议

firmware/
  Core/
  Drivers/
  Middlewares/
  App/
    sensors/      // sht30.c, bh1750.c, soil_adc.c
    control/      // pump.c, shade.c, safety.c
    net/          // mqtt_client.c, at_driver.c
    storage/      // flash_kv.c, ringbuf.c
    tasks/        // sensor_task.c, control_task.c, mqtt_task.c
    utils/        // log.c, time_sync.c
  FreeRTOSConfig.h
  app_main.c

命名风格:动词+名词(函数),含义明确(变量),避免缩写;模块内聚,接口清晰。


结语

以上方案兼顾可实现性与可扩展性,既能满足教学与毕设,又可作为实际项目基础版本。按本文架构与代码片段实现,可快速完成软硬件联调与云端接入,并支撑长期稳定运行。欢迎收藏、点赞与交流改进意见。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐