基于STM32的环境监测预警系统

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

目录

项目概述:

 材料:

注:

一 LCD1602

介绍

STM32驱动LCD1602

接线

代码

二 DHT11温湿度检测

介绍于时序分析

温湿度数据串口传输给上位机

难点

代码

三 ADC读取烟雾传感器

四 环境监测系统

参考接线

代码实现

五 预警功能

串口功能测试

代码实现

警报功能实现

六 快速自制上位机APP

 UI设计

逻辑设计

连接蓝牙下位机

按钮发送指令

蓝牙接收信息 


基于STM32的环境监测预警系统

项目概述:

主控STM32f103c8t6 。利用 DHT11 和烟雾传感器,进行温湿度检测和烟雾值检测,并实时在LCD屏幕上进行数值显示,同时通过串口通信将数据信息传至上位机显示。当检测到温湿度高出设定阈值,将打开排风扇进行通风;当检测到有烟雾时,将关闭通风风扇防止火灾蔓延,开启蜂鸣器警报并持续向上位机发送警报信息。

 材料:

STM32f103c8t6 DHT11 烟雾传感器
LCD1602 HC蓝牙模块(用于串口通信) 蜂鸣器
直流电机驱动模块/继电器 直流电机和风扇桨叶 杜邦线面包板电源等

注:

资料包已上传,包含源代码和自制上位机APP。

一 LCD1602

介绍

详情参考前文。 

(59条消息) C51外设: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温湿度检测

介绍于时序分析

参考前文

(59条消息) 基于C51的 温湿度监测系统(及蓝牙温控风扇)_我有在好好学习的博客-优快云博客

温湿度数据串口传输给上位机

难点

由于模块仅有一个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
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值