基于CW32的智能家居系统

例程资料链接如下(群文件也可下载):
BD网盘链接:
https://pan.baidu.com/s/1N7MQY7ETFAbKXCm9ZKGYHA?pwd=pqyq
提取码:pqyq
相关视频:基于CW32的智能家居系统

一、实验简介


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

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

二、实验器材


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

在这里插入图片描述
在这里插入图片描述

实物图

开发板上预留了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); //清除标志位
	}
}

四、效果演示

在这里插入图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值