基于STM32单片机的智能粮仓温湿度检测蓝牙手机APP设计
1 系统功能介绍
本系统是一款基于 STM32 单片机 的智能粮仓温湿度监控与阈值控制系统,能够实现对粮仓内温度、湿度的实时采集、显示、报警及远程控制。系统通过 蓝牙模块 与手机进行无线通信,手机端可接收温湿度数据,也可发送命令调整温湿度报警阈值,实现粮仓环境的智能化管理。
系统的主要功能包括:
-
温湿度实时采集与显示
- 使用 DS18B20 采集温度数据;
- 使用 土壤湿度传感器 采集湿度数据;
- OLED 显示屏显示实时温度、湿度及报警阈值。
-
蓝牙数据传输与阈值控制
- 通过蓝牙模块向手机发送实时温湿度数据;
- 手机通过串口调试软件或专用 APP 接收数据并显示;
- 手机可发送指令调整温湿度报警阈值。
-
继电器控制与报警
- 当温度超过温度阈值时,自动打开继电器1(可接风机、降温装置);
- 当湿度超过湿度阈值时,自动打开继电器2(可接除湿机、通风装置);
- 超限时手机端显示报警信息。
-
手机命令控制格式
- 温度阈值增加:
temp add
- 温度阈值减少:
temp down
- 湿度阈值增加:
dh add
- 湿度阈值减少:
dh_down
- 温度阈值增加:
2 系统电路设计
2.1 单片机最小系统
本系统的核心控制单元是 STM32F103C8T6 单片机,其 ARM Cortex-M3 内核运行速度快,适合实时数据采集与多任务处理。
- 晶振电路:使用 8MHz 外部晶振,配合内部倍频至 72MHz 主频,保证系统稳定运行;
- 复位电路:上电自动复位,并提供手动复位按钮;
- 电源电路:使用 3.3V 稳压电源为 STM32 供电,外围传感器和蓝牙模块根据需要提供 3.3V 或 5V 电源。
2.2 温度传感器 DS18B20
- 功能:用于测量粮仓内温度,测量范围 -55℃~125℃,精度 ±0.5℃;
- 通信协议:单总线协议,占用一个 GPIO 口即可完成数据传输;
- 工作模式:由 STM32 定时读取温度数据,转换为浮点数后显示与发送。
2.3 土壤湿度传感器
- 功能:检测粮仓内环境湿度(或粮堆湿度);
- 信号类型:模拟电压信号;
- 接口:通过 STM32 ADC 模块采集电压值,映射为湿度百分比。
2.4 OLED 显示模块
- 屏幕类型:0.96 英寸 128×64 OLED,I2C 接口;
- 功能:显示温度、湿度的实时值及报警阈值;
- 优点:低功耗、高对比度,适合暗光环境。
2.5 蓝牙通信模块
-
型号:HC-05/HC-06(串口透传模块);
-
接口:UART 串口通信,波特率 9600bps;
-
功能:
- 向手机发送温湿度数据;
- 接收手机端阈值调整命令并解析执行。
2.6 继电器模块
-
功能:驱动外部风机、加热器、除湿机等设备;
-
控制逻辑:
- 温度超限 → 打开继电器1;
- 湿度超限 → 打开继电器2;
- 恢复到正常值 → 关闭继电器。
3 程序设计
3.1 主程序框架
程序主要流程为:初始化 → 采集温湿度数据 → OLED 显示 → 蓝牙发送数据 → 蓝牙接收命令并调整阈值 → 判断是否超限并控制继电器。
#include "stm32f10x.h"
#include "ds18b20.h"
#include "oled.h"
#include "adc.h"
#include "usart.h"
#include "relay.h"
#include <stdio.h>
#include <string.h>float temperature = 0;
float humidity = 0;
float tempThreshold = 30.0;
float humThreshold = 60.0;
char rxBuffer[50];int main(void)
{SystemInit();DS18B20_Init();OLED_Init();ADC_Init();USART1_Init(9600);Relay_Init();while(1){temperature = DS18B20_GetTemp();humidity = ADC_GetHumidity();OLED_ShowTempHum(temperature, humidity, tempThreshold, humThreshold);SendDataToPhone(temperature, humidity, tempThreshold, humThreshold);if(USART1_Receive(rxBuffer)){ParseCommand(rxBuffer);}Relay_Control(temperature, humidity, tempThreshold, humThreshold);}
}
3.2 温度采集模块(DS18B20)
float DS18B20_GetTemp(void)
{// 发送温度转换命令// 延时等待转换完成// 读取数据并转换为摄氏温度return tempValue;
}
逻辑:通过单总线协议发送温度转换命令 → 读取两个字节数据 → 转换成浮点数。
3.3 湿度采集模块(ADC)
float ADC_GetHumidity(void)
{uint16_t value = ADC_ReadChannel(ADC_Channel_1);return (value / 4095.0) * 100; // 转换为百分比
}
逻辑:ADC 采样 03.3V 电压 → 映射到 0100% 湿度值。
3.4 蓝牙通信与命令解析
void ParseCommand(char *cmd)
{if(strcmp(cmd, "temp add") == 0) tempThreshold += 1;else if(strcmp(cmd, "temp down") == 0) tempThreshold -= 1;else if(strcmp(cmd, "dh add") == 0) humThreshold += 1;else if(strcmp(cmd, "dh_down") == 0) humThreshold -= 1;
}
逻辑:蓝牙串口接收到命令 → 比对字符串 → 修改对应阈值。
3.5 OLED 显示模块
void OLED_ShowTempHum(float temp, float hum, float tThr, float hThr)
{OLED_Clear();OLED_ShowString(0, 0, "T:");OLED_ShowFloat(20, 0, temp);OLED_ShowString(70, 0, "TH:");OLED_ShowFloat(100, 0, tThr);OLED_ShowString(0, 2, "H:");OLED_ShowFloat(20, 2, hum);OLED_ShowString(70, 2, "HH:");OLED_ShowFloat(100, 2, hThr);
}
逻辑:第一行显示温度和温度阈值,第二行显示湿度和湿度阈值。
3.6 继电器控制模块
void Relay_Control(float temp, float hum, float tThr, float hThr)
{if(temp > tThr) Relay1_On();else Relay1_Off();if(hum > hThr) Relay2_On();else Relay2_Off();
}
逻辑:根据当前采集值与阈值比较,控制继电器开关。
4 总结
该基于 STM32 单片机 的智能粮仓温湿度检测系统,将 DS18B20 温度传感器、土壤湿度传感器、OLED 显示、蓝牙通信 与 继电器控制 有机结合,既能在本地显示与控制,又能通过蓝牙与手机实时交互,实现温湿度数据监控与报警阈值的远程设置。
这种设计能够有效防止粮食储存过程中出现温湿度异常造成的霉变、虫害等问题,提升粮仓管理的智能化与自动化水平。未来还可扩展 WiFi 模块,实现云端存储与大数据分析,提高系统的可视化与远程管理能力。