STM32西瓜育苗监控系统设计与实现

张开发
2026/4/18 18:45:30 15 分钟阅读

分享文章

STM32西瓜育苗监控系统设计与实现
1. 项目背景与需求分析在传统农业种植中西瓜育苗阶段的环境控制一直是个技术难点。记得去年夏天我去山东的一个西瓜种植基地考察看到农户们每天要多次往返大棚手动测量土壤湿度、调节通风口不仅工作量大而且调控精度难以保证。特别是遇到突然的天气变化往往来不及反应就导致幼苗受损。这个基于STM32的西瓜育苗监控系统正是为了解决这些痛点而设计的。它通过集成多种环境传感器和自动控制设备实现了对育苗环境的24小时无人值守监控。我在实际测试中发现相比传统人工管理方式这套系统可以将育苗成功率提升30%以上同时节省约50%的人力成本。2. 系统架构设计2.1 硬件组成解析整个系统的硬件架构可以分为感知层、控制层和执行层三个部分感知层SHT30温湿度传感器采用I2C接口测量范围-40~125℃精度±0.3℃BH1750光照传感器量程1-65535lux分辨率1lux土壤湿度传感器使用电压比较器电路输出0-3.3V模拟信号SGP30二氧化碳传感器测量范围400-60000ppm控制层STM32F103RCT6主控72MHz主频256KB Flash48KB RAMAir724 4G模块支持TCP/IP协议栈内置MQTT客户端1.44寸LCD屏SPI接口128x128分辨率执行层继电器模块控制电磁阀和补光灯5V散热风扇最大风量0.8CFMLED补光灯波长450-460nm适合植物生长提示在硬件选型时要特别注意传感器的防水等级。大棚环境湿度大建议选择IP67及以上防护等级的设备。2.2 软件架构设计系统软件采用分层架构设计// 主要软件模块 ├── 驱动程序层 │ ├── sensor_driver.c // 传感器驱动 │ ├── lcd_driver.c // 显示屏驱动 │ └── relay_driver.c // 继电器驱动 ├── 协议层 │ ├── mqtt_client.c // 4G通信 │ └── data_protocol.c // 数据封装 └── 应用层 ├── control_logic.c // 自动控制逻辑 ├── ui_display.c // 界面显示 └── alarm_monitor.c // 报警监控关键数据结构设计typedef struct { float soil_humidity; // 土壤湿度% float temperature; // 温度℃ float humidity; // 湿度% uint16_t light; // 光照lux uint16_t co2; // CO2浓度ppm } EnvData_t;3. 核心功能实现3.1 环境数据采集传感器数据采集采用定时中断方式每5秒采集一次void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET) { read_sensors(); TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }各传感器的数据处理方法土壤湿度传感器float get_soil_humidity(void) { uint16_t adc_val ADC_Read(ADC_CHANNEL_0); return (adc_val/4095.0)*100; // 转换为百分比 }SHT30温湿度传感器void read_sht30(float *temp, float *hum) { uint8_t data[6]; I2C_Read(SHT30_ADDR, 0x2C06, data, 6); *temp -45 175*(data[0]8|data[1])/65535.0; *hum 100*(data[3]8|data[4])/65535.0; }3.2 自动控制逻辑自动灌溉的控制流程图获取当前土壤湿度与设定阈值比较默认设置为30%如果低于阈值且不在灌溉间隔期内默认间隔2小时启动继电器打开电磁阀灌溉3分钟后自动关闭void auto_water_control(void) { static uint32_t last_water_time 0; float humidity get_soil_humidity(); if(humidity WATER_THRESHOLD (HAL_GetTick()-last_water_time) WATER_INTERVAL) { relay_on(WATER_RELAY); last_water_time HAL_GetTick(); osDelay(180000); // 3分钟 relay_off(WATER_RELAY); } }3.3 云平台通信使用MQTT协议上传数据到华为云IoT平台void mqtt_publish_data(EnvData_t *data) { char payload[256]; sprintf(payload, {\soil\:%.1f,\temp\:%.1f,\humi\:%.1f,\light\:%d,\co2\:%d}, >

更多文章