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)目,今天要分享的是
?? 畢業(yè)設(shè)計(jì) stm32 wifi遠(yuǎn)程溫控風(fēng)扇系統(tǒng)
??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):4分
?? 項(xiàng)目分享:見(jiàn)文末!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-826178.html
實(shí)物演示效果
畢業(yè)設(shè)計(jì) stm32 wifi遠(yuǎn)程溫控風(fēng)扇系統(tǒng) - 單片機(jī) 嵌入式 物聯(lián)網(wǎng)
1 主要功能
按照時(shí)間規(guī)劃和目標(biāo)進(jìn)度完成開(kāi)發(fā)基于STM32遠(yuǎn)程智能降溫系統(tǒng)的電路設(shè)計(jì)、程序設(shè)計(jì)、程序調(diào)試、軟硬結(jié)合調(diào)試,從而實(shí)現(xiàn)風(fēng)扇降溫系統(tǒng)的自動(dòng)智能模式和遠(yuǎn)程手動(dòng)模式。
(1)自動(dòng)智能模式
自動(dòng)智能模式可根據(jù)設(shè)備的溫濕度傳感器進(jìn)行時(shí)實(shí)數(shù)據(jù)檢測(cè),進(jìn)行自動(dòng)反饋達(dá)到自動(dòng)開(kāi)啟風(fēng)扇降溫。
(2)遠(yuǎn)程手動(dòng)模式
在自動(dòng)智能模式中無(wú)法滿足降溫特殊需求情況,可根據(jù)特殊需求切換遠(yuǎn)程手動(dòng)模式,在開(kāi)發(fā)已有的客戶端上發(fā)送降溫命令,從而實(shí)現(xiàn)根據(jù)特殊需求情況降溫的遠(yuǎn)程手動(dòng)模式。
2 系統(tǒng)架構(gòu)
(1)空氣溫濕度傳感器
DHT11 是一款濕溫度一體化的數(shù)字傳感器。該傳感器包括一個(gè)電阻式測(cè)濕元件和一個(gè) NTC測(cè)溫元件,并與一個(gè)高性能 8 位單片機(jī)相連接。通過(guò)單片機(jī)等微處理器簡(jiǎn)單的電路連接就能夠?qū)崟r(shí)的采集本地濕度和溫度。DHT11 與單片機(jī)之間能采用簡(jiǎn)單的單總線進(jìn)行通信,僅僅需要一個(gè) I/O 口。傳感器內(nèi)部濕度和溫度數(shù)據(jù) 40Bit 的數(shù)據(jù)一次性傳給單片機(jī),數(shù)據(jù)采用校驗(yàn)和方式進(jìn)行校驗(yàn),有效的保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。DHT11 功耗很低,5V 電源電壓下,工作平均最大電流 0.5mA。
(2)光照強(qiáng)度傳感器
光照強(qiáng)度的監(jiān)測(cè)采用的是bh1750光照強(qiáng)度傳感器。有接近視覺(jué)靈敏度的光譜靈敏度特性,支持I2CBUS接口,支持1.8v邏輯輸入接口。傳感器有兩種可選的I2Cslave地址,無(wú)需其他外部件。光源依賴性弱,受紅外線影響很小。傳感器通過(guò)降低功率功能,實(shí)現(xiàn)低電流化。通過(guò)50Hz/60Hz除光噪音功能實(shí)現(xiàn)穩(wěn)定的測(cè)定,最小誤差變動(dòng)在±20%。
(3)WiFi通信模塊
ESP8266是一款高性能的無(wú)線 WIFI模塊。ESP8266 模塊采用串口(LVTTL)與 MCU(或其他串口設(shè)備)通信,內(nèi)置 TCP/IP協(xié)議棧,能夠?qū)崿F(xiàn)串口與 WIFI 之間的轉(zhuǎn)換。通過(guò)ESP8266模塊,傳統(tǒng)的串口設(shè)備只是需要簡(jiǎn)單的串口配置,即可通過(guò)網(wǎng)絡(luò)(WIFI)傳輸自己的數(shù)據(jù)。
ATK-ESP8266 模塊支持 LVTTL 串口,兼容 3.3V 和 5V 單片機(jī)系統(tǒng),可以很方便的與你的產(chǎn)品進(jìn)行連接。模塊支持串口轉(zhuǎn) WIFI STA、串口轉(zhuǎn) AP 和 WIFI STA+WIFI AP 的模式,從而快速構(gòu)建串口-WIFI 數(shù)據(jù)傳輸方案。
使用到的硬件器件
- STM32F103RCT6開(kāi)發(fā)板 * 1
- DHT11溫濕度傳感器 * 1
- 繼電器模塊 * 1
- Wifi - ESP01S * 1
- 1.44寸液晶屏(SPI接口) * 1
- 小風(fēng)扇模塊 * 1
- 杜邦線若干
3 核心軟件設(shè)計(jì)
控制系統(tǒng)軟件使用 C 語(yǔ)言編程。
使用模塊化設(shè)計(jì), 除主程序外, 還有各功能子程序, 分別執(zhí)行直流電機(jī)驅(qū)動(dòng)調(diào)速及溫度采集、 顯示等功能, 編輯環(huán)境采用集成開(kāi)發(fā)環(huán)環(huán)境 Keil。
程序總體運(yùn)行流程圖如下:
3.3.2 初始化
系統(tǒng)初始化包括 STM32 系統(tǒng)定時(shí)器初始化, GPIO 口初始化以及 LCD1602 初始化等。
3.3.3 溫度采集與顯示
DS18B20 溫度傳感器進(jìn)行溫度采集時(shí), 要依次進(jìn)行初始化, ROM 操作指令, 存儲(chǔ)器操作指令, 數(shù)據(jù)傳輸?shù)炔僮?/p>
篇幅有限,不過(guò)多復(fù)述詳細(xì)設(shè)計(jì)細(xì)節(jié),詳細(xì)的設(shè)計(jì)分享在論文中。。。
關(guān)鍵代碼
#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include <LCD1602.h>
#include "bsp_ds18b20.h"
int main()
{ int PWM,low,zhouqi;
float wendu;
int wendu1;
zhouqi=500;
low=zhouqi-PWM;
SysTick_Init();
init1602();
lcdpos(1,0);
writestring("TEM: 00.0");
GPIO_SetBits(GPIOB,GPIO_Pin_0);
while( DS18B20_Init())
{
lcdpos(0,0);
writestring(" no ds18b20 exit");
}
lcdpos(0,0);
writestring("ds18b20 exit");
for(;;)
{
DS18B20_Get_Temp(wendu);
if (wendu<0)
{ lcdpos(1,4);
writestring("-");
}
wendu1=wendu*100;
lcdpos(1,5);
write_dat(wendu1/10000+0x30);
lcdpos(1,6);
write_dat(wendu1%10000/1000+0x30);
lcdpos(1,7);
write_dat(wendu1%1000/100+0x30);
lcdpos(1,9);
write_dat(wendu1%100/10+0x30);
lcdpos(1,10);
write_dat(wendu1%10+0x30);
Delay_ms(2000);
if(wendu1>30)
{ low=500;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
Delay_ms(PWM);
}
if(wendu1<15)
{ low=0;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
Delay_ms(PWM);
}
if(wendu1>=15&wendu1<20)
{ low=100;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
Delay_ms(PWM);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
Delay_ms(low);
}
if(wendu1>=20&wendu1<25)
{
low=200;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
Delay_ms(PWM);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
Delay_ms(low);
}
if(wendu1>=25&wendu1<30)
{ low=300;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
Delay_ms(PWM);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
Delay_ms(low);
}
}
}
2.DS18B20 子程序
#include "bsp_ds18b20.h"
/*
* 函數(shù)名: DS18B20_GPIO_Config
* 描述 : 配置 DS18B20 用到的 I/O 口
* 輸入 : 無(wú)
* 輸出 : 無(wú)
*/
static void DS18B20_GPIO_Config(void)
{
/*定義一個(gè) GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*開(kāi)啟 DS18B20_PORT 的外設(shè)時(shí)鐘*/
RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
/*選擇要控制的 DS18B20_PORT 引腳*/
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
/*設(shè)置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設(shè)置引腳速率為 50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*調(diào)用庫(kù)函數(shù), 初始化 DS18B20_PORT*/
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
}
/*
* 函數(shù)名: DS18B20_Mode_IPU
* 描述 : 使 DS18B20-DATA 引腳變?yōu)檩斎肽J?* 輸入 : 無(wú)
* 輸出 : 無(wú)
*/
static void DS18B20_Mode_IPU(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*選擇要控制的 DS18B20_PORT 引腳*/
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
/*設(shè)置引腳模式為浮空輸入模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
/*調(diào)用庫(kù)函數(shù), 初始化 DS18B20_PORT*/
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
/*
* 函數(shù)名: DS18B20_Mode_Out_PP
* 描述 : 使 DS18B20-DATA 引腳變?yōu)檩敵瞿J?* 輸入 : 無(wú)
* 輸出 : 無(wú)
*/
static void DS18B20_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*選擇要控制的 DS18B20_PORT 引腳*/
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
/*設(shè)置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設(shè)置引腳速率為 50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*調(diào)用庫(kù)函數(shù), 初始化 DS18B20_PORT*/
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
/*
*主機(jī)給從機(jī)發(fā)送復(fù)位脈沖
*/
static void DS18B20_Rst(void)
{
/* 主機(jī)設(shè)置為推挽輸出 */
DS18B20_Mode_Out_PP();
DS18B20_DATA_OUT(LOW);
/* 主機(jī)至少產(chǎn)生 480us 的低電平復(fù)位信號(hào) */
Delay_us(750);
/* 主機(jī)在產(chǎn)生復(fù)位信號(hào)后, 需將總線拉高 */
DS18B20_DATA_OUT(HIGH);
Delay_us(15);
}
/*
* 檢測(cè)從機(jī)給主機(jī)返回的存在脈沖
* 0: 成功
* 1: 失敗
*/
static uint8_t DS18B20_Presence(void)
{
uint8_t pulse_time = 0;
/* 主機(jī)設(shè)置為上拉輸入 */
DS18B20_Mode_IPU();
while( DS18B20_DATA_IN() && pulse_time<100 )
{
pulse_time++;
Delay_us(1);
}
/ * 經(jīng)過(guò) 100us 后, 存在脈沖都還沒(méi)有到來(lái)*/
if( pulse_time >=100 )
return 1;
else
pulse_time = 0;
/* 存在脈沖到來(lái), 且存在的時(shí)間不能超過(guò) 240us */
while( !DS18B20_DATA_IN() && pulse_time<240 )
{
pulse_time++;
Delay_us(1);
}
if( pulse_time >=240 )
return 1;
else
return 0;
}
/*
* 從 DS18B20 讀取一個(gè) bit
*/
static uint8_t DS18B20_Read_Bit(void)
{
uint8_t dat; /* 讀 0 和讀 1 的時(shí)間至少要大于 60us */
DS18B20_Mode_Out_PP();
/* 讀時(shí)間的起始: 必須由主機(jī)產(chǎn)生 >1us <15us 的低電平信號(hào) */
DS18B20_DATA_OUT(LOW);
Delay_us(10);
/ * 設(shè)置成輸入, 釋放總線, 由外部上拉電阻將總線拉高 */
DS18B20_Mode_IPU();
//Delay_us(2);
if( DS18B20_DATA_IN() == SET )
dat = 1;
else
dat = 0;
/* 這個(gè)延時(shí)參數(shù)請(qǐng)參考時(shí)序圖 */
Delay_us(45);
return dat;
}
/*
* 從 DS18B20 讀一個(gè)字節(jié), 低位先行
*/
uint8_t DS18B20_Read_Byte(void)
{
uint8_t i, j, dat = 0;
for(i=0; i<8; i++)
{
j = DS18B20_Read_Bit();
dat = (dat) | (j<<i);
}
return dat;
}
/*
* 寫一個(gè)字節(jié)到 DS18B20, 低位先行
*/
void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t i, testb;
DS18B20_Mode_Out_PP();
for( i=0; i<8; i++ )
{
testb = dat&0x01;
dat = dat>>1;
/* 寫 0 和寫 1 的時(shí)間至少要大于 60us */
if (testb)
{
DS18B20_DATA_OUT(LOW);
/* 1us < 這個(gè)延時(shí) < 15us */
Delay_us(8);
DS18B20_DATA_OUT(HIGH);
Delay_us(58);
}
else
{
DS18B20_DATA_OUT(LOW);
/* 60us < Tx 0 < 120us */
Delay_us(70);
DS18B20_DATA_OUT(HIGH);
/* 1us < Trec(恢復(fù)時(shí)間) < 無(wú)窮大*/
Delay_us(2);
}
}
}
void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC); /* 跳過(guò) ROM */
DS18B20_Write_Byte(0X44); /* 開(kāi)始轉(zhuǎn)換 */
}
uint8_t DS18B20_Init(void)
{
DS18B20_GPIO_Config();
DS18B20_Rst();
return DS18B20_Presence();
}
float DS18B20_Get_Temp(float f_tem)
{
uint8_t tpmsb, tplsb;
short s_tem;
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC); /* 跳過(guò) ROM */
DS18B20_Write_Byte(0X44); /* 開(kāi)始轉(zhuǎn)換 */
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC); /* 跳過(guò) ROM */
DS18B20_Write_Byte(0XBE); /* 讀溫度值 */
tplsb = DS18B20_Read_Byte();
tpmsb = DS18B20_Read_Byte();
s_tem = tpmsb<<8;
s_tem = s_tem | tplsb;
I f( s_tem < 0 ) /* 負(fù)溫度 */
f_tem = (~s_tem+1) * 0.0625;
else
f_tem = s_tem * 0.0625;
return f_tem;
}
/*******************************************************************
篇幅有限,只展示部分代碼
********************************************************************/
4 實(shí)現(xiàn)效果
演示視頻
畢業(yè)設(shè)計(jì) stm32 wifi遠(yuǎn)程溫控風(fēng)扇系統(tǒng) - 單片機(jī) 嵌入式 物聯(lián)網(wǎng)
5 最后
包含內(nèi)容
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-826178.html
?? 項(xiàng)目分享:見(jiàn)文末!
到了這里,關(guān)于單片機(jī)畢設(shè) stm32 wifi遠(yuǎn)程溫控風(fēng)扇系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!