基于CW32的智能家居系统

cathy的头像
cathy 发布于:周二, 12/26/2023 - 16:56 ,关键词:

例程资料链接如下(群文件也可下载):

BD网盘链接:

https://pan.baidu.com/s/1N7MQY7ETFAbKXCm9ZKGYHA?pwd=pqyq 

提取码:pqyq

一、实验简介

本智能家居系统是一款功能丰富、易于使用的智能家居解决方案,可以通过检测温湿度、光照强度和空气质量等参数,为我们提供更加舒适、健康、安全的居住环境,让用户享受更加智能的生活体验。

该系统采用CW32F030单片机作为核心控制器,通过各种传感器实时监测室内环境参数,并根据预设的阈值进行相应控制。例如,当室内光照不足时,系统会自动打开灯光,确保室内光线充足。室内温湿度数据和空气质量通过屏幕显示,并实时上传到云平台,以实现远程监控。

二、实验器材

本实验使用到了CW32-48F大学计划开发板、ESP8266WIFI模块、DHT11温湿度模块、MQ-135空气检测传感器、光敏电阻模块、热释电传感器模块、LED交通灯模块及Keil5开发环境。

1.png

CW32-48F大学计划板 

2.png

ESP8266WIFI模块

3.png

DHT11温湿度模块

4.png

MQ-135空气传感器模块

5.png 

光敏电阻模块

6.png


热释电人体感应模块

7.png

实物图

开发板上预留了ESP8266WIFI模块接口,通过串口与ESP8266通信。

8.png

开发板上预留了DHT11模块接口

9.png

【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); //清除标志位  }

四、效果演示

10.png

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 23