嵌入式室内环境参数监控系统设计 您所在的位置:网站首页 嵌入式方案设计流程 嵌入式室内环境参数监控系统设计

嵌入式室内环境参数监控系统设计

2024-07-11 04:03| 来源: 网络整理| 查看: 265

一、设计要求

本次课设要求学生们掌握四个方面,第一是文献检索及实验研究方法,第二是室内环境监控系统一般组成; 第三是掌握技术方案比选方法;最后是掌握STM32 ADC使用,同时本次课设需要做到以下几个方面:

了解国内室内环境参数监控系统组成及技术架构;设计室内环境参数监控系统,要求至少采集温度及光照,完成环境参数传感器选型;基于开发板或其他32位微控制器及所选用的传感器设计一个室内环境参数采集终端,实现至少一路温度、光照强度数据采集;设置温度和光照门限,当温度高于门限值时蜂鸣器报警,当光照强度高于及低于门限值时控制LED灯亮度以实现光照调节(也可自行设计亮度调节方式)。将采集到的温度和光照强度数据显示到LCD屏上; 二、设计原理 硬件设计 采用STM32F103ZET6单片机作为主控芯片,具有较强的处理能力,且具有低功耗、低成本等特点,可以实现室内环境参数监控的多种复杂操作;采用DHT11温湿度传感器,可以实时检测室内温度和湿度;采用光强传感器,可以检测室内光照强度参数;采用LCD显示屏,可以显示室内环境参数的实时数据;采用LED灯,可以模拟补光操作;采用蜂鸣器,可以实现报警功能。 软件设计 采用C语言编写程序,实现对传感器参数的采集、处理以及参数的显示;采用报警功能,当室内温度参数超出设定范围时,可以发出警报信号;采用室内光照强度实时调节,根据室内光照强度参数实时调节以达到适合工作、学习的平衡状态。 三、设计方案

1硬件设计

1.1硬件系统框图

 

1.2主控芯片模块(STM32F103ZET6)

 

STM32F103ZET6芯片的主要特性如下:

集成了32位的ARM Cortex-M3内核,最高工作频率可达72MHZ,计算能力    为1.25DMIPS,具有单周期乘法指令和硬件除法器;具有512KB片内Flash存储器和64KB片内片内SARM存储器;内部集成了8MHZ晶体振荡电路器,可外接416MHZ的时钟源;2.0-3.0V单一供电源,具有上电复位功能;具有睡眠、停止、待机三种低功耗工作模式;144个引脚LQFP封装;内部集成了11个定时器:4个16位通用定时器,2个16位定时器可产生的PWM波控制电机的定时器,2个16位的可驱动DAC的定时器,2个加窗口的看门狗定时器和1 个24位的系统节拍定时器;2个12位的DAC和3个12位的ADC;集成了内部温度传感和实时时钟RTC;具有112根高速通用输入输出口,可从其中任选16根作为外部中断输入口,几乎全部GPIO口可承受5V输入(PA0~PA7,PB0~PB1,PC0~PC5,PC13~PC15和PF6~PF10除外);集成了13个外部通信接口:2个12C、3个SPI、1个CAN、5个UART、5个UART、1个USB2.0设备和1个并行SDIO;具有12通道的DMA控制器,支持定时器、ADC、DAC、SDIO、12S、SPI、12C和UART外设;具有96位的全球唯一编号;工作温度-40~85℃;  

1.3电源电路模块

1.4复位电路模块

       可实现上电复位和按键复位,开发板接通电源时,复位持续时间由R2电阻值C10容值乘积决定,一般情况下电阻值取10k电容值取10uf可以满足复位要求,按钮RESET可以实现按键复位,当需要复位时按下RESET按钮,RESET引脚直接接地,CPU进入复位状态。 

1.5时钟电路模块

 

从上图可以看出三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

(1)HSI振荡器时钟

(2)HSE振荡器时钟

(3)PLL时钟

这些设备有以下2种二级时钟源:

(1)40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/ 待机模式下自动唤醒系统。

(2)32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。

当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。

1.6DHT11温湿度传感器模块

       DHT11是一款温湿度一体化的数字传感器。该传感器包括一个电容式测湿元件和一个 NTC测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11功耗很低,5V 源电压下,工作平均最大电流0.5mA。

1.7光强传感器模块

 图中,LSI为光敏二极管,外观看起来与贴片LED类似(位于OLED插座旁边,LSI)R34为其提供反向电压,当环境光线发生变化时,LSI两端的电压也会随之改变,通过ADC3_IN6通道获取LIGHT_SENSOR(PF8)上面的电压,即可得到环境光线的强弱,光线越强,电压越低,光线越弱,电压越高。

1.8TFT_LCD显示模块

FTLCD 模块采用 2*17 的 2.54 公排针与外部连接,即图中 TFT_LCD 部分。从图 1.8.1可以看出,正点原子 TFTLCD 模块采用 16 位的并口方式与外部连接。该模块与显示功能的相关信号线如表 1.8.2:

 

 1.9LED照明补光模块

 1.10蜂鸣器报警模块

开发板配置了一个无源蜂鸣器BEEP作为系统报警使用,由PNP三极管Q1控制其导通或关闭,加两个电阻实现当管脚输出3.3V电平时才能发生,且防止由于外部干扰导致的误发声。

软件设计 DHT11传感器温湿度采集 程序设计

DHT11实验中使用的是单总线协议,用到的是库函数中 GPIO 相关函数。

DHT11配置步骤 :

(1)使能DHT11数据线对应的GPIO时钟。 本实验中DHT11的数据线引脚是PG11,因此需要先使能 GPIOG 的时钟;

(2)设置对应 GPIO 工作模式(开漏输出),本实验 GPIO 使用开漏输出模式;

(3)参考单总线协议,编写信号代码:

DHT11开始发送数据流程

主机发送开始信号后,延时等待 20us-40us 后读取 DH11T 的回应信号,读取总线为低电平,说明 DHT11 发送响应信号,DHT11 发送响应信号后,再把总线拉高,准备发送数据,每一 bit 数据都以低电平开始,格式见下面图示。如果读取响应信号为高电平,则 DHT11 没有响应,请检查线路是否连接正常。主机复位信号和DHT11响应信号

(4)编写 DHT11的读函数 ,基于读1bit数据的基础上,编写 DHT11 读1字节函数。

(5)编写DHT11获取温度函数, 参考 DHT11典型温湿度读取过程,编写获取温湿度函数。

2.1.2程序流程图

本实验开机的时候先检测是否有 DHT1 1存在,如果没有,则提示错误。只有在检测到 DHT11之后才开始读取温湿度值并显示在 LCD 上,如果发现了 DHT1 1,则程序每隔 100ms 左右读取一次数据,并把温湿度显示在 LCD 上。 LED0 闪烁用于提示程序正在运行。

2.1.3程序代码

//复位DHT11 void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us } //等待DHT11的回应 //返回1:未检测到DHT11的存在 //返回0:存在 u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry=100)return 1; return 0; } //从DHT11读取一个位 //返回值:1/0 u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry= height)break; //退出 LCD_ShowChar(x, y, *p, size, 0); x += size / 2; p++; } }

2.5蜂鸣器报警代码

void BEEP_Init(void)//BEEP初始化 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//beep->PB8端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//端口模式配置 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//端口速率配置 GPIO_Init(GPIOB,&GPIO_InitStructure);//根据参数初始化GPIOB_Pin8 GPIO_ResetBits(GPIOB,GPIO_Pin_8);//初始时端口配置为低电平 } if(temperature>=34) { BEEP=1; }

2.6LED照明补光程序代码

//TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIOE外设和AFIO复用功能模块时钟 //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOA.7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO //初始化TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM3 }

三、主程序

int main(void) { u8 adcx;//光照强度 u8 t=0; u8 temperature;//温度 u8 humidity; //湿度 u16 led1pwmval; //PWN输出的占空比 delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //初始化与LED连接的硬件接口 BEEP_Init(); //初始化BEEP LCD_Init(); //初始化LCD Lsens_Init(); //初始化光敏传感器 TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz POINT_COLOR=RED;//设置字体为红色 //显示提示信息 LCD_ShowString(30,50,200,16,16,"Based On STM32"); LCD_ShowString(30,70,200,16,16,"DHT11_LSENS MONITORING"); LCD_ShowString(30,90,200,16,16,"Copyright GROUP1"); LCD_ShowString(30,110,200,16,16,"2022/12/25"); while(DHT11_Init()) //DHT11初始化 { LCD_ShowString(30,130,200,16,16,"DHT11 Error"); delay_ms(200); LCD_Fill(30,130,239,130+16,WHITE); delay_ms(200); } LCD_ShowString(30,130,200,16,16,"DHT11 OK"); POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(30,170,200,16,16,"LSENS_VAL:"); LCD_ShowString(30,190,200,16,16,"Temp: C"); LCD_ShowString(30,210,200,16,16,"Humi: %"); while(1) { adcx=Lsens_Get_Val(); LCD_ShowxNum(30+10*8,170,adcx,3,16,0);//显示ADC的值 if(t%10==0) //每100ms读取一次 { DHT11_Read_Data(&temperature,&humidity); //读取温湿度值 LCD_ShowNum(30+40,190,temperature,2,16); //显示温度 LCD_ShowNum(30+40,210,humidity,2,16); //显示湿度 } delay_ms(10); t++; if(temperature>=34) { BEEP=1; } led1pwmval=(100-adcx)/10;//根据光照强度实时调整LED1的亮度 TIM_SetCompare2(TIM3,led1pwmval);} }

四、测试

      项目文件编译并下载到单片机后上电,LCD屏上可以清晰显示当前测试环境的温度、湿度和光照强度。 

通过上面两图的对比,未外加灯光时光照强度为7,LED1很亮;当外加灯光时,光照强度为93,LED1微亮或者熄灭。

 

测试时室温为14摄氏度,当设置温度报警上限为10摄氏度时,可以听到蜂鸣器发出声音报警。 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有