基于STM32单片机的大棚温湿度CO2光照环境采集蓝牙APP设计
- 1、项目简介
- 1.1 系统功能
- 1.2 演示视频
- 2、部分电路设计
- 2.1 STM32单片机核心板电路设计
- 2.2 DHT11温湿度采集电路
- 2.3 HC05蓝牙通信电路设计
- 2.4 LCD1602显示电路设计
- 2.5 SGP30 CO2采集电路设计
- 3、单片机代码展示
- 3.1 系统初始化
- 3.2 SGP30传感器初始化程序
- 3.3 SGP30读取CO2与TVOC数据
1、项目简介
1.1 系统功能
- 系统构成
- 系统由STM32单片机最小系统+DHT11温湿度采集电路+BH1750光照采集电路+SGP30二氧化碳采集电路+LCD1602显示电路+风扇控制电路+蓝牙通信电路构成
- 功能介绍:
- 1、系统采集温湿度、光照、CO2环境数据,并使用LCD1602液晶显示屏显示
- 2、湿度大于75时,自动打开风扇
- 3、使用蓝牙APP接收环境数据与报警信息
1.2 演示视频
2、部分电路设计
2.1 STM32单片机核心板电路设计
- 基于 ARM Cortex-M3内核的STM32F1系列单片机属于主流STM32单片机,其中增强型STM32F103子系列单片机的CPU 主频高达72MHz,片内Flash容量高达1MB,芯片引脚数量多达144个,有 QFN、LQFP、CSP、BGA 等多种芯片封装形式,并具有多种片内外设、USB接口和CAN 接口。根据STM32F103单片机片内Flash容量的不同,ST 公司将其分为小容量(16-32KB)、中等容量(64-128KB)、大容量(256KB-1MB)3种。
- 电源电路:为单片机提供稳定的工作电压,通常采用3.3V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
- 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
- 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。
STM32单片机是一种功能强大、易于使用、灵活且可靠的32位微控制器,基于ARM Cortex™-M内核。其主要功能特点包括:
- 高性能和低功耗:STM32系列单片机提供多种内核选择,如Cortex-M0、Cortex-M3、Cortex-M4等,满足不同应用场景对性能的需求,同时保持低功耗特性。
- 多种通信和外设接口:STM32单片机具备广泛的通信和外设接口,如I2C、SPI、USART、USB等,便于开发者实现各种复杂功能。
- 易于开发和调试:STM32单片机提供了丰富的软件和硬件工具,如HAL库、CubeMX等,帮助开发者快速创建和调试嵌入式系统。
- 高集成度和设计灵活性:STM32系列单片机全系列产品共用大部分引脚、软件和外设,优异的兼容性为开发人员带来最大的设计灵活性
单片机最小系统原理图如下图所示:
实物图:
2.2 DHT11温湿度采集电路
- DHT11是一种常见的温湿度传感器,适合应用在简单的环境监测场景。
- DHT11使用单总线通信协议,支持与单片机直接连接。传感器内部集成了一个电阻型湿度测量单元和一个NTC温度测量单元,同时搭载了一个高性能8位MCU用于数据处理和调整。DHT11的输出为经过数字编码的温湿
- 在电路设计中,DHT11需要一个稳定的电源电压(一般为3.3V或5V),其VCC引脚接到电源引脚,GND引脚接到地。数据通信通过单线数据引脚(DATA)实现,这个引脚通常连接到单片机的 GPIO 口,数据线需要通过一个 4.7kΩ 到 10kΩ 的上拉电阻接收电源电池,以保证数据线上在无
- DHT11的通信流程分为启动信号、响应信号和数据传输三个阶段。在启动信号阶段,单片机将DATA引脚拉低至少18ms,通知DHT11开始工作;然后单片机释放数据线,DHT11检测到启动信号后发送低电平响应信号,表示准备发送数据。在数据传输阶段,DHT11通过脉宽调制信号输出40数据,包括湿度位和小数、温度整数和小数,以及一个校验字节。单片机通过测量高电平脉冲的宽度来解析这些数据
其具体电路原理图如下图所示:
2.3 HC05蓝牙通信电路设计
- STM32单片机与HC-05蓝牙模块通信电路设计涉及电源管理、串口连接和状态指示等部分。
- HC-05蓝牙模块的供电电压通常为3.3V至5V,但其逻辑电平为3.3V,因此在设计中中需要注意电平匹配问题。
- 电源部分,HC-05的VCC引脚连接到稳压的5V电源,GND引脚连接到地,同时建议在VCC和GND之间加一个0.1μF去耦合电容,用于抑制和抑制电源噪声。
- 通信部分,STM32单片机的USART引脚与HC-05的TXD和RXD引脚相连,HC-05的TXD可以直接连接到STM32的RX 引脚,因为 3.3V 的输出逻辑电平可以被 STM32 正确识别;而 STM32 的 TX引脚需要通过一个分压电路或电平转换模块降低到3.3V,以保护 HC-05 的 RXD 引脚未被 5V 信号损坏
- 在STM已32程序设计中,需要将USART配置为异步通信模式,设置波特率与 HC-05 默认波特率一致(如 9600bps),通过 UART 接口实现与蓝牙模块的数据通信。在调试时,可以通过串口助手或者蓝牙调试工具对 HC -05 发送数据,并通过STM32解析接收数据,实现与手机或其他蓝牙设备的数据交互功能。
其具体电路原理图如下图所示:
2.4 LCD1602显示电路设计
- STM32单片机与LCD1602的显示电路设计主要包括电源供电、接口连接和背光控制等部分
- LCD1602是一种常见的字符型液晶模块,支持16列2行字符,工作电压通常为5V,但其逻辑电路平也能兼容3.3V。
- 在电源设计中,LCD1602的VCC引脚连接到5V电源,GND接地,同时建议在VCC和GND之间并联一个 0.1μF 的去耦合电容来抑制电源噪声。
- 调整部分,LCD1602 的 V0 引脚用于调整显示调整,通常通过一个 10kΩ 的调整电位器连接到 VCC 和 GND,调节中间端电压可以字符的显示效果。
- 在接口连接中,LCD1602支持4位和8位数据中断模式,为节省GPIO引脚,通常使用4位控制模式,LCD1602的 RS(寄存器选择)、RW(读写控制)、E(使能)和 DB4~DB7(数据接口)引脚分别连接到 STM32 的 GPIO 引脚,RW 引脚一般接地表示只写模式。
- LED+引脚连接到5V,LED-引脚通过限流电阻接地,电阻值根据背光电流需求选择,常见为220Ω
- STM32控制LCD1602时,需要通过GPIO输出控制信号,根据HD44780驱动芯片的初始化要求模块并发送命令或数据,初始化过程包括设置工作模式(4位或8位)、显示开关和指针控制。
- 显示数据时,先设置RS和RW的状态(如RS为高)表示写数据),然后通过数据通道发送字符编码,最后拉高E引脚触发写入操作。
- 在STM32程序中,可以使用延迟函数或利用迭代产生满足LCD1602相互要求的控制信号,从而实现字符的稳定性。整体设计简单、可靠,适用于文本显示等场景。
其具体电路原理图如下图所示:
2.5 SGP30 CO2采集电路设计
- SGP30 使用 I²C 接口与主控芯片(如 STM32)通信,SCL(时钟线)和 SDA(数据线)分别连接到 STM32 的 I²C 时钟引脚和数据引脚,数据线和时钟线需要分别通过 10kΩ 上拉电阻接收3.3V。I²C地址为固定的7位地址0x58
- 对于复位功能,SGP30 提供了一个 NRST 引脚,用于硬件复位。当 NRST 引脚被拉低时,传感器复位。
- 为了保证测量结果的准确性,SGP30的设计需要在通风良好的环境中运行,同时避免外部突发或引发影响传感器性能。如果需要长时间运行,建议定期执行传感器调整操作(如通过测量新鲜空气中的TVOC)和 CO2eq 基准值进行测量
电路原理图:
3、单片机代码展示
3.1 系统初始化
void HardWare_Init(void)
{
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
TIM3_Int_Init(499,7199);//50ms
LED_Init(); //初始化与LED连接的硬件接口
SGP30Init(&sgp30_data); //co2初始化
bh1750_iic_init(); //bh1750初始化
Lcd_GPIO_init(); //1602接口初始化
Lcd_Init();
fengshan = 1; //上电风扇转一下
delay_ms(200);
sprintf(dis0,"Temp:%02d C DH:%02d%%",(u16)DHT11.Tem_H,(u16)DHT11.Hum_H);//打印温湿度
Lcd_Puts(0,1,(unsigned char *)dis0); //初始化显示
Lcd_1Put(7,1,0xdf);
sprintf(dis1,"Lux:%d CO:%d ", bh1750_data, sgp30_data.co2_);//打印光照与CO2
Lcd_Puts(0,0,(u8 *)dis1);//显示电流
fengshan = 0;
}
3.2 SGP30传感器初始化程序
void SGP30Init(SGP30Data *sgp30_data)
{
u32 sgp30_dat;
SGP30_Init();
delay_ms(100);
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
sgp30_data->co2_ = (sgp30_dat & 0xffff0000) >> 16;
sgp30_data->tvoc_ = sgp30_dat & 0x0000ffff;
//SGP30模块开机需要一定时间初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变,因此上电后每隔一段时间读取一次
//SGP30模块的值,如果CO2浓度为400ppm,TVOC为0ppd,发送“正在检测中...”,直到SGP30模块初始化完成。
//初始化完成后刚开始读出数据会波动比较大,属于正常现象,一段时间后会逐渐趋于稳定。
//气体类传感器比较容易受环境影响,测量数据出现波动是正常的,可自行添加滤波函数。
while(sgp30_data->co2_ == 400 && sgp30_data->tvoc_ == 0)
{
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
sgp30_data->co2_ = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
sgp30_data->tvoc_ = sgp30_dat & 0x0000ffff; //取出TVOC值
delay_ms(500);
}
}
3.3 SGP30读取CO2与TVOC数据
void SGP30Read(SGP30Data *sgp30_data)
{
u32 sgp30_dat = 0;
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
sgp30_data->co2_ = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
sgp30_data->tvoc_ = sgp30_dat & 0x0000ffff; //取出TVOC值
}