0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-27 10:34 次阅读

1. 功能介绍

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

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

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

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

自动照明模式: 根据A开发板上的光感模块,采集光照强度,控制B、C开发板上的LED灯开关。

手动模式: 手机APP 上可以选择单独控制B、C开发板上的LED灯开关。

支持设置光感阀值: 在手机APP上可以设置A开发板的光感传感器阀值(也就是控制灯亮灭的阀值)。

支持设置亮度,也可以自动根据环境光控制亮度

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

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

image-20220111104700542

image-20220111103544808

image-20220111104619684

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-20220111105037476poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

​编辑

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);   
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

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));  
        }
      }
    }
   }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png


​审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ZigBee
    +关注

    关注

    158

    文章

    2245

    浏览量

    241202
  • 照明系统
    +关注

    关注

    3

    文章

    388

    浏览量

    32721
  • CC2530
    +关注

    关注

    19

    文章

    220

    浏览量

    57222
  • ESP8266
    +关注

    关注

    50

    文章

    947

    浏览量

    43921
收藏 人收藏

    评论

    相关推荐

    德州仪器推出业界首款新型ZigBee系统单芯片CC2530

    德州仪器 (TI) 推出业界首款实际采用新ZigBee Light Link 标準的ZigBee 系统单晶片 (SoC) CC2530ZigBee
    发表于 06-05 11:01 1777次阅读

    基于CC2530(ZigBee设计)的温度报警器

    这是基于CC2530设计的远程温度报警器,通过CC2530终端检测环境温度上传给手机APP实时显示。
    的头像 发表于 05-27 09:54 7909次阅读
    基于<b class='flag-5'>CC2530</b>(<b class='flag-5'>ZigBee</b>设计)的温度报警器

    zigbeecc2530

    `晒晒我的zigbeecc2530)模块`
    发表于 03-20 13:58

    TI CC2530的特性和应用简介

    (需要大于64-KB闪存)·ZigBee 系统(256-KB 闪存)·家庭/楼宇自动化·照明系统·工业控制和监控·低功耗无线传感
    发表于 04-19 15:10

    ZigBee CC2530无线MCU和CC2592范围扩展器包括BOM及原理图

    描述在物联网 (IoT) 市场中,ZigBee(R) 应用(例如家庭和工业自动化、照明、计量和传感器网络)可能需要比独立 CC2530 无线 MCU 更长的射频传输范围和更好的灵敏度。
    发表于 09-04 09:01

    基于CC2530芯片_zigbee基础实验

    zigbee基础实验,基于CC2530芯片
    发表于 12-11 10:48 48次下载

    ZigBee模块CC2530天线PCB设计图

    ZigBee模块CC2530天线PCB设计图。
    发表于 05-10 17:06 0次下载

    cc2530是什么_cc2530能做什么

    CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 应用的一个真正的片上系统(SoC)解决方案。它能够以非常低的总的材料成本建立强大的网络节点。CC25
    发表于 11-08 09:28 4.6w次阅读

    基于CC2530ZigBee协调器节点设计

    本文给出了基于TI新一代芯片CC2530ZigBee协调器节点设计方法,该方法选用TICC2591作为射频前端芯片。
    发表于 01-05 15:25 4.7w次阅读
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>ZigBee</b>协调器节点设计

    CC2530芯片的基本特性和CC2530无线模块的设计

    本文介绍了CC2530芯片的基本特性,论述了以CC2530芯片为核心的无线通信模块的硬件设计和调试软件设计,在介绍设计规范和模块结构的基础上,采用TI公司的CC2530芯片作为主控制芯片设计出具
    发表于 02-11 08:00 96次下载
    <b class='flag-5'>CC2530</b>芯片的基本特性和<b class='flag-5'>CC2530</b>无线模块的设计

    微雪电子ZIGBEE开发板 CC2530 Eval Kit简介

    至少需要两个CC2530模块才能实现ZigBee组网,本套件仅含一个。套件简介【一分钟自我介绍】 我是个基于CC2530ZigBee开发套件。 你有两种方式使用我: 应用方式:(由
    的头像 发表于 01-09 11:05 1664次阅读
    微雪电子<b class='flag-5'>ZIGBEE</b>开发板 <b class='flag-5'>CC2530</b> Eval Kit简介

    基于CC2530ZigBee通信网的应用设计.pdf

    基于CC2530ZigBee通信网的应用设计.pdf
    发表于 12-15 18:17 21次下载

    Zigbee(CC2530)传感器板

    电子发烧友网站提供《Zigbee(CC2530)传感器板.zip》资料免费下载
    发表于 07-04 14:49 8次下载
    <b class='flag-5'>Zigbee</b>(<b class='flag-5'>CC2530</b>)传感器板

    CC2530 芯片介绍

    简介 CC2530 结合了领先的RF 收发器的优良性能,业界标准的增强型8051 CPU,系统内可编程闪存,8-KB RAM 和许多其它强大的功能。CC2530 有四种不同的闪存版本
    发表于 01-03 11:00 2819次阅读

    基于CC2530ZigBee通信网络的应用设计

    电子发烧友网站提供《基于CC2530ZigBee通信网络的应用设计.pdf》资料免费下载
    发表于 10-26 09:34 1次下载
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>ZigBee</b>通信网络的应用设计