一、 自動模式
1.溫濕度、氣壓、煙霧濃度、一氧化碳濃度、光照強度檢測;
2.當光照強度大于所設定的閾值時,會自動打開客廳燈和窗簾(步進電機);
3.當溫濕度、氣壓、煙霧濃度、一氧化碳濃度任意的數據大于所設定的閾值時,會啟動聲光報警(蜂鳴器)
二、手動模式
1.上位機(機智云)的APP 可以控制窗簾和客廳燈的開關,可以調節各個傳感器的閾值;
2.傳感器所檢測到的數據會實時傳送到上位機(機智云)的APP顯示
制作出來的實物圖如下:
51hei圖片20200108123123.jpg (311.37 KB, 下載次數: 88)
下載附件
2020-1-8 12:32 上傳
51hei圖片20200108123132.jpg (388.44 KB, 下載次數: 72)
下載附件
2020-1-8 12:32 上傳
51hei圖片20200108123141.jpg (359.53 KB, 下載次數: 85)
下載附件
2020-1-8 12:32 上傳
單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "timer.h"
- #include "ADC.h"
- #include "usart3.h"
- #include "key.h"
- #include "rtc.h"
- #include "oled.h"
- #include "stmflash.h"
- #include "math.h"
- #include "dht11.h"
- #include "bmp280.h"
- #include "exti.h"
- #include "gizwits_product.h"
- u8 buff[30];//參數顯示緩存數組
- u8 count;
- dataPoint_t currentDataPoint;//云端數據點
- u8 wifi_sta;//wifi連接狀態標志
- u8 mode=0;//模式控制自動和手動
- u8 NTP_sta=0;//網諾時間獲取狀態
- 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; //空氣質量檢測值
- u16 A_DHT11_Temp=25; //溫度閾值
- u16 A_DHT11_Hum=50; //濕度閾值
- u16 A_pre=1500; //氣壓閾值
- u16 A_gz_value=2000; //光照強度閾值
- u16 A_m2_value=1500; //煙霧閾值
- u16 A_m7_value=2000; //一氧化碳閾值
- u16 A_m135_value=4000; //空氣質量閾值
- /************************************************
- ALIENTEK精英STM32開發板實驗1
- 跑馬燈實驗
- 技術支持:www.openedv.com
- 淘寶店鋪:http://eboard.taobao.com
- 關注微信公眾平臺微信號:"正點原子",免費獲取STM32資料。
- 廣州市星翼電子科技有限公司
- 作者:正點原子 @ALIENTEK
- ************************************************/
- //協議初始化
- void Gizwits_Init(void)
- {
- TIM3_Int_Init(9,7199);//1MS系統定時
- usart3_init(9600);//WIFI初始化
- memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//設備狀態結構體初始化
- gizwitsInit();//緩沖區初始化
- }
- //數據采集
- void userHandle(void)
- {
- currentDataPoint.valueLED=!LED0;
- currentDataPoint.valueCurtain=curtain_flag;
- currentDataPoint.valueTemp=DHT11_Temp;
- currentDataPoint.valueHum=DHT11_Hum;
- currentDataPoint.valuePre=Pre;
- currentDataPoint.valueGZ_Val=gz_value;
- currentDataPoint.valueMQ2_Val=m2_value;
- currentDataPoint.valueMQ7_Val=m7_value;
- currentDataPoint.valueMQ135_Val=m135_value;
-
- }
- void Get_Data(u16 count);//獲取傳感器數據
- void WIFI_Contection(u8 key);//WiFi連接控制
- void Canshu_Change(u8 key);//系統參數調節
- void Mode_Change(u8 key);//模式切換
- void BUJING_Cotrol(u8 mode,u16 time,u16 count);
- int main(void)
- {
- u8 t=0;
- int key_value; //按鍵值
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
- uart_init(115200); //串口初始化為115200
- Adc1_Channe_Init(); //ADC通道初始化
- KEY_Init(); //按鍵引腳初始化
- //EXTIX_Init();
- bmp280Init();
- while(DHT11_Init());
- LED_Init(); //初始化與LED連接的硬件接口
- OLED_Init(); //OLED初始化
- OLED_Clear(); //OLED清屏
- Gizwits_Init();
-
- 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); //開機讀取空氣質量閾值
- 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,180);
- // BUJING_Cotrol(curtain_flag,4,180);
- 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(Pre>=A_pre||m135_value<=A_m135_value||m2_value>=A_m2_value||m7_value>=A_m7_value)
- if(Pre>=A_pre||m135_value>=A_m135_value||m2_value>=A_m2_value||m7_value>=A_m7_value)
- {
- BEEP= !BEEP;
- // BEEP= 1;
- }else BEEP = 0;
- key_value = KEY_Scan(0);
- if(key_value==3)
- {
- 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(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,":%2dpa ",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,9);
- OLED_ShowCHinese(16,6,10);
- OLED_ShowCHinese(32,6,11);
- OLED_ShowCHinese(48,6,12);
- sprintf((char*)buff,":%4dppm",m135_value);
- OLED_ShowString(64,6,buff,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數據
-
- 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數據
-
- 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,9);
- OLED_ShowCHinese(16,6,10);
- OLED_ShowCHinese(32,6,11);
- OLED_ShowCHinese(48,6,12);
- sprintf((char*)buff,":%4dppm",m135_value);
- OLED_ShowString(64,6,buff,16);//顯示M135數據
- }
- userHandle(); //用戶數據采集
- gizwitsHandle((dataPoint_t *)¤tDataPoint);//機智云協議處理
- WIFI_Contection(key_value);//WiFi連接控制
- Canshu_Change(key_value);
-
- t++;
- delay_ms(100);
- }
- }
-
- void WIFI_Contection(u8 key)//WiFi連接控制
- {
- if(key==4)
- {
- printf("WIFI進入AirLink連接模式\r\n");
- gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入
- }
- if(key==1)
- {
-
- printf("WIFI復位,請重新配置連接\r\n");
- gizwitsSetMode(WIFI_RESET_MODE);//WIFI復位
- }
-
- }
- void Canshu_Change(u8 key)
- {
- u8 obj=7;
- if(key==2)
- {
- BEEP=0;
- OLED_Clear();
- while(1)
- {
- key = KEY_Scan(0);
- if(key==2)
- {
- 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==4)
- {
- A_DHT11_Temp+=1;
- }
- if(key==1)
- {
- A_DHT11_Temp-=1;
- }
- }
- if(obj==1)
- {
- if(key==4)
- {
- A_DHT11_Hum+=1;
- }
- if(key==1)
- {
- A_DHT11_Hum-=1;
- }
- }
- if(obj==2)
- {
- if(key==4)
- {
- A_pre+=20;
- }
- if(key==1)
- {
- A_pre-=20;
- }
- }
- if(obj==3)
- {
- if(key==4)
- {
- A_gz_value+=50;
- }
- if(key==1)
- {
- A_gz_value-=50;
- }
- }
- if(obj==4)
- {
- if(key==4)
- {
- A_m2_value+=50;
- }
- if(key==1)
- {
- A_m2_value-=50;
- }
- }
- if(obj==5)
- {
- if(key==4)
- {
- A_m7_value+=50;
- }
- if(key==1)
- {
- A_m7_value-=50;
- }
- }
- if(obj==6)
- {
- if(key==4)
- {
- A_m135_value+=50;
- }
- if(key==1)
- {
- A_m135_value-=50;
- }
- }
- if(obj==7)
- {
- if(key==4)
- {
- mode+=1;
- }
- if(key==1)
- {
- mode-=1;
- }
- }
- if(key==3)
- {
- 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); //開機讀取空氣質量閾值
- OLED_Clear();
- break;
- }
-
- }
- }
- }
- void Get_Data(u16 count)//獲取傳感器數據
- {
- static float bmp280_press,bmp280; //氣壓
-
- DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
2.程序源碼.7z
(292.51 KB, 下載次數: 520)
2020-1-8 18:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
智能家居.pdf
(260.93 KB, 下載次數: 485)
2020-1-8 12:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|