一、設(shè)計簡介
本畢業(yè)設(shè)計項目是基于STM32單片機的物聯(lián)網(wǎng)機智云智能家居系統(tǒng),包含原理圖PCB手機APP。智能家居系統(tǒng)以STM32C8T6單片機為核心,結(jié)合多種傳感器和執(zhí)行器,通過ESP8266實現(xiàn)與機智云平臺的通信,用戶可通過手機APP進行遠程監(jiān)控和管理。系統(tǒng)具有網(wǎng)絡(luò)化、數(shù)字化和智能化的特點,能夠?qū)崿F(xiàn)對家居環(huán)境的全方位監(jiān)視和智能調(diào)節(jié)。
二、功能設(shè)計
溫濕度監(jiān)控模塊
使用DHT11溫濕度傳感器采集室內(nèi)溫濕度數(shù)據(jù)。
數(shù)據(jù)通過STM32單片機處理后,在0.96寸OLED顯示屏上實時顯示。
當(dāng)溫濕度超過設(shè)定閾值時,觸發(fā)蜂鳴器和LED報警燈進行警示。
氣體檢測模塊
使用MQ-2、MQ-7和MQ-135氣體傳感器檢測室內(nèi)可燃氣體、有害氣體等。
當(dāng)檢測到有害氣體濃度超標(biāo)時,系統(tǒng)通過蜂鳴器和LED報警燈進行警示,并通過ESP8266將報警信息上傳至機智云平臺。
氣壓監(jiān)測模塊
使用BMP290氣壓傳感器監(jiān)測室內(nèi)氣壓變化。
數(shù)據(jù)通過STM32單片機處理后,可在OLED顯示屏上顯示,或上傳至機智云平臺進行遠程監(jiān)控。
光照強度監(jiān)測模塊
當(dāng)光照強度低于設(shè)定閾值時,系統(tǒng)可自動開啟LED照明燈,或通過ESP8266發(fā)送報警信息至手機APP。
舵機控制模塊
使用SG90舵機控制窗簾、窗戶等家居設(shè)備的開關(guān)。
用戶可通過手機APP發(fā)送控制指令至機智云平臺,再通過ESP8266將指令傳輸至STM32單片機,最終控制舵機的動作。
智能報警模塊
當(dāng)系統(tǒng)檢測到異常情況(如溫濕度超標(biāo)、有害氣體濃度超標(biāo)等)時,觸發(fā)蜂鳴器和LED報警燈進行本地警示。
同時,通過ESP8266將報警信息上傳至機智云平臺,用戶可通過手機APP接收報警信息。
遠程監(jiān)控模塊
用戶可通過機智云手機APP實時查看家居環(huán)境的溫濕度、氣壓、光照強度等數(shù)據(jù)。
可通過手機APP發(fā)送控制指令至機智云平臺,再通過ESP8266將指令傳輸至STM32單片機,實現(xiàn)對家居設(shè)備的遠程控制。
三、所需硬件連接
STM32最小系統(tǒng)板
ESP8266 Wi-Fi模塊
BMP280氣壓傳感器
MQ-2煙霧傳感器
MQ-7、MQ-135氣體傳感器
DHT11溫濕度傳感器
光敏電阻ADC
SG90舵機
蜂鳴器、LED報警
0.96OLED顯示屏
繼電器模塊
四、軟件環(huán)境
Keil5 MDK:stm32單片機源代碼程序編寫及下載代碼
ST-Link 驅(qū)動程序:用于下載程序到 STM32。
機智云手機APP
五、所需硬件以及傳感器模塊
1.1 stm32f103c8t6(1個)
STM32F103C8T6單片機是一款非常用的單片機型號,可以方便靈活的進行嵌入式系統(tǒng)開發(fā)。首先,它的處理器基于Cortex-M3內(nèi)核,最高工作頻率達72MHz。STM32F103C8T6擁有64KB閃存和20KB SRAM,非常適合中小型單片機開發(fā)項目。
具有非常豐富的外設(shè)接口,如串口USART、SPI通信、I2C通訊、CAN通訊和USB,在與單片機外設(shè)通信方面非常方便。有多個GPIO通用IO口,定時器,中斷系統(tǒng),靈活配置為輸入,輸出、模擬輸入或PWM輸出,可以連接各類傳感器和模塊。
內(nèi)部集成的12位逐次逼近型ADC和DAC,支持高精度模擬信號處理。STM32F103C8T6還支持低功耗模式,適合電池供電的應(yīng)用場景。結(jié)合強大的STM32開發(fā)生態(tài),包括庫函數(shù)和工具鏈,可以讓開發(fā)者很方便的完成單片機項目的開發(fā)。
1.2 wifi模塊ESP8266(ESP01s)(1個)
ESP-01S是安信可出品的一款功能強大的Wi-Fi模塊采用ESP8266處理器,ESP-01S模塊需要與主控制器(如Arduino、STM32等)進行連接,通過串口通信UART接口與單片機進行數(shù)據(jù)傳輸。ESP-01S是一款功能強大、易于使用的Wi-Fi模塊,適用于各種物聯(lián)網(wǎng)和智能家居應(yīng)用。
Wi-Fi功能:支持標(biāo)準(zhǔn)的IEEE802.11 b/g/n協(xié)議和完整的TCP/IP協(xié)議棧,可以方便地與其他設(shè)備或網(wǎng)絡(luò)進行通信。
工作模式:支持STA模式和AP模式。在STA模式下,可以通過路由器連接到互聯(lián)網(wǎng),使手機或電腦能夠?qū)崿F(xiàn)對設(shè)備的遠程控制。在AP模式下,可以作為熱點,使其他設(shè)備能夠連接到它。
AT指令支持:初始情況下,ESP-01S通常預(yù)裝了Espressif提供的AT指令固件,這意味著可以通過發(fā)送簡單的AT指令來控制模塊的Wi-Fi連接和數(shù)據(jù)傳輸。
二、軟件配置
固件燒錄:用戶可以根據(jù)需要進行固件燒錄和配置,以滿足特定的應(yīng)用需求。
串口通信參數(shù):通常ESP-01S默認波特率為115200,數(shù)據(jù)位為8位,停止位為1位,無校驗。
1.3MQ系列傳感器(3個)
MQ-2、MQ-7和MQ-135都是MQ系列的氣體傳感器模塊,
MQ-2氣體傳感器所使用的氣敏材料是在清潔空氣中電導(dǎo)率較低的二氧化錫(SnO2)。當(dāng)傳感器所處環(huán)境中存在可燃氣體時,傳感器的電導(dǎo)率隨空氣中可燃氣體濃度的增加而增大。利用簡單的電路即可將電導(dǎo)率的變化轉(zhuǎn)換為與該傳感器氣體濃度相對應(yīng)的輸出信號。MQ-2氣體傳感器對液化氣、丙烷、氫氣的靈敏度高,對天然氣和其他可燃蒸汽的檢測也很理想。這種傳感器可檢測多種可燃性氣體,是一款適合多種應(yīng)用的低成本傳感器。
引腳說明:
VCC:電源正極接口,可外接3.3~5V供電電源。
GND:電源負極接口,可外接電源負極或地線(GND)。
DO:數(shù)字信號輸出接口(0和1),可外接單片機的GPIO。
AO:模擬信號輸出接口,可外接單片機的ADC采樣通道。
MQ-7是一氧化碳傳感器模塊,屬于氣敏傳感器檢測報警模塊。它能夠靈敏地檢測一氧化碳氣體的濃度,并輸出相應(yīng)的電信號。MQ-7一氧化碳傳感器模塊廣泛應(yīng)用于家庭用氣體泄漏報警器、工業(yè)用可燃氣體報警器等領(lǐng)域,用于監(jiān)測一氧化碳氣體的濃度
1.4BMP280氣壓傳感器(3個)
BMP280是一款由博世公司推出的數(shù)字氣壓傳感器,它采用了先進的APSM(Advanced Porous Silicon Membrane)工藝,具有小封裝、低功耗的特點:
一、外觀與引腳
BMP280傳感器通常具有六個引腳,具體名稱與功能如下
(VCC):3.3V供電,切記不可以接5V,以避免燒毀。
(GND):接地。
(SCL):I2C通信模式時鐘信號。
(SDA):I2C通信模式數(shù)據(jù)信號。
(CSB):SPI通信模式下用到的引腳,片選引腳,拉低后啟用。
(SDO):傳感器地址控制位。
有些BMP280傳感器版本可能有8個引腳,但常用的仍是上述6個引腳。
二、功能與參數(shù)
BMP280傳感器能夠測量環(huán)境溫濕度和大氣壓強,其主要參數(shù)如下:
溫度測量:
測量范圍:-40~85°C。
測量誤差:±0.5℃。
分辨率:0.1℃。
測量范圍:0%~100%。
濕度響應(yīng)時間:大于1秒。
濕度測量誤差:±2%。
分辨率:0.8%。
測量范圍:300~1100hPa(百帕斯卡)。
測量誤差:±1hPa。
分辨率:0.18Pa。
相對精度:±0.12hPa(相當(dāng)于±1米)。
三、通信方式
BMP280支持I2C和SPI兩種通信方式
I2C通信:通過SCL(時鐘線)和SDA(數(shù)據(jù)線)進行數(shù)據(jù)傳輸,SDO用于設(shè)置傳感器的I2C地址。
SPI通信:通過SCL(時鐘線)、SDI(數(shù)據(jù)輸入線,三線模式下為雙向數(shù)據(jù)線)和SDO(數(shù)據(jù)輸出線,三線模式下無用)進行數(shù)據(jù)傳輸,CSB用于片選。
四、工作模式
BMP280傳感器有三種工作模式
睡眠模式:傳感器不工作,功耗最低。
觸發(fā)模式:執(zhí)行單次測量后,傳感器進入睡眠狀態(tài),以節(jié)省資源。
正常模式:傳感器在活動測量周期和非活動待機周期之間自動循環(huán)。
五、應(yīng)用與特點
BMP280傳感器廣泛應(yīng)用于無人機定高、天氣監(jiān)控、增強GPS導(dǎo)航、室內(nèi)導(dǎo)航、戶外休閑和體育應(yīng)用、天氣預(yù)報、醫(yī)療保?。ㄈ绶位盍繙y定)等領(lǐng)域。其特點包括:
六、使用注意事項
在使用BMP280傳感器時,需要注意供電電壓不能超過3.3V,以避免損壞傳感器。
在進行數(shù)據(jù)采集之前,需要對傳感器進行初始化,包括讀取補償參數(shù)、設(shè)置工作模式、配置過采樣參數(shù)等。
在讀取數(shù)據(jù)時,需要按照數(shù)據(jù)手冊中的說明進行寄存器操作,以確保數(shù)據(jù)的正確性和穩(wěn)定性。
六、原理圖及設(shè)計流程圖
七、程序代碼
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "ADC.h"
#include "usart3.h"
#include "key.h"
#include "oled.h"
#include "math.h"
#include "dht11.h"
#include "bmp280.h"
#include "gizwits_product.h"
u32 STM32_xx0=0X4E4C4A;
u32 STM32_xx1=0X364B1322;
u32 STM32_xx2=0X132D13 ;
#define FLASH_SAVE_ADDR 0x08010000
u8 buff[30];//參數(shù)顯示緩存數(shù)組
u8 count;
dataPoint_t currentDataPoint;//云端數(shù)據(jù)點
u8 wifi_sta;//wifi連接狀態(tài)標(biāo)志
u8 mode=0;//模式控制自動和手動
u8 NTP_sta=0;//網(wǎng)諾時間獲取狀態(tài)
u8 display_contrl=0;
u8 curtain_flag=0;
u8 last_curtain_flag=0;
extern u8 DHT11_Temp,DHT11_Hum;//溫濕度
u16 Pre;//氣壓檢測值
u16 gz_value;//光照檢測值
u16 m2_value;//煙霧檢測值
u16 m7_value;//一氧化碳檢測值
u16 m135_value;//空氣質(zhì)量檢測值
u16 A_DHT11_Temp=35;//溫度閾值 高于閾值時報警
u16 A_DHT11_Hum=20;//濕度閾值 低于閾值時報警
u16 A_pre=1500;//氣壓閾值 低于閾值時報警
u16 A_gz_value=1000;//光照強度閾值 低于閾值時打開窗簾和照明燈
u16 A_m2_value=4000;//煙霧閾值 高于閾值時報警
u16 A_m7_value=4000;//一氧化碳閾值 高于閾值時報警
u16 A_m135_value=1500;//空氣質(zhì)量閾值 低于閾值時報警
//協(xié)議初始化
void Gizwits_Init(void)
{
TIM3_Int_Init(9,7199);//1MS系統(tǒng)定時
usart3_init(9600);//WIFI初始化
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//設(shè)備狀態(tài)結(jié)構(gòu)體初始化
gizwitsInit();//緩沖區(qū)初始化
}
//數(shù)據(jù)采集
void userHandle(void)
{
currentDataPoint.valueLED=!LED0;
currentDataPoint.valueCurtain=curtain_flag;
currentDataPoint.valueTemp=DHT11_Temp;
currentDataPoint.valueHum=DHT11_Hum;
currentDataPoint.valuePre=Pre;
currentDataPoint.valueGZ_Value=gz_value;
currentDataPoint.valueMQ2_Value=m2_value;
currentDataPoint.valueMQ7_Value=m7_value;
currentDataPoint.valueMQ135_Value=m135_value;
}
void Get_Data(u16 count);//獲取傳感器數(shù)據(jù)
void WIFI_Contection(u8 key);//WiFi連接控制
void Canshu_Change(u8 key);//系統(tǒng)參數(shù)調(diào)節(jié)
void Mode_Change(u8 key);//模式切換
void BUJING_Cotrol(u8 mode,u16 time,u16 count);
int main(void)
{
u8 t=0;
int key_value;//按鍵值
uart_init(115200); //串口初始化為115200
delay_init(); //延時函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
Adc1_Channe_Init();//ADC通道初始化
KEY_Init();//按鍵引腳初始化
bmp280Init();
while(DHT11_Init());
LED_Init(); //初始化與LED連接的硬件接口
OLED_Init();//OLED初始化
OLED_Clear();//OLED清屏
Gizwits_Init();
BEEP = 0;
//STMFLASH_Write(FLASH_SAVE_ADDR+10,&A_DHT11_Temp,2);//開機讀取溫度閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+12,&A_DHT11_Hum,2);//開機讀取濕度閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+14,&A_pre,2);//開機讀取氣壓閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+18,&A_gz_value,2);//開機讀取光照強度閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+20,&A_m2_value,2);//開機讀取煙霧閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+22,&A_m7_value,2);//開機讀取一氧化碳閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+24,&A_m135_value,2);//開機讀取空氣質(zhì)量閾值
//STMFLASH_Read(FLASH_SAVE_ADDR+10,&A_DHT11_Temp,2);//開機讀取溫度閾值
//STMFLASH_Read(FLASH_SAVE_ADDR+12,&A_DHT11_Hum,2);//開機讀取濕度閾值
//STMFLASH_Read(FLASH_SAVE_ADDR+14,&A_pre,2);//開機讀取氣壓閾值
//STMFLASH_Read(FLASH_SAVE_ADDR+18,&A_gz_value,2);//開機讀取光照強度閾值
//STMFLASH_Read(FLASH_SAVE_ADDR+20,&A_m2_value,2);//開機讀取煙霧閾值
//STMFLASH_Read(FLASH_SAVE_ADDR+22,&A_m7_value,2);//開機讀取一氧化碳閾值
//STMFLASH_Read(FLASH_SAVE_ADDR+24,&A_m135_value,2);//開機讀取空氣質(zhì)量閾值
while(1)
{
Get_Data(0);
if(gz_value<=A_gz_value&&mode==0)
{
LED0=0;
curtain_flag=0;
}else if(gz_value>A_gz_value&&mode==0){
LED0=1;
curtain_flag=1;
}
if(last_curtain_flag!=curtain_flag&&mode==0)
{
BUJING_Cotrol(curtain_flag,3,270);
last_curtain_flag = curtain_flag;
}
if(last_curtain_flag!=currentDataPoint.valueCurtain&&mode==1)
{
BUJING_Cotrol(currentDataPoint.valueCurtain,3,270);
curtain_flag = currentDataPoint.valueCurtain;
last_curtain_flag = currentDataPoint.valueCurtain;
}
if(mode==1)
{
LED0=!currentDataPoint.valueLED;
}
if(DHT11_Temp>=A_DHT11_Temp||DHT11_Hum<=A_DHT11_Hum||Pre>=A_pre||m135_value<=A_m135_value||m2_value>=A_m2_value||m7_value>=A_m7_value)
{
//BEEP=!BEEP;
}else BEEP = 0;
key_value = KEY_Scan(0);
if(key_value==4)
{
display_contrl++;
}
if(display_contrl%2==0&&t>=10)
{
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese(16,0,2);
sprintf((char*)buff,":%2dC",DHT11_Temp);
OLED_ShowString(32,0,buff,16);//顯示溫度
OLED_ShowCHinese(64,0,1);
OLED_ShowCHinese(82,0,2);
sprintf((char*)buff,":%2d%%",DHT11_Hum);
OLED_ShowString(96,0,buff,16);//顯示濕度
OLED_ShowCHinese(0,2,3);
OLED_ShowCHinese(16,2,4);
sprintf((char*)buff,":%2dhpa ",Pre);
OLED_ShowString(32,2,buff,16);//顯示氣壓
OLED_ShowCHinese(0,4,5);
OLED_ShowCHinese(16,4,6);
OLED_ShowCHinese(32,4,7);
OLED_ShowCHinese(48,4,8);
sprintf((char*)buff,":%4dppm",gz_value);
OLED_ShowString(64,4,buff,16);//顯示光照強度
OLED_ShowCHinese(0,6,21);
OLED_ShowCHinese(16,6,22);
OLED_ShowCHinese(32,6,23);
OLED_ShowCHinese(48,6,24);
//sprintf((char*)buff,":%4dppm",m135_value);
//OLED_ShowString(64,6,buff,16);//顯示空氣質(zhì)量
OLED_ShowString(64,6,":",16);
}else if(display_contrl%2==1&&t>=10)
{
OLED_ShowCHinese(0,0,13);
OLED_ShowCHinese(16,0,14);
OLED_ShowCHinese(32,0,15);
OLED_ShowCHinese(48,0,16);
sprintf((char*)buff,":%4dppm",m2_value);
OLED_ShowString(64,0,buff,16);//顯示M2數(shù)據(jù)
OLED_ShowCHinese(0,2,17);
OLED_ShowCHinese(16,2,18);
OLED_ShowCHinese(32,2,19);
OLED_ShowCHinese(48,2,20);
sprintf((char*)buff,":%4dppm",m7_value);
OLED_ShowString(64,2,buff,16);//顯示M7數(shù)據(jù)
OLED_ShowCHinese(0,4,5);
OLED_ShowCHinese(16,4,6);
OLED_ShowCHinese(32,4,7);
OLED_ShowCHinese(48,4,8);
sprintf((char*)buff,":%4dppm",gz_value);
OLED_ShowString(64,4,buff,16);//顯示光照強度
OLED_ShowCHinese(0,6,21);
OLED_ShowCHinese(16,6,22);
OLED_ShowCHinese(32,6,23);
OLED_ShowCHinese(48,6,24);
// sprintf((char*)buff,":%4dppm",m135_value);
// OLED_ShowString(64,6,buff,16);//顯示M135數(shù)據(jù)
}
if(t>10)
{
if(m135_value>100)
{
OLED_ShowCHinese(80,6,23);//有人
OLED_ShowCHinese(96,6,24);
//報警
BEEP=!BEEP;
}
else
{
OLED_ShowCHinese(80,6,25);//無人
OLED_ShowCHinese(96,6,24);
BEEP = 0;
}
}
userHandle();//用戶數(shù)據(jù)采集
WIFI_Contection(key_value);//WiFi連接控制
gizwitsHandle((dataPoint_t *)¤tDataPoint);//機智云協(xié)議處理
Canshu_Change(key_value);
t++;
delay_ms(100);
}
}
void WIFI_Contection(u8 key)//WiFi連接控制
{
if(key==2)
{
printf("WIFI進入AirLink連接模式\r\n");
gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入
}
if(key==3)
{
printf("WIFI復(fù)位,請重新配置連接\r\n");
gizwitsSetMode(WIFI_RESET_MODE);//WIFI復(fù)位
}
}
void Canshu_Change(u8 key)
{
u8 obj=7;
if(key==1)
{
BEEP=0;
OLED_Clear();
while(1)
{
key = KEY_Scan(0);
if(key==1)
{
obj++;
if(obj>=8)
{
obj=0;
}
}
sprintf((char *)buff,"Working md:%4d",mode);
OLED_ShowString(8,0,buff,12);
sprintf((char *)buff,"A_Temp :%4d",A_DHT11_Temp);
OLED_ShowString(8,1,buff,12);
sprintf((char *)buff,"A_Hum :%4d",A_DHT11_Hum);
OLED_ShowString(8,2,buff,12);
sprintf((char *)buff,"A_pre :%4d",A_pre);
OLED_ShowString(8,3,buff,12);
sprintf((char *)buff,"A_gz_val :%4d",A_gz_value);
OLED_ShowString(8,4,buff,12);
sprintf((char *)buff,"A_m2_val :%4d",A_m2_value);
OLED_ShowString(8,5,buff,12);
sprintf((char *)buff,"A_m7_val :%4d",A_m7_value);
OLED_ShowString(8,6,buff,12);
sprintf((char *)buff,"A_m135_val:%4d",A_m135_value);
OLED_ShowString(8,7,buff,12);
if(obj==0)
{
OLED_ShowString(0,0," ",12);
OLED_ShowString(0,1,">",12);
OLED_ShowString(0,2," ",12);
OLED_ShowString(0,3," ",12);
OLED_ShowString(0,4," ",12);
OLED_ShowString(0,5," ",12);
OLED_ShowString(0,6," ",12);
OLED_ShowString(0,7," ",12);
}
if(obj==1)
{
OLED_ShowString(0,0," ",12);
OLED_ShowString(0,1," ",12);
OLED_ShowString(0,2,">",12);
OLED_ShowString(0,3," ",12);
OLED_ShowString(0,4," ",12);
OLED_ShowString(0,5," ",12);
OLED_ShowString(0,6," ",12);
OLED_ShowString(0,7," ",12);
}
if(obj==2)
{
OLED_ShowString(0,0," ",12);
OLED_ShowString(0,1," ",12);
OLED_ShowString(0,2," ",12);
OLED_ShowString(0,3,">",12);
OLED_ShowString(0,4," ",12);
OLED_ShowString(0,5," ",12);
OLED_ShowString(0,6," ",12);
OLED_ShowString(0,7," ",12);
}
if(obj==3)
{
OLED_ShowString(0,0," ",12);
OLED_ShowString(0,1," ",12);
OLED_ShowString(0,2," ",12);
OLED_ShowString(0,3," ",12);
OLED_ShowString(0,4,">",12);
OLED_ShowString(0,5," ",12);
OLED_ShowString(0,6," ",12);
OLED_ShowString(0,7," ",12);
}
if(obj==4)
{
OLED_ShowString(0,0," ",12);
OLED_ShowString(0,1," ",12);
OLED_ShowString(0,2," ",12);
OLED_ShowString(0,3," ",12);
OLED_ShowString(0,4," ",12);
OLED_ShowString(0,5,">",12);
OLED_ShowString(0,6," ",12);
OLED_ShowString(0,7," ",12);
}
if(obj==5)
{
OLED_ShowString(0,0," ",12);
OLED_ShowString(0,1," ",12);
OLED_ShowString(0,2," ",12);
OLED_ShowString(0,3," ",12);
OLED_ShowString(0,4," ",12);
OLED_ShowString(0,5," ",12);
OLED_ShowString(0,6,">",12);
OLED_ShowString(0,7," ",12);
}
if(obj==6)
{
OLED_ShowString(0,0," ",12);
OLED_ShowString(0,1," ",12);
OLED_ShowString(0,2," ",12);
OLED_ShowString(0,3," ",12);
OLED_ShowString(0,4," ",12);
OLED_ShowString(0,5," ",12);
OLED_ShowString(0,6," ",12);
OLED_ShowString(0,7,">",12);
}
if(obj==7)
{
OLED_ShowString(0,0,">",12);
OLED_ShowString(0,1," ",12);
OLED_ShowString(0,2," ",12);
OLED_ShowString(0,3," ",12);
OLED_ShowString(0,4," ",12);
OLED_ShowString(0,5," ",12);
OLED_ShowString(0,6," ",12);
OLED_ShowString(0,7," ",12);
}
if(obj==0)
{
if(key==3)
{
A_DHT11_Temp+=1;
}
if(key==2)
{
A_DHT11_Temp-=1;
}
}
if(obj==1)
{
if(key==3)
{
A_DHT11_Hum+=1;
}
if(key==2)
{
A_DHT11_Hum-=1;
}
}
if(obj==2)
{
if(key==3)
{
A_pre+=20;
}
if(key==2)
{
A_pre-=20;
}
}
if(obj==3)
{
if(key==3)
{
A_gz_value+=50;
}
if(key==2)
{
A_gz_value-=50;
}
}
if(obj==4)
{
if(key==3)
{
A_m2_value+=50;
}
if(key==2)
{
A_m2_value-=50;
}
}
if(obj==5)
{
if(key==3)
{
A_m7_value+=50;
}
if(key==2)
{
A_m7_value-=50;
}
}
if(obj==6)
{
if(key==3)
{
A_m135_value+=50;
}
if(key==2)
{
A_m135_value-=50;
}
}
if(obj==7)
{
if(key==3)
{
mode+=1;
}
if(key==2)
{
mode-=1;
}
if(mode >= 2) mode = 0;
}
if(key==4)
{
//STMFLASH_Write(FLASH_SAVE_ADDR+10,&A_DHT11_Temp,2);//開機讀取溫度閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+12,&A_DHT11_Hum,2);//開機讀取濕度閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+14,&A_pre,2);//開機讀取氣壓閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+18,&A_gz_value,2);//開機讀取光照強度閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+20,&A_m2_value,2);//開機讀取煙霧閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+22,&A_m7_value,2);//開機讀取一氧化碳閾值
//STMFLASH_Write(FLASH_SAVE_ADDR+24,&A_m135_value,2);//開機讀取空氣質(zhì)量閾值
OLED_Clear();
break;
}
}
}
}
void Get_Data(u16 count)//獲取傳感器數(shù)據(jù)
{
static float bmp280_press,bmp280;//氣壓
DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum);
bmp280GetData(&bmp280_press,&bmp280,&bmp280);
Pre = bmp280_press;
gz_value = 4096 - get_Adc_Value(0x04);
m2_value = get_Adc_Value(0x07);
m7_value = get_Adc_Value(0x05);
m135_value = 4096 - get_Adc_Value(0x06);
}
//void Mode_Change(u8 key)
//{
//if(key==2)
//{
//mode++;
//if(mode>=2) mode = 0;
//}
//if(mode==0) OLED_ShowString(0,0,"MODE:Auto",12); //HM
//if(mode==1) OLED_ShowString(0,0,"MODE:H_M_",12); //HM
//}
void BUJING_Cotrol(u8 mode,u16 time,u16 count)
{
if(mode==0)
{
while(count--)
{
BUJ1=1; BUJ2=0; BUJ3=0;BUJ4=0;
delay_ms(time);
BUJ1=0; BUJ2=1; BUJ3=0;BUJ4=0;
delay_ms(time);
BUJ1=0; BUJ2=0; BUJ3=1;BUJ4=0;
delay_ms(time);
BUJ1=0; BUJ2=0; BUJ3=0;BUJ4=1;
delay_ms(time);
}
}
if(mode==1)
{
while(count--)
{
BUJ1=0; BUJ2=0; BUJ3=0;BUJ4=1;
delay_ms(time);
BUJ1=0; BUJ2=0; BUJ3=1;BUJ4=0;
delay_ms(time);
BUJ1=0; BUJ2=1; BUJ3=0;BUJ4=0;
delay_ms(time);
BUJ1=1; BUJ2=0; BUJ3=0;BUJ4=0;
delay_ms(time);
}
}
}
八、實物圖片
九、資料內(nèi)容清單
-
單片機
+關(guān)注
關(guān)注
6037文章
44558瀏覽量
635217 -
STM32
+關(guān)注
關(guān)注
2270文章
10900瀏覽量
355981 -
智能家居
+關(guān)注
關(guān)注
1928文章
9560瀏覽量
185096
發(fā)布評論請先 登錄
相關(guān)推薦
評論