0 前言
🔥 Hi,大家好,这里是丹成学长的毕设系列文章!
🔥 对毕设有任何疑问都可以问学长哦!
这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是
🚩 智能家居温湿度和烟雾检测系统
🥇学长这里给一个题目综合评分(每项满分5分)
🧿 选题指导, 项目分享:
https://blog.csdn.net/molodi/article/details/125933857
1 简介
基于STM32F103C8T6单片机的WIFI智能家居温湿度和烟雾检测系统。
2 主要器件
- STM32F103C8T6主控芯片
- DHT11温湿度传感器
- MQ-2烟雾传感器
- OLED显示屏
- ESP-01S ESP8622串口WIFI模块
3 实现效果
DHT11传感器采集环境中的温度、湿度数据MQ-2传感器采集环境中的烟雾浓度,OLED显示屏显示传感器采集的数据
WIFI连接,TCP协议
通过WIFI将数据传输到手机客户端
4 设计原理
4.1 DHT11温湿度传感器
简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。 接线 DHT11编码步骤
- 单片机上点后1s内不读取(不重要)
- 主机(单片机)发送起始信号:
- 主机先拉高data
- 拉低data延迟18ms
- 拉高data(通过此操作将单片机引脚设置为输入)。
- 从机(DHT11)收到起始信号后进行应答:
- 从机拉低data,主机读取到data线被拉低持续80us后从机拉高data线, 持续80us,直到高电平结束,意味着主机可以开始接受数据。
- 主机开始接收数据:
- 主机先把data线拉高(io设置为输入)
- 从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)
- 从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。
- 继续重复上述1,2步骤累计40次。
4.2 MQ-2烟雾传感器
简介 MQ-2常用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。 MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简单。 二、MQ-2的工作原理 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。
MQ-2应用电路
MQ-2常用的电路有两种,一种使用采用比较器电路监控,另一种为ADC电路检测。
比较器电路 MQ-2的4脚输出随烟雾浓度变化的直流信号,被加到比较器U1A的2脚,Rp构成比较器的门槛电压。当烟雾浓度较高输出电压高于门槛电压时,比较器输出低电平(0v),此时LED亮报警;当浓度降低传感器的输出电压低于门槛电压时,比较器翻转输出高电平(Vcc),LED熄灭。调节Rp,可以调节比较器的门槛电压,从而调节报警输出的灵敏度。 R1串入传感器的加热回路,可以保护加热丝免受冷上电时的冲击。
ADC转换电路 MQ-2传感器另外一个采集方法为AD信号采集,即将电压信号转化为数字信号,进而转化为精确的烟雾浓度值。 MQ-2传感器的4脚、6脚的电压为输出信号,Rs为传感器的本体电阻。其中若气体浓度上升,必导致Rs下降。而Rs的下降则会导致MQ-2的4脚、6脚对地输出的电压增大。所以气体浓度增大,其输出的电压也会增大,最终通过ADC0832转换后数值增大。
4.3 ESP8266WIFI模块
简介
ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266的低功耗UART-WiFi芯片模组,可以方便地进行二次开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。 尺寸、管脚定义 ESP8266的指令介绍
AT指令可以细分四种类型: 1.测试指令:AT+=? 该命令用于查询设置指令的参数以及取值的范围
2.查询指令:AT+? 该命令用于返回参数的当前值
3.设置指令:AT+=<’’’> 该命令用于设置用户自定义的参数
4.执行指令:AT+ 该命令用于执行受模块内部程序控制的变参数不可变的功能 ESP8266的指令测试 可以通过STM开发板转为电平转换的功能连接上ESP8266模块在通过串口显示窗口在PC机上热输入AT指令来进行操作。
ESP8266的AT指令一览
5 部分核心代码
#include "reg52.h"
#include "LCD1602.h"
#include "intrins.h"
sbit Data=P3^6;
uchar rec_dat[13];
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(20);
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
while(!Data);
DHT11_delay_us(8);
dat<<=1;
if(Data==1)
dat+=1;
while(Data);
}
return dat;
}
void DHT11_receive()
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0);
DHT11_delay_us(40);
R_H=DHT11_rec_byte();
R_L=DHT11_rec_byte();
T_H=DHT11_rec_byte();
T_L=DHT11_rec_byte();
revise=DHT11_rec_byte();
DHT11_delay_us(25);
if((R_H+R_L+T_H+T_L)==revise)
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
rec_dat[0]=RH/10+'0';
rec_dat[1]=(RH%10)+'0';
rec_dat[2]='%';
rec_dat[3]='R';
rec_dat[4]='H';
rec_dat[5]=' ';
rec_dat[6]=' ';
rec_dat[7]=(TH/10)+'0';
rec_dat[8]=(TH%10)+'0';
rec_dat[9]='^';
rec_dat[10]='C';
}
}
void main()
{
DHT11_receive();
lcd1602(rec_dat);
}
unsigned char GetYanWuValue(void)
{
unsigned int sum=0;
unsigned char m,value=0;
for(m=0;m<20;m++)
sum = adc0832(0)+sum;
value=(unsigned char)(sum/20);
if(value > ADC_Zero)
value = value - ADC_Zero;
else
value = 0;
return value;
}
#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
void esp8266_start_trans(void)
{
esp8266_send_cmd("AT+CWMODE=1","OK",50);
esp8266_send_cmd("AT+RST","ready",20);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
while(esp8266_send_cmd("AT+CWJAP=\"111\",\"11111111\"","WIFI GOT IP",600));
esp8266_send_cmd("AT+CIPMUX=0","OK",20);
while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"xxx.xxx.xxx.xxx\",xxxx","CONNECT",200));
esp8266_send_cmd("AT+CIPMODE=1","OK",200);
esp8266_send_cmd("AT+CIPSEND","OK",50);
}
u8 esp8266_quit_trans(void)
{
u8 result=1;
u3_printf("+++");
delay_ms(1000);
result=esp8266_send_cmd("AT","OK",20);
if(result)
printf("quit_trans failed!");
else
printf("quit_trans success!");
return result;
}
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd);
if(ack&&waittime)
{
while(--waittime)
{
delay_ms(10);
if(USART3_RX_STA&0X8000)
{
if(esp8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
u8* esp8266_check_cmd(u8 *str)
{
char *strx=0;
if(USART3_RX_STA&0X8000)
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
u8* esp8266_send_data(u8 *cmd,u16 waittime)
{
char temp[5];
char *ack=temp;
USART3_RX_STA=0;
u3_printf("%s",cmd);
if(waittime)
{
while(--waittime)
{
delay_ms(10);
if(USART3_RX_STA&0X8000)
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
ack=(char*)USART3_RX_BUF;
printf("ack:%s\r\n",(u8*)ack);
USART3_RX_STA=0;
break;
}
}
}
return (u8*)ack;
}
🧿 选题指导, 项目分享:
https://blog.csdn.net/molodi/article/details/125933857
|