目录
基于STM32的环境监测预警系统
项目概述:
主控STM32f103c8t6 。利用 DHT11 和烟雾传感器,进行温湿度检测和烟雾值检测,并实时在LCD屏幕上进行数值显示,同时通过串口通信将数据信息传至上位机显示。当检测到温湿度高出设定阈值,将打开排风扇进行通风;当检测到有烟雾时,将关闭通风风扇防止火灾蔓延,开启蜂鸣器警报并持续向上位机发送警报信息。
材料:
| STM32f103c8t6 | DHT11 | 烟雾传感器 |
| LCD1602 | HC蓝牙模块(用于串口通信) | 蜂鸣器 |
| 直流电机驱动模块/继电器 | 直流电机和风扇桨叶 | 杜邦线面包板电源等 |
注:
资料包已上传,包含源代码和自制上位机APP。
一 LCD1602
介绍
详情参考前文。
STM32驱动LCD1602
接线
仅供参考,电源线不要接错,其它线可以按自己意愿接

代码
示例:显示两排文字
把gpio口都对应着宏定义出来,参考产品手册的封装对应函数
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#define RS_GPIO_Port GPIOB
#define RW_GPIO_Port GPIOB
#define EN_GPIO_Port GPIOB
#define RS_GPIO_PIN GPIO_PIN_1
#define RW_GPIO_PIN GPIO_PIN_2
#define EN_GPIO_PIN GPIO_PIN_10
#define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port, RS_GPIO_PIN, GPIO_PIN_SET)
#define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port, RS_GPIO_PIN, GPIO_PIN_RESET)
#define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port, RW_GPIO_PIN, GPIO_PIN_SET)
#define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port, RW_GPIO_PIN, GPIO_PIN_RESET)
#define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port, EN_GPIO_PIN, GPIO_PIN_SET)
#define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port, EN_GPIO_PIN, GPIO_PIN_RESET)
/* USER CODE END PM */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//查忙
void check_busy()
{
char tmp = 0x80;
GPIOA->ODR = 0x80;
while(tmp & 0x80){
RS_LOW;//低电平选指令寄存器
RW_HIGH;//高电平时进行读操作
EN_LOW;//变成低电平时,液晶模块执行命令
HAL_Delay(1);
EN_HIGH;
HAL_Delay(1);
tmp = GPIOA->ODR;
EN_LOW;
HAL_Delay(1);
}
}
//发指令
void Write_Cmd_Func(char cmd){
//check_busy();
RS_LOW;
RW_LOW;
EN_LOW;
GPIOA->ODR = cmd;
HAL_Delay(1);
EN_HIGH;
HAL_Delay(1);
EN_LOW;
HAL_Delay(1);
}
//发数据
void Write_Data_Func(char Data){
//check_busy();
RS_HIGH;
RW_LOW;
EN_LOW;
GPIOA->ODR = Data;
HAL_Delay(1);
EN_HIGH;
HAL_Delay(1);
EN_LOW;
HAL_Delay(1);
}
//lcd初始化
void LCD1602_INIT()
{
//(1)延时 15ms
HAL_Delay(15);
//(2)写指令 38H(不检测忙信号)
Write_Cmd_Func(0x38);
//(3)延时 5ms
HAL_Delay(5);
//(4)以后每次写指令,读/写数据操作均需要检测忙信号
//(5)写指令 38H:显示模式设置
Write_Cmd_Func(0x38);
//(6)写指令 08H:显示关闭
Write_Cmd_Func(0x08);
//(7)写指令 01H:显示清屏
Write_Cmd_Func(0x01);
//(8)写指令 06H:显示光标移动设置
Write_Cmd_Func(0x06);
//(9)写指令 0CH:显示开及光标设置}
Write_Cmd_Func(0x0c);
}
//显示字符串
void LCD1602_showLine(char row, char col, char *string)
{
switch(row){
case 1:
Write_Cmd_Func(0x80+col);
while(*string){
Write_Data_Func(*string);
string++;
}
break;
case 2:
Write_Cmd_Func(0x80+0x40+col);
while(*string){
Write_Data_Func(*string);
string++;
}
break;
}
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
LCD1602_INIT();
LCD1602_showLine(1,5,"NO.22222");
LCD1602_showLine(2,0,"YZQ handsome");
/* USER CODE END 2 */
二 DHT11温湿度检测
介绍于时序分析
参考前文
温湿度数据串口传输给上位机
难点
由于模块仅有一个Data口,又要输出又要输入,那么需要自定义GPIO口,这里选用GPIO B7
代码
这里选用串口1
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#define DHT_HIGH HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)
#define DHT_LOW HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
#define DHT_VALUE HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)
char datas[5];
void delay_us(uint16_t cnt)
{
uint8_t i;
while(cnt)
{
for (i = 0; i < 10; i++)
{
}
cnt--;
}
}
//根据传入参数‘mode’来选择GPIO口模式
//"GPIO_MODE_OUTPUT_PP"和"GPIO_MODE_INPUT"两种
void DHT_GPIO_Init(uint32_t mode)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();//打开时钟
/*Configure GPIO pin : PB8 */
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = mode;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void DHT11_Start()
{
DHT_GPIO_Init(GPIO_MODE_OUTPUT_PP);
DHT_HIGH;
DHT_LOW;
HAL_Delay(30);
DH

该文描述了一个基于STM32微控制器的环境监测系统,包括LCD1602显示屏、DHT11温湿度传感器、烟雾传感器的集成。系统能实时显示温湿度和烟雾值,并通过串口将数据传送给上位机。当环境条件超过预设阈值时,系统会触发预警功能,如开启或关闭风扇、蜂鸣器。此外,还提供了自定义的上位机APP设计,通过蓝牙与下位机通讯,实现远程监控和控制。
最低0.47元/天 解锁文章
1万+





