例程資料鏈接如下(群文件也可下載):
BD網盤鏈接:
https://pan.baidu.com/s/1N7MQY7ETFAbKXCm9ZKGYHA?pwd=pqyq
提取碼:pqyq
一、實驗簡介
本智能家居系統是一款功能豐富、易于使用的智能家居解決方案,可以通過檢測溫濕度、光照強度和空氣質量等參數,為我們提供更加舒適、健康、安全的居住環境,讓用戶享受更加智能的生活體驗。
該系統采用CW32F030單片機作為核心控制器,通過各種傳感器實時監測室內環境參數,并根據預設的閾值進行相應控制。例如,當室內光照不足時,系統會自動打開燈光,確保室內光線充足。室內溫濕度數據和空氣質量通過屏幕顯示,并實時上傳到云平臺,以實現遠程監控。
二、實驗器材
本實驗使用到了CW32-48F大學計劃開發板、ESP8266WIFI模塊、DHT11溫濕度模塊、MQ-135空氣檢測傳感器、光敏電阻模塊、熱釋電傳感器模塊、LED交通燈模塊及Keil5開發環境。
CW32-48F大學計劃板
ESP8266WIFI模塊
DHT11溫濕度模塊
MQ-135空氣傳感器模塊
光敏電阻模塊
熱釋電人體感應模塊
實物圖
開發板上預留了ESP8266WIFI模塊接口,通過串口與ESP8266通信。
開發板上預留了DHT11模塊接口
【MQ-135空氣傳感器模塊與單片機接線】:
VCC -- 5V
GND -- GND
DO -- ×
AO -- PA0
【光敏電阻模塊與單片機接線】:
VCC -- 3.3V
GND -- GND
DO -- ×
AO -- PA4
【熱釋電人體感應模塊與單片機接線】:
VCC -- 3.3V
GND -- GND
OUT -- PB10
【LED交通燈模塊與單片機接線】:
R -- PA6
Y -- PA5
G -- PB11
GND -- GND
三、核心代碼
main.c:
/*傳感器數據*/
uint16_t ppm=0; //空氣中甲苯濃度
uint8_t humidity=0; //濕度
uint8_t temperture=0; //溫度
uint8_t Light_intensity=0; //光照強度(0~100)
uint16_t adc_result[2]={0}; //保存ADC序列轉換結果
/*標識控制位*/
_Bool Flag_5s=0; //5s計時
uint16_t time5scnt=0; //5s計數
uint16_t time2scnt=0; //2s計數
_Bool averyflag=0; //ADC序列采集完成標志位
_Bool send_flag=0; //數據上云控制位
/*自定義函數*/
void PIR_Proc(void); //檢測人是否存在
void DHT11_Proc(void); //采集溫濕度
void MQ135_Proc(void); //檢測空氣質量
void Photo_Proce(void); //檢測亮度
void System_Init(void); //系統初始化
void Send2OneNet(void); //數據上云
void Interface(void); //數據顯示界面
void LED_Proc(uint8_t led,uint8_t state); //LED燈
/*主程序*/
int main(void)
{
System_Init(); //系統初始化
Interface(); //界面顯示
while(1)
{
PIR_Proc(); //人
DHT11_Proc(); //溫濕度
MQ135_Proc(); //空氣質量
Photo_Proce(); //光強
Send2OneNet(); //數據上云
ADC_SoftwareStartConvCmd(ENABLE); //啟動ADC轉換
Delay_ms(500);
}
}
/*子程序*/
void System_Init(void) //系統初始化函數
{
Lcd_Init();
TFT_Welcome(); //開機界面
LED_Init();
PIR_Init(); //熱釋電傳感器初始化
DHT11_Init(); //溫濕度傳感器初始化
Buzzer_Init(); //蜂鳴器初始化
while(DHT11_Check()); //檢測DHT11是否已連接
BTIM_Init();
// Usart1_Init(115200); //調試串口
Usart2_Init(115200); //ESP8266串口
ESP8266_Init(); //ESP8266初始化
ADC_Configuration(); //ADC序列多次轉換模式配置
}
void Interface(void) //界面顯示函數
{
Lcd_Clear(BLUE);
Gui_DrawFont_GBK16(0,8,WHITE,BLUE," 智能家居系統 ");
Gui_DrawLine(0,32,128,32,GRAY1); //分割線
Gui_DrawFont_GBK16(0,48,WHITE,BLUE," 當前溫度:");
Gui_DrawFont_GBK16(0,80,WHITE,BLUE," 當前濕度:");
Gui_DrawFont_GBK16(0,112,WHITE,BLUE," 空氣質量:");
}
void PIR_Proc(void) //人體檢測函數
{
if(ReadPIR()) //有人在
{
Flag_5s=1; //在中斷中開始5s計時
LED_Proc(LED_Yellow,1); //打開黃燈
}
else //沒有人
{
Flag_5s=0; //清除計時標識
time5scnt=0; //清零計數值
Buzzer(0); //關閉蜂鳴器
LED_Proc(LED_Red,0); //關閉紅燈
LED_Proc(LED_Yellow,0); //關閉紅燈
}
if(time5scnt >=500) //計數值超過500,5秒計時到
{
time5scnt=0; //清零計數值
Buzzer(1); //打開蜂鳴器
LED_Proc(LED_Red,1); //打開紅燈
}
}
void DHT11_Proc(void) //溫濕度采集函數
{
char display[8]=" ";
DHT11_Read_Data(&temperture,&humidity); //采集溫濕度
sprintf(display,"%d ℃",temperture);
TFTShowString(3,11,display);
sprintf(display,"%d %%",humidity);
TFTShowString(5,11,display);
}
void MQ135_Proc(void) //空氣質量檢測函數
{
double v_dat=0;
if(averyflag) //ADC轉換完成
{
adc_result[0]/=10; //采集10次求平均值
v_dat=(double)adc_result[0]*3.3/4960.0; //AD值傳換成電壓
ppm = pow((3.4880*10*v_dat)/(5-v_dat),(1.0/0.3203)); //計算甲苯濃度(參數因環境而異)
if(v_dat< 0.3) Gui_DrawFont_GBK16(90,112,WHITE,BLUE,"優"); //依據電壓值人為劃分空氣質量等級
else if(v_dat< 0.5) Gui_DrawFont_GBK16(90,112,WHITE,BLUE,"良");
else Gui_DrawFont_GBK16(90,112,WHITE,BLUE,"差");
}
}
void Photo_Proce(void) //光照強度采集函數
{
double v_dat=0;
if(averyflag) //ADC轉換完畢
{
adc_result[1]/=10; //求平均值
Light_intensity=(1.0-(float)adc_result[1]/4096.0)*100.0; //轉換成光照強度(僅供參考)
v_dat=(double)adc_result[1]*3.3/4960.0; //轉換成電壓值
if(v_dat>1.5) LED_Proc(LED_Green,1); //自定義閾值,光照強度過低打開綠燈
else LED_Proc(LED_Green,0);
}
}
void LED_Proc(uint8_t led,uint8_t state) //LED控制函數
{
if(led==LED_Red)
GPIO_WritePin(CW_GPIOA,GPIO_PIN_6,(GPIO_PinState)(state));
else if(led==LED_Yellow)
GPIO_WritePin(CW_GPIOA,GPIO_PIN_5,(GPIO_PinState)(state));
else if(led==LED_Green)
GPIO_WritePin(CW_GPIOB,GPIO_PIN_11,(GPIO_PinState)(state));
}
void Send2OneNet(void) //數據上傳函數
{
if(send_flag)
{
OneNet_SendData(); //數據上傳到OneNET
ESP8266_Clear(); //清除緩存
send_flag=0;
}
}
void BTIM1_IRQHandler(void) //基本定時器1中斷
{
if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV))
{
if(++time2scnt >200) {send_flag=1;time2scnt=0;} //2s計時
if(Flag_5s) time5scnt++; //5s計時
BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV); //清除標志位
}
}
四、效果演示
審核編輯 黃宇
-
單片機
+關注
關注
6061文章
44866瀏覽量
645965 -
智能家居
+關注
關注
1932文章
9731瀏覽量
189135 -
開發板
+關注
關注
25文章
5471瀏覽量
101693 -
ESP8266
+關注
關注
51文章
963瀏覽量
46749 -
CW32
+關注
關注
1文章
242瀏覽量
1062
發布評論請先 登錄
基于CW32的門禁綜合系統

基于CW32單片機的智能家居系統設計

基于ARM的智能家居遠程監控系統設計
智能家居系統、智能家居解決方案及智能家居定制開發
基于ZigBee的智能家居系統設計
CW32單片機在智能馬桶的應用介紹
cw32和stm32的區別
CW32單片機在智能馬桶的應用介紹

CW32單片機在智能馬桶的應用介紹

評論