基于CC2530(ZigBee)设计的自动照明系统

简介: 基于ZigBee的自动照明系统设计,上面连接了光感传感器,ESP8266WIFI模块。通过ESP8266与手机APP之间通信,ESP8266创建热点,配置为TCP服务器模式; 手机APP连接上ESP8266的热点之后,再连接ESP8266创建的服务器,完成通信。 手机APP上通过按钮可以控制B,C开发板上LED灯的开关。

1. 功能介绍

设计题目的名称: 基于ZigBee的自动照明系统设计

一共使用3个CC2530 ZigBee开发板,代号分别为ABC。

A开发板当做主机: 上面连接了光感传感器,ESP8266WIFI模块。通过ESP8266与手机APP之间通信,ESP8266创建热点,配置为TCP服务器模式; 手机APP连接上ESP8266的热点之后,再连接ESP8266创建的服务器,完成通信。 手机APP上通过按钮可以控制B,C开发板上LED灯的开关。

手机APP上可以设置自动照明的模式:

  1. 自动照明模式: 根据A开发板上的光感模块,采集光照强度,控制B、C开发板上的LED灯开关。
  2. 手动模式: 手机APP 上可以选择单独控制B、C开发板上的LED灯开关。
  3. 支持设置光感阀值: 在手机APP上可以设置A开发板的光感传感器阀值(也就是控制灯亮灭的阀值)。
  4. 支持设置亮度,也可以自动根据环境光控制亮度

B开发板当做从机节点: B开发板上使用板载的LED灯,模拟家里卧室的照明设备,实现控制效果演示。

C开发板当做从机节点: C开发板上使用板载的LED灯,模拟家里客厅的照明设备,实现控制效果演示。

image-20220111104700542

image-20220111103544808

image-20220111104619684

完整项目代码下载地址: https://download.csdn.net/download/xiaolong1126626497/75317115

2. 硬件介绍

### 2.1 ESP8266 wifi

采用的ESP8266系列无线模块是高性价比WIFI SOC模组,该系列模块支持标准的IEEE802.11b/g/n协议,内置完整的TCP/IP协议栈。用户可以使用该系列模块为现有的设备添加联网功能,也可以构建独立的网络控制器。

CC2530开发板上本身就有一个ESP8266专用的接口,插上去就行了。

ES8266 WIFI 模块接在 串口1 上面(P0.4/P0.5口) ,波特率为 115200 。

CC2530的串口0作为常规调试串口(P0_2和P0_3端口),可以把采集的AD数据打印到串口。
也可以自己打印其他一些调试信息。

image-20220111104742622

image-20220111104753325

image-20220111104851404

2.2 光敏传感器

image-20220111105037476

image-20220111105048153

3. 项目代码

3.1 串口代码

#include "uart.h"
/*
函数功能:串口0初始化
*/
void Init_Uart0(void)
{
  PERCFG&=~(1<<0);  //串口0的引脚映射到位置1,即P0_2和P0_3
  P0SEL|=0x3<<2;   //将P0_2和P0_3端口设置成外设功能
  U0BAUD = 216;     //32MHz的系统时钟产生115200BPS的波特率
  U0GCR&=~(0x1F<<0);//清空波特率指数
  U0GCR|=11<<0;      //32MHz的系统时钟产生115200BPS的波特率
  U0UCR |= 0x80;    //禁止流控,8位数据,清除缓冲器
  U0CSR |= 0x3<<6;  //选择UART模式,使能接收器
}


/*
函数功能:UART0发送字符串函数
*/
void UR0SendString(char *str)
{
 while(*str!='\0')
  {
    U0DBUF = *str;    //将要发送的1字节数据写入U0DBUF
    while(UTX0IF == 0);//等待数据发送完成
    UTX0IF = 0;       //清除发送完成标志,准备下一次发送
    str++;
  }
}

/*
函数功能: 模仿printf风格的格式化打印功能
*/
char USART0_PRINT_BUFF[200]; //格式化数据缓存数据
void USART0_Printf(const char *format,...)
{
  char *str=NULL;
  /*1. 格式化转换*/
  va_list ap; // va_list---->char *
  va_start(ap,format); //初始化参数列表
  vsprintf(USART0_PRINT_BUFF,
        format,
        ap); //格式化打印
  va_end(ap); //结束参数获取
  /*2. 串口打印*/
  str=USART0_PRINT_BUFF;//指针赋值
  while(*str!='\0')
  {
    U0DBUF=*str; //发送一个字节的数据
    str++; //指针自增,指向下一个数据
    while(UTX0IF == 0);//等待数据发送完成
    UTX0IF = 0;       //清除发送完成标志,准备下一次发送
  }
}

3.2 按键代码

#include "key.h"

/*
函数功能:按键IO口初始化
硬件连接:KEY1-->P0_1  KEY2-->P2_0  
*/
void KEY_Init(void)
{
    P0SEL&=~(0x1<<1); //配置P0_1处于通用GPIO口模式
    P0DIR&=~(0x1<<1); //配置P0_1为输入模式
    P0INP|= 0x1<<1;   //上拉  
    
    P2SEL&=~(0x1<<0); //配置P2_0处于通用GPIO口模式
    P2DIR&=~(0x1<<0); //配置P2_0为输入模式
    P2INP|= 0x1<<0;   //上拉   
}

/*
函数功能:按键扫描
返 回 值:按下的按键值
*/
unsigned char Key_Scan(void)
{
    static unsigned char stat=1;
    if((KEY1==0||KEY2==0)&&stat)
    {
       stat=0;
       delay10ms();
       if(KEY1==0)return 1;
       if(KEY2==0)return 2;
    }
    else
    {
        if(KEY1&&KEY2)stat=1;
    }
    return 0;
}

3.3 延时函数

#include "delay.h"

/*延时200毫秒*/
void delay200ms(void)   //误差 -0.125us
{
    unsigned char a,b,c;
    for(c=95;c>0;c--)
        for(b=181;b>0;b--)
            for(a=14;a>0;a--);
}


void delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=193;c>0;c--)
        for(b=118;b>0;b--)
            for(a=2;a>0;a--);
}

/****************************************** 
 * 函数描述:32M系统时钟下的毫秒延时函数 
 ******************************************/  
void DelayMs(unsigned int ms)  
{  
  unsigned int i,j;  
  for(i = 0; i < ms; i++)  
  {  
    for(j = 0;j < 1774; j++);  
  }  
}  

void Onboard_wait( int timeout )
{
  while (timeout--)
  {
    asm("NOP");
    asm("NOP");
    asm("NOP");
  }
}

//延时函数
void DelayUs(int us) //1 us延时
{
    Onboard_wait(us);   
}

3.4 A开发板(协调器)主函数代码

/*主函数*/
void main(void)
{
    u8 time_cnt=0;
    unsigned char key;
    u8 switch_val=150;  //开关阀值
    
    u8 mode=1; //0 表示手动模式  1表示自动模式
    
    //延时等待系统稳定
    DelayMs(1000);
    DelayMs(1000);
    
    init_clk();   //配置时钟
    LED_Init();   //初始化LED灯控制IO口
    KEY_Init();   //按键初始化
    Init_Uart0(); //初始化串口0
    RF_Init();    //RF初始化
    Init_Uart1(); //初始化串口1--连接WIFI
    SetWifi();  //复位WIFI
    SetESP8266_AP_TCP_Server(); //初始化WIFI
    adc_Init();
    
    clearBuffU1(); //清空BUFF
    
    //运行正常提示
    USART0_Printf("当前运行的是A开发板程序,一切正常.\r\n");
          
    while(1)          
    {  
       //按键检测
       key=Key_Scan();
       if(key)
       {
          LED2 = !LED2;
       }  
       
/*  服务器发出的数据
value:100   //阀值
led1_on   //卧室LED开
led1_off  //卧室LED关
led2_on   //客厅LED开
led2_off  //客厅LED关
yes_auto_mode  //自动模式
no_auto_mode   //手动模式
*/ 
       //判断是否收到了WIFI的数据
       if(lenU1>=13)
       {
           RecdataU1[lenU1]='\0';
           
           //串口打印数据
           USART0_Printf("WIFI收到的数据:%s\n",(u8*)RecdataU1); 
           
           //卧室LED开
           if(strstr((char*)RecdataU1,"led1_on"))
           {
                USART0_Printf("卧室LED开.\n"); 
                u8 buff[100]="B:1---";
                //发送数据
                tx_data(buff,strlen((char*)buff));
                //运行状态灯
                LED1 = !LED1; 
           }
           //卧室LED关
           else  if(strstr((char*)RecdataU1,"led1_off"))
           {
                USART0_Printf("卧室LED关.\n"); 
                 u8 buff[100]="B:0---"; 
                //发送数据
                tx_data(buff,strlen((char*)buff));
                //运行状态灯
                LED1 = !LED1; 
           }
            //客厅LED开
           else  if(strstr((char*)RecdataU1,"led2_on"))
           {
                 USART0_Printf("客厅LED开.\n"); 
                 u8 buff[100]="C:1---"; 
                //发送数据
                tx_data(buff,strlen((char*)buff));
                //运行状态灯
                LED1 = !LED1; 
           }
            //自动模式
           else  if(strstr((char*)RecdataU1,"yes_auto_mode"))
           {
                 USART0_Printf("设置为自动模式.\n"); 
                 mode=1;
           }
            //手动模式
           else  if(strstr((char*)RecdataU1,"no_auto_mode"))
           {
                  USART0_Printf("设置为手动模式.\n"); 
                 mode=0;
           }
           //阀值
           else  if(strstr((char*)RecdataU1,"value:"))
           {
                //运行状态灯
                LED1 = !LED1; 
                
                char *p=strstr((char*)RecdataU1,"value:");
                if(p)
                {
                    int a=atoi(p+6);
                    if(a>0)
                    {
                      switch_val=a;  //得到新的阀值
                    }
                }
                
                USART0_Printf("设置新的阀值:%d.\n",switch_val); 
           }
           
           clearBuffU1(); //清理缓存
       }
       
     
        time_cnt++;
        DelayMs(10);
           
       //1秒钟时间到达
       if(time_cnt>100)
       {
           time_cnt=0;
           
          //读取ADC值--也就是光照传感器的值
          GasData = ReadGasData();
          
          //发送光照传感器的值到上位机
          USART0_Printf("光照度:%d,模式:%d\n",GasData,mode);
          
          //如果是自动模式
          if(mode)
          {
               //根据阀值判断是否开启关闭卧室,客厅的LED灯
               if(GasData  >  switch_val )
               {
                    //开灯    
                    u8 buff1[10]="B:1---"; 
                    //发送数据
                    tx_data(buff1,strlen((char*)buff1));
                      //开灯    
                    u8 buff2[10]="C:1---"; 
                    //发送数据
                    tx_data(buff2,strlen((char*)buff2));
               }
               else
               {
                      //关灯    
                    u8 buff1[10]="B:0---"; 
                    //发送数据
                    tx_data(buff1,strlen((char*)buff1));
                      //关灯    
                    u8 buff2[10]="C:0---"; 
                    //发送数据
                    tx_data(buff2,strlen((char*)buff2));    
               }
          }
       }
    }
}
目录
相关文章
|
5月前
|
Shell Linux 网络安全
linux系统防CC攻击自动拉黑IP增强版(Shell脚本)
linux系统防CC攻击自动拉黑IP增强版(Shell脚本)
176 0
|
传感器 物联网
( zigbee)CC2530+BH1750光敏传感器获取光照强度
( zigbee)CC2530+BH1750光敏传感器获取光照强度
783 0
( zigbee)CC2530+BH1750光敏传感器获取光照强度
|
监控 网络协议 BI
CC呼叫中心电话系统是做什么的
CC呼叫中心电话系统是做什么的
|
传感器 网络协议 物联网
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
531 0
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
|
传感器 物联网 Linux
基于CC2530(ZigBee设计)的温度报警器
这是基于CC2530设计的远程温度报警器,通过CC2530终端检测环境温度上传给手机APP实时显示。 一共有两块CC2530开发板,这里就分别称为A板(当做协调器)、B板(当做温度节点),A板上接了ESP8266 WIF模块,用于与手机APP之间通信。B板上接了DS18B20 温度传感器模块,用于给A板传递检测的温度,A板收到DS18B20的温度之后,发送给手机APP显示。APP上位机采用Qt框架设计,支持跨平台,Android、windows、IOS、Linux都可以编译运行安装。
823 0
|
物联网
ZigBee(CC2530)最小系统PCB设计(AD18开发软件)
ZigBee(CC2530)最小系统PCB设计(AD18开发软件
ZigBee(CC2530)最小系统PCB设计(AD18开发软件)
|
安全 Android开发
【Android 逆向】ART 脱壳 ( 修改 /art/runtime/dex_file.cc#OpenCommon 系统源码进行脱壳 )
【Android 逆向】ART 脱壳 ( 修改 /art/runtime/dex_file.cc#OpenCommon 系统源码进行脱壳 )
273 0
|
安全 搜索推荐 PHP
Discuz!开源系统如何防御CC攻击?
Discuz!是一套免费的开源建站系统,在国内挺受欢迎的,主要用来搭建社区论坛类的网站。社区论坛类的网站由于流量比较大,很容易遭到DDOS攻击,特别是针对网页的CC攻击。一旦网站遇到类似攻击,不但导致用户流失,还会被搜索引擎降权。那当遇到CC攻击时该怎么办呢?
2622 0
|
物联网 芯片
ZigBee TI ZStack CC2530 3.9 IO口00-总
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 一、前言 本博客ZigBee分支关于CC2530的IO口部分的介绍,分为如下三篇文章: 1、ZigBee TI ZStack CC2530 3.9 IO口00-总(
1706 0
|
移动开发 物联网
ZigBee TI ZStack CC2530 3.20 串口03-printf()函数移植
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 上一节中,我们实现了基于Z-Stack协议栈的串口初始化和串口输出功能。 关于Z-Stack协议栈中的串口输出功能,我们为了打印“hello world !\r\n”,需要用如下代码来实现: ...
1874 0
下一篇
无影云桌面