资讯详情

基于单片机智能家居系统-中控面板设计

单片机是目前应用最广泛的电子设备,无论在我们日常生活的哪个方面,都有单片机。无论是社区的电梯,还是超市的感应门,单片机都给人们带来了极大的便利。基于单片机的智能家居设计主要是基于STC89C52RC核心控制系统分为从主机两个系统,其中从机收集各种信息,主机接收从机信息并显示

中,DHT11作为温湿度传感器,可以收集房间内的温度,也可以通过按钮设置温度上下限的阈值来保存存储的温度值iic总线的AT24C02放下电模块,HC-SR04超声波模块负责检测安全距离,并增加蜂鸣器和小灯作为声光报警系统,用直流电机和继电器控制大功率灯来降低或提高室内温度,MQ2.用于检测房屋内有害气体和烟雾浓度。如遇火灾,水泵可及时处理。通过NRF2401L无线模块将数据传输给主机进行通信。

在中间,使用无线模块远程传输从机的所有信息,并将主机放在显眼的位置,如客厅、主卧室等。制作中控面板不仅可以随时监控房间内的情况,还可以使用手机WLAN操作房间的控制硬件。在此基础上,还增加了密码功能,进一步提高了安全性。

从机接收:

主机发送:

解锁主机密码

待解锁主机界面:

解锁后,语音提示进入接收界面

从机采集类型

主界面及副界面:

采集模式显示温湿度、光照、空气浓度等信息

采集模式显示当前的安全状态和安全距离

设置模式,设置当前温度的上下阈值

设置当前光浓度和空气质量的阈值

设置模式,设置当前安全距离的范围

具体细节片中丢失具体细节。以后直接放视频。

系统使用的模块:

C58和C54\C52没有太大区别,唯一的区别就是内存的大小,C52\C54\C58内存分别为4k、8k、16k、因为编译后hex文件达到了11000 code,差不多是11k大小的样子,一定要换大容量单片机。有人可能会问我为什么不换。STC15或者是STM32等单片机,因为当时板子没想到后续程序会用这么多,32和15板子的价格稍微贵一点,所以选择省钱C51类型的单片机,还有一个原因是32的单片机配置和创建工程较为繁琐,一般的项目C51可以完成,但后来我后悔了。C51系列浪费了我更多的钱和调试时间。

距离阈值可以设置,如果距离减小到安全距离,可以设置距离阈值NO主机会有语音提示

void Conut(void)  {   time=TH0*256 TL0;   TH0=0;   TL0=0;     S=(time*1.7)/100;     //计算是的CM   if((S>=400)||flag==1) 超出测量范围显示-   {      flag=0;       OLED_ShowString(0,6,"Warning Error",16);       }   else   {      OLED_ShowChinese(0,6,0,16)     OLED_ShowChinese(16,6,1,16)    OLED_ShowChinese2(32,6,2,16);//    OLED_ShowChinese(48,6,3,16)    OLED_ShowString(64,6,":",16);        disbuff1[0]=S/10/10 '0';    disbuff1[1]=S/10 '0';    disbuff1[2]=S '0';          OLED_ShowChar(72,6, disbuff1[0],16);   OLED_ShowChar(80,6, disbuff1[1],16);   OLED_ShowChar(88,6, disbuff1[2],16);    OLED_ShowChar(96,6, ' ',16);   }  }  void zd0() interrupt 1    //T0中断用于计数器溢出,超过测距范围   {     flag=1;        //中断溢出标志   }   void  StartModule()            ///启动模块   {    Trig=1;                        ///启动一次模块    _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();     _nop_();    _nop_();     _nop_();     _nop_();     _nop_();    Trig=0;   }    void T0_Init() {   TMOD=0x01;     //设T0为方式1,GATE=1;   TH0=0;   TL0=0;             ET0=1;             //允许T0中断   EA=1;  }  void get_ult() {       StartModule();       while(!Echo);  //当RX为零时等待       TR0=1;       //打开计数       while(Echo);   //当RX计数并等待1       TR0=0;    //关闭计数          Conut();   //计算    delayms(80);  if(mode==1)  {   if(S<set_juli)    {    OLED_ShowString(72,4,"NO",16);   alluf[12]='0';
		
		delayms(10);
    nRF24L01_TxPacket(allbuf);    	
	SPI_RW_Reg(WRITE_REG+STATUS,0XFF); 
		
		led1=0;
		delayms(200);
	  sound();		   	
	}	 
	else
	{
	OLED_ShowString(72,4,"OK",16);
		allbuf[12]='1';
		
		
		delayms(10);
    nRF24L01_TxPacket(allbuf);    	
	SPI_RW_Reg(WRITE_REG+STATUS,0XFF); 
		
		led1=1;
		beep=1;
	}
	
	}
	
}

模块使用串口和单片机连接,通过TCP(APP的名字)设置好IP地址和端口号进行连接,在发送端发送代码即可正常控制。

void ESP8266_SendCmd(u8 *pbuf)
{
	while(*pbuf!='\0') //遇到空格跳出循环	
	{
		UART_SendData(*pbuf);
		delay_10us(5);
		pbuf++;	
	}
	delay_10us(5);
	UART_SendData('\r');//回车
	delay_10us(5);
	UART_SendData('\n');//换行
	delay_ms(10);
}

//ESP8266 WIFI发送数据到APP
//pbuf:数据
void ESP8266_SendData(u8 *pbuf)
{
	ESP8266_SendCmd("AT+CIPSEND=0,7");
	delay_ms(10);
	while(*pbuf!='\0') //遇到空格跳出循环	
	{
		UART_SendData(*pbuf);
		delay_10us(5);
		pbuf++;	
	}
	UART_SendData('\n');//换行	
//	delay_ms(10);
}

//ESP8266-WIFI模块工作模式初始化
void ESP8266_ModeInit(void)
{
	ESP8266_SendCmd("AT+CWMODE=2");//设置路由器模式 1 staTIon模式 2 AP点 路由器模式 3 station+AP混合模式
	ESP8266_SendCmd("AT+CWSAP=\"ESP8266\",\"123456\",11,0"); //设置WIFI热点名及密码
	ESP8266_SendCmd("AT+CIPAP=\"192.168.4.1\"");
	ESP8266_SendCmd("AT+RST");//重新启动wifi模块
	delay_ms(1000);
	ESP8266_SendCmd("AT+CIPMUX=1");	//开启多连接模式,允许多个各客户端接入
	ESP8266_SendCmd("AT+CIPSERVER=1,8080");	//启动TCP/IP 端口为8080 实现基于网络控制	
} 

//WIFI控制初始化
void wifi_control_init(void)
{
	UART_Init();
	 DHT11_start();//初始化DS18B20
	ESP8266_ModeInit();
	ES=1;//允许串口中断
}

//WIFI控制
void wifi_control(void)
{
	u8 i=0;
	
	u8  xdata temp_value1;
	

	  delayms(10);
		i++;
		if(i==10)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间
			temp_value1=get_temp();//保留温度值小数后一位
		
		if(i==20)//间隔一段时间将读取的温度发送到APP
		{
			wifi_send_buf[1]=temp_value1/10+'0';
			wifi_send_buf[2]=temp_value1%10+'0';
			

			ESP8266_SendData(wifi_send_buf);//通过串口发送温度数据到APP
			i=0;
		}			
	}	


//串口中断服务函数
//接收手机APP发送的信号后控制板载资源
void UART_IRQn() interrupt 4
{
	static u8 i=0;

	if(RI)
	{
		RI=0;
		UART_RX_BUF[i]=SBUF;//读取接收到的数据
		if(UART_RX_BUF[0]=='+')i++;
		else i=0;
		if(i==10)
	{
//		ESP8266_SendData(wifi_send_buf);
			
			//WIFI控制
			if(UART_RX_BUF[9]==WLAN_MODE) //先开启wlan模式
	  {
			 wlan_mode=~wlan_mode;
			 led0 =0;
			led1=0;
       delayms(500);
			 led0 =1;
			led1=1;
		}
			
			if(UART_RX_BUF[9]==LED1_ON_CMD) //1 开启2灯
			{
				
			led0 =0;
			led1=0;
			}
			
			else if(UART_RX_BUF[9]==LED1_OFF_CMD) //2 关闭所有
			{
			led0 =1;
			led1=1;
      beep=1;
      MA=0;				
			}
			else if(UART_RX_BUF[9]== LED1_RELAY) //3 开启继电器
			{
			led0 =1;
			led1=1;
     
      MA=0;				
			}
			else if(UART_RX_BUF[9]==LED1_COLD) //C 制冷吹风
			{
				MA=1;
				led0 =1;
			led1=1;
		
			}
			
			else if(UART_RX_BUF[9]==LED1_HOT) //H 继电器加热 chuifeng
			{ 
				MA=1;		
				led0 =1;
			led1=1;    			
			}	
   
			else if(UART_RX_BUF[9]==LED1_alarm) //H 继电器加热 chuifeng
			{ 
				
       beep=0;
		  led0 =1;
			led1=1;
				
			}				
			i=0;
  }	
 }	
}

void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(30);   
   Data=1;
   DHT11_delay_us(30);
}

uchar DHT11_rec_byte()      
{
   uchar i,dat=0;
  for(i=0;i<8;i++)    
   {          
      while(!Data);   
      DHT11_delay_us(8);    
      dat<<=1;           
      if(Data==1)    
         dat+=1;
      while(Data);     
    }  
    return dat;
}
void DHT11_receive()     
{
    uchar rec_dat[9]; 	
    
	
    DHT11_start();
    if(Data==0)
    {
        while(Data==0);       
        DHT11_delay_us(40);  
        R_H=DHT11_rec_byte();      
        R_L=DHT11_rec_byte();     
        T_H=DHT11_rec_byte();     
        T_L=DHT11_rec_byte();    
        revise=DHT11_rec_byte(); 
        DHT11_delay_us(25);    
        if((R_H+R_L+T_H+T_L)==revise)      
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        }  
        rec_dat[0]='0'+RH/10;
        rec_dat[1]='0'+RH%10;
				rec_dat[2]=' ';
				rec_dat[3]=' ';
				
				//温度
        rec_dat[4]='0'+TH/10;
        rec_dat[5]='0'+TH%10; 
		    rec_dat[6]=' ';
    }
}

void dht11_show()
{
	u8 tpbuf[2];
	u8 damp_buf[2];
	
	
	DHT11_receive();
/*********************************************************************************************************/	
	temp_val=get_temp();//温度
	tpbuf[0]=temp_val/10+'0'; 
	tpbuf[1]=temp_val%10+'0';
	
	OLED_ShowChar(56,0,tpbuf[0],16);//温度1
	OLED_ShowChar(64,0,tpbuf[1],16);//温度2
	OLED_ShowString(80,0,"C",16);
/*********************************************************************************************************/	
	damp_val=get_damp();//温度
	damp_buf[0]=damp_val/10+'0';
	damp_buf[1]=damp_val%10+'0';
	
    OLED_ShowChar(56,2,damp_buf[0],16);//湿度1
	OLED_ShowChar(64,2,damp_buf[1],16);//湿度2	
    OLED_ShowString(80,2,"%",16);	
/*********************************************************************************************************/		
	OLED_ShowChinese1(0,0,0,16);//温
	OLED_ShowChinese1(16,0,1,16);//度
	OLED_ShowChinese1(32,0,5,16);//值
	OLED_ShowString(48,0,":",16);
	
	OLED_ShowChinese1(0,2,2,16);//湿
	OLED_ShowChinese1(16,2,1,16);//度
	OLED_ShowChinese1(32,2,5,16);//值
	OLED_ShowString(48,2,":",16);
	
	allbuf[0]=damp_buf[0];
	allbuf[1]=damp_buf[1];
	allbuf[2]=tpbuf[0];
	allbuf[3]=tpbuf[1];
	
	delayms(10);
    nRF24L01_TxPacket(allbuf);    	
	SPI_RW_Reg(WRITE_REG+STATUS,0XFF); 
	

}

unsigned char get_temp() //单独获取温度
{
	
	unsigned char temp=0;
  DHT11_receive();
  temp=TH;
  if(temp)
		return temp;
	else
		return -temp;

}

unsigned char get_damp()  //单独获取湿度
{

	unsigned char damp=0;
  DHT11_receive();
  damp=RH;
  if(damp)
		return damp;
	else
		return -damp;

}

后续从主机代码过多就不一一放下了,可以看视频演示

 

主机密码锁

智能家居中控

 

视频中语音模块通知不完整已经解决,原因为延时太短导致语音还未完全合成就执行下一次语句。

 

 

 

标签: 2401电阻值sr201a安全继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台