0 前言
?? 這兩年開(kāi)始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長(zhǎng)自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過(guò)畢設(shè),學(xué)長(zhǎng)分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
?? 基于PID控制的智能平衡車(chē)設(shè)計(jì)與實(shí)現(xiàn)
??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿(mǎn)分5分)
- 難度系數(shù):4分
- 工作量:4分
- 創(chuàng)新點(diǎn):3分
1 簡(jiǎn)介
基于STM32F103C8T6單片機(jī)的WIFI智能家居溫濕度和煙霧檢測(cè)系統(tǒng)。
2 主要器件
- STM32F103C8T6主控芯片
- DHT11溫濕度傳感器
- MQ-2煙霧傳感器
- OLED顯示屏
- ESP-01S ESP8622串口WIFI模塊
3 實(shí)現(xiàn)效果
DHT11傳感器采集環(huán)境中的溫度、濕度數(shù)據(jù)MQ-2傳感器采集環(huán)境中的煙霧濃度,OLED顯示屏顯示傳感器采集的數(shù)據(jù)
WIFI連接,TCP協(xié)議
通過(guò)WIFI將數(shù)據(jù)傳輸?shù)绞謾C(jī)客戶(hù)端
4 設(shè)計(jì)原理
4.1 DHT11溫濕度傳感器
簡(jiǎn)介
DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器。它應(yīng)用專(zhuān)用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性與卓越的長(zhǎng)期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測(cè)溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性?xún)r(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式儲(chǔ)存在OTP內(nèi)存中,傳感器內(nèi)部在檢測(cè)信號(hào)的處理過(guò)程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡(jiǎn)易快捷。超小的體積、極低的功耗,信號(hào)傳輸距離可達(dá)20米以上,使其成為各類(lèi)應(yīng)用甚至最為苛刻的應(yīng)用場(chǎng)合的最佳選則。產(chǎn)品為 4 針單排引腳封裝。連接方便,特殊封裝形式可根據(jù)用戶(hù)需求而提供。
接線
DHT11編碼步驟
- 單片機(jī)上點(diǎn)后1s內(nèi)不讀?。ú恢匾?/li>
- 主機(jī)(單片機(jī))發(fā)送起始信號(hào):
- 主機(jī)先拉高data
- 拉低data延遲18ms
- 拉高data(通過(guò)此操作將單片機(jī)引腳設(shè)置為輸入)。
- 從機(jī)(DHT11)收到起始信號(hào)后進(jìn)行應(yīng)答:
- 從機(jī)拉低data,主機(jī)讀取到data線被拉低持續(xù)80us后從機(jī)拉高data線, 持續(xù)80us,直到高電平結(jié)束,意味著主機(jī)可以開(kāi)始接受數(shù)據(jù)。
- 主機(jī)開(kāi)始接收數(shù)據(jù):
- 主機(jī)先把data線拉高(io設(shè)置為輸入)
- 從機(jī)把data線拉低,主機(jī)讀取data線電平,直到低電平結(jié)束(大約50us)
- 從機(jī)拉高data線后,延遲40us左右(28~70us之間)主機(jī)再次讀取data線電平,如果為低電平,則為“0”,如果為高電平,則為“1”。
- 繼續(xù)重復(fù)上述1,2步驟累計(jì)40次。
4.2 MQ-2煙霧傳感器
簡(jiǎn)介
MQ-2常用于家庭和工廠的氣體泄漏監(jiān)測(cè)裝置,適宜于液化氣、苯、烷、酒精、氫氣、煙霧等的探測(cè)。故因此,MQ-2可以準(zhǔn)確來(lái)說(shuō)是一個(gè)多種氣體探測(cè)器。
MQ-2的探測(cè)范圍極其的廣泛。它的優(yōu)點(diǎn):靈敏度高、響應(yīng)快、穩(wěn)定性好、壽命長(zhǎng)、驅(qū)動(dòng)電路簡(jiǎn)單。
二、MQ-2的工作原理
MQ-2型煙霧傳感器屬于二氧化錫半導(dǎo)體氣敏材料,屬于表面離子式N型半導(dǎo)體。處于200~300攝氏度時(shí),二氧化錫吸附空氣中的氧,形成氧的負(fù)離子吸附,使半導(dǎo)體中的電子密度減少,從而使其電阻值增加。當(dāng)與煙霧接觸時(shí),如果晶粒間界處的勢(shì)壘收到煙霧的調(diào)至而變化,就會(huì)引起表面導(dǎo)電率的變化。利用這一點(diǎn)就可以獲得這種煙霧存在的信息,煙霧的濃度越大,導(dǎo)電率越大,輸出電阻越低,則輸出的模擬信號(hào)就越大。
MQ-2應(yīng)用電路
MQ-2常用的電路有兩種,一種使用采用比較器電路監(jiān)控,另一種為ADC電路檢測(cè)。
比較器電路
MQ-2的4腳輸出隨煙霧濃度變化的直流信號(hào),被加到比較器U1A的2腳,Rp構(gòu)成比較器的門(mén)檻電壓。當(dāng)煙霧濃度較高輸出電壓高于門(mén)檻電壓時(shí),比較器輸出低電平(0v),此時(shí)LED亮報(bào)警;當(dāng)濃度降低傳感器的輸出電壓低于門(mén)檻電壓時(shí),比較器翻轉(zhuǎn)輸出高電平(Vcc),LED熄滅。調(diào)節(jié)Rp,可以調(diào)節(jié)比較器的門(mén)檻電壓,從而調(diào)節(jié)報(bào)警輸出的靈敏度。
R1串入傳感器的加熱回路,可以保護(hù)加熱絲免受冷上電時(shí)的沖擊。
ADC轉(zhuǎn)換電路
MQ-2傳感器另外一個(gè)采集方法為AD信號(hào)采集,即將電壓信號(hào)轉(zhuǎn)化為數(shù)字信號(hào),進(jìn)而轉(zhuǎn)化為精確的煙霧濃度值。MQ-2傳感器的4腳、6腳的電壓為輸出信號(hào),Rs為傳感器的本體電阻。其中若氣體濃度上升,必導(dǎo)致Rs下降。而Rs的下降則會(huì)導(dǎo)致MQ-2的4腳、6腳對(duì)地輸出的電壓增大。所以氣體濃度增大,其輸出的電壓也會(huì)增大,最終通過(guò)ADC0832轉(zhuǎn)換后數(shù)值增大。
4.3 ESP8266WIFI模塊
簡(jiǎn)介
ESP8266 系列模組是深圳市安信可科技有限公司開(kāi)發(fā)的一系列基于樂(lè)鑫ESP8266的低功耗UART-WiFi芯片模組,可以方便地進(jìn)行二次開(kāi)發(fā),接入云端服務(wù),實(shí)現(xiàn)手機(jī)3/4G全球隨時(shí)隨地的控制,加速產(chǎn)品原型設(shè)計(jì)。
尺寸、管腳定義
ESP8266的指令介紹
AT指令可以細(xì)分四種類(lèi)型:
1.測(cè)試指令:AT+=?
該命令用于查詢(xún)?cè)O(shè)置指令的參數(shù)以及取值的范圍
2.查詢(xún)指令:AT+?
該命令用于返回參數(shù)的當(dāng)前值
3.設(shè)置指令:AT+=<’’’>
該命令用于設(shè)置用戶(hù)自定義的參數(shù)
4.執(zhí)行指令:AT+
該命令用于執(zhí)行受模塊內(nèi)部程序控制的變參數(shù)不可變的功能ESP8266的指令測(cè)試
可以通過(guò)STM開(kāi)發(fā)板轉(zhuǎn)為電平轉(zhuǎn)換的功能連接上ESP8266模塊在通過(guò)串口顯示窗口在PC機(jī)上熱輸入AT指令來(lái)進(jìn)行操作。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-827509.html
ESP8266的AT指令一覽文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-827509.html
5 部分核心代碼
//DHT11溫濕度傳感器部分
#include "reg52.h"
#include "LCD1602.h"
#include "intrins.h"
//typedef unsigned char uchar;
//typedef unsigned int uint;
//定義變量
sbit Data=P3^6;
uchar rec_dat[13];//用于保存接收到的數(shù)據(jù)組
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); //延時(shí)18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一個(gè)字節(jié)
{
uchar i,dat=0;
for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
{
while(!Data); //等待50us低電平過(guò)去
DHT11_delay_us(8); //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
dat<<=1; //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
if(Data==1) //數(shù)據(jù)為1時(shí),使dat加1來(lái)接收數(shù)據(jù)1
dat+=1;
while(Data); //等待數(shù)據(jù)線拉低
}
return dat;
}
void DHT11_receive() //接收40位的數(shù)據(jù)
{
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); //拉高后延時(shí)80us
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); //結(jié)束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*數(shù)據(jù)處理,方便顯示*/
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()
{
//使用lcd1602顯示數(shù)據(jù)
DHT11_receive();
lcd1602(rec_dat);
}
// MQ-2煙霧傳感器
unsigned char GetYanWuValue(void)
{
unsigned int sum=0;
unsigned char m,value=0;
for(m=0;m<20;m++) //讀50次AD值
sum = adc0832(0)+sum; //讀到的AD值,將讀到的數(shù)據(jù)累加到sum
value=(unsigned char)(sum/20); //跳出上面的for循環(huán)后,將累加的總數(shù)除以50得到平均值value
if(value > ADC_Zero)
value = value - ADC_Zero; //首先減去零點(diǎn)漂移
else
value = 0;
return value;
}
//wifi模塊部分
#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "usart3.h"
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
//ESP8266模塊和PC進(jìn)入透?jìng)髂J?/span>
void esp8266_start_trans(void)
{
//設(shè)置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式
esp8266_send_cmd("AT+CWMODE=1","OK",50);
//讓W(xué)ifi模塊重啟的命令
esp8266_send_cmd("AT+RST","ready",20);
delay_ms(1000); //延時(shí)3S等待重啟成功
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//讓模塊連接上自己的路由
while(esp8266_send_cmd("AT+CWJAP=\"111\",\"11111111\"","WIFI GOT IP",600));
//=0:?jiǎn)温愤B接模式 =1:多路連接模式
esp8266_send_cmd("AT+CIPMUX=0","OK",20);
//建立TCP連接 這四項(xiàng)分別代表了 要連接的ID號(hào)0~4 連接類(lèi)型 遠(yuǎn)程服務(wù)器IP地址 遠(yuǎn)程服務(wù)器端口號(hào)
while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"xxx.xxx.xxx.xxx\",xxxx","CONNECT",200));
//是否開(kāi)啟透?jìng)髂J? 0:表示關(guān)閉 1:表示開(kāi)啟透?jìng)?/span>
esp8266_send_cmd("AT+CIPMODE=1","OK",200);
//透?jìng)髂J较?開(kāi)始發(fā)送數(shù)據(jù)的指令 這個(gè)指令之后就可以直接發(fā)數(shù)據(jù)了
esp8266_send_cmd("AT+CIPSEND","OK",50);
}
//ESP8266退出透?jìng)髂J? 返回值:0,退出成功;1,退出失敗
//配置wifi模塊,通過(guò)想wifi模塊連續(xù)發(fā)送3個(gè)+(每個(gè)+號(hào)之間 超過(guò)10ms,這樣認(rèn)為是連續(xù)三次發(fā)送+)
u8 esp8266_quit_trans(void)
{
u8 result=1;
u3_printf("+++");
delay_ms(1000); //等待500ms太少 要1000ms才可以退出
result=esp8266_send_cmd("AT","OK",20);//退出透?jìng)髋袛?
if(result)
printf("quit_trans failed!");
else
printf("quit_trans success!");
return result;
}
//向ESP8266發(fā)送命令
//cmd:發(fā)送的命令字符串;ack:期待的應(yīng)答結(jié)果,如果為空,則表示不需要等待應(yīng)答;waittime:等待時(shí)間(單位:10ms)
//返回值:0,發(fā)送成功(得到了期待的應(yīng)答結(jié)果);1,發(fā)送失敗
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //發(fā)送命令
if(ack&&waittime) //需要等待應(yīng)答
{
while(--waittime) //等待倒計(jì)時(shí)
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的應(yīng)答結(jié)果
{
if(esp8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;//得到有效數(shù)據(jù)
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
//ESP8266發(fā)送命令后,檢測(cè)接收到的應(yīng)答
//str:期待的應(yīng)答結(jié)果
//返回值:0,沒(méi)有得到期待的應(yīng)答結(jié)果;其他,期待應(yīng)答結(jié)果的位置(str的位置)
u8* esp8266_check_cmd(u8 *str)
{
char *strx=0;
if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結(jié)束符
strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
//向ESP8266發(fā)送數(shù)據(jù)
//cmd:發(fā)送的命令字符串;waittime:等待時(shí)間(單位:10ms)
//返回值:發(fā)送數(shù)據(jù)后,服務(wù)器的返回驗(yàn)證碼
u8* esp8266_send_data(u8 *cmd,u16 waittime)
{
char temp[5];
char *ack=temp;
USART3_RX_STA=0;
u3_printf("%s",cmd); //發(fā)送命令
if(waittime) //需要等待應(yīng)答
{
while(--waittime) //等待倒計(jì)時(shí)
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的應(yīng)答結(jié)果
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結(jié)束符
ack=(char*)USART3_RX_BUF;
printf("ack:%s\r\n",(u8*)ack);
USART3_RX_STA=0;
break;//得到有效數(shù)據(jù)
}
}
}
return (u8*)ack;
}
5 最后
到了這里,關(guān)于單片機(jī)項(xiàng)目分享 Stm32 WIFI智能家居溫濕度和煙霧檢測(cè)系統(tǒng) - 單片機(jī) 物聯(lián)網(wǎng) 嵌入式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!