0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于CC2530(ZigBee)設(shè)計(jì)的自動(dòng)照明系統(tǒng)

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-05-27 10:34 ? 次閱讀

1. 功能介紹

設(shè)計(jì)題目的名稱: 基于ZigBee的自動(dòng)照明系統(tǒng)設(shè)計(jì)

一共使用3個(gè)CC2530 ZigBee開發(fā)板,代號(hào)分別為ABC。

A開發(fā)板當(dāng)做主機(jī): 上面連接了光感傳感器,ESP8266WIFI模塊。通過(guò)ESP8266與手機(jī)APP之間通信,ESP8266創(chuàng)建熱點(diǎn),配置為TCP服務(wù)器模式; 手機(jī)APP連接上ESP8266的熱點(diǎn)之后,再連接ESP8266創(chuàng)建的服務(wù)器,完成通信。 手機(jī)APP上通過(guò)按鈕可以控制B,C開發(fā)板上LED燈的開關(guān)。

手機(jī)APP上可以設(shè)置自動(dòng)照明的模式:

自動(dòng)照明模式: 根據(jù)A開發(fā)板上的光感模塊,采集光照強(qiáng)度,控制B、C開發(fā)板上的LED燈開關(guān)。

手動(dòng)模式: 手機(jī)APP 上可以選擇單獨(dú)控制B、C開發(fā)板上的LED燈開關(guān)。

支持設(shè)置光感閥值: 在手機(jī)APP上可以設(shè)置A開發(fā)板的光感傳感器閥值(也就是控制燈亮滅的閥值)。

支持設(shè)置亮度,也可以自動(dòng)根據(jù)環(huán)境光控制亮度

B開發(fā)板當(dāng)做從機(jī)節(jié)點(diǎn): B開發(fā)板上使用板載的LED燈,模擬家里臥室的照明設(shè)備,實(shí)現(xiàn)控制效果演示。

C開發(fā)板當(dāng)做從機(jī)節(jié)點(diǎn): C開發(fā)板上使用板載的LED燈,模擬家里客廳的照明設(shè)備,實(shí)現(xiàn)控制效果演示。

image-20220111104700542

image-20220111103544808

image-20220111104619684

2. 硬件介紹

2.1 ESP8266 wifi

采用的ESP8266系列無(wú)線模塊是高性價(jià)比WIFI SOC模組,該系列模塊支持標(biāo)準(zhǔn)的IEEE802.11b/g/n協(xié)議,內(nèi)置完整的TCP/IP協(xié)議棧。用戶可以使用該系列模塊為現(xiàn)有的設(shè)備添加聯(lián)網(wǎng)功能,也可以構(gòu)建獨(dú)立的網(wǎng)絡(luò)控制器。

CC2530開發(fā)板上本身就有一個(gè)ESP8266專用的接口,插上去就行了。

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

CC2530的串口0作為常規(guī)調(diào)試串口(P0_2和P0_3端口),可以把采集的AD數(shù)據(jù)打印到串口。 也可以自己打印其他一些調(diào)試信息。

image-20220111104742622

image-20220111104753325

image-20220111104851404

2.2 光敏傳感器

image-20220111105037476poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?編輯

image-20220111105048153

3. 項(xiàng)目代碼

3.1 串口代碼

#include "uart.h"
/*
函數(shù)功能:串口0初始化
*/
void Init_Uart0(void)
{
 PERCFG&=~(1<<0); ?//串口0的引腳映射到位置1,即P0_2和P0_3
 ?P0SEL|=0x3<<2; ? //將P0_2和P0_3端口設(shè)置成外設(shè)功能
 ?U0BAUD = 216; ? ? //32MHz的系統(tǒng)時(shí)鐘產(chǎn)生115200BPS的波特率
 ?U0GCR&=~(0x1F<<0);//清空波特率指數(shù)
 ?U0GCR|=11<<0; ? ? ?//32MHz的系統(tǒng)時(shí)鐘產(chǎn)生115200BPS的波特率
 ?U0UCR |= 0x80; ? ?//禁止流控,8位數(shù)據(jù),清除緩沖器
 ?U0CSR |= 0x3<<6; ?//選擇UART模式,使能接收器
}
?
?
/*
函數(shù)功能:UART0發(fā)送字符串函數(shù)
*/
void UR0SendString(char *str)
{
 while(*str!='\0')
  {
 ? ?U0DBUF = *str; ? ?//將要發(fā)送的1字節(jié)數(shù)據(jù)寫入U(xiǎn)0DBUF
 ? ?while(UTX0IF == 0);//等待數(shù)據(jù)發(fā)送完成
 ? ?UTX0IF = 0; ? ? ? //清除發(fā)送完成標(biāo)志,準(zhǔn)備下一次發(fā)送
 ? ?str++;
  }
}
?
/*
函數(shù)功能: 模仿printf風(fēng)格的格式化打印功能
*/
char USART0_PRINT_BUFF[200]; //格式化數(shù)據(jù)緩存數(shù)據(jù)
void USART0_Printf(const char *format,...)
{
 ?char *str=NULL;
 ?/*1. 格式化轉(zhuǎn)換*/
 ?va_list ap; // va_list---->char *
 va_start(ap,format); //初始化參數(shù)列表
 vsprintf(USART0_PRINT_BUFF,
    format,
    ap); //格式化打印
 va_end(ap); //結(jié)束參數(shù)獲取
 /*2. 串口打印*/
 str=USART0_PRINT_BUFF;//指針賦值
 while(*str!='\0')
  {
  U0DBUF=*str; //發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
  str++; //指針自增,指向下一個(gè)數(shù)據(jù)
  while(UTX0IF == 0);//等待數(shù)據(jù)發(fā)送完成
  UTX0IF = 0;    //清除發(fā)送完成標(biāo)志,準(zhǔn)備下一次發(fā)送
  }
}

3.2 按鍵代碼

#include "key.h"
?
/*
函數(shù)功能:按鍵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; ? //上拉 ? 
}
?
/*
函數(shù)功能:按鍵掃描
返 回 值:按下的按鍵值
*/
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 延時(shí)函數(shù)

#include "delay.h"
?
/*延時(shí)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--);
}
?
/****************************************** 
 * 函數(shù)描述:32M系統(tǒng)時(shí)鐘下的毫秒延時(shí)函數(shù) 
 ******************************************/ 
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");
  }
}
?
//延時(shí)函數(shù)
void DelayUs(int us) //1 us延時(shí)
{
 ? ?Onboard_wait(us); ? 
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.4 A開發(fā)板(協(xié)調(diào)器)主函數(shù)代碼

/*主函數(shù)*/
void main(void)
{
  u8 time_cnt=0;
  unsigned char key;
  u8 switch_val=150; //開關(guān)閥值
  
  u8 mode=1; //0 表示手動(dòng)模式  1表示自動(dòng)模式
  
  //延時(shí)等待系統(tǒng)穩(wěn)定
  DelayMs(1000);
  DelayMs(1000);
  
  init_clk();  //配置時(shí)鐘
  LED_Init();  //初始化LED燈控制IO口
  KEY_Init();  //按鍵初始化
  Init_Uart0(); //初始化串口0
  RF_Init();  //RF初始化
  Init_Uart1(); //初始化串口1--連接WIFI
  SetWifi(); //復(fù)位WIFI
  SetESP8266_AP_TCP_Server(); //初始化WIFI
  adc_Init();
  
  clearBuffU1(); //清空BUFF
  
  //運(yùn)行正常提示
  USART0_Printf("當(dāng)前運(yùn)行的是A開發(fā)板程序,一切正常.\r\n");
     
  while(1)     
   { 
    //按鍵檢測(cè)
    key=Key_Scan();
    if(key)
    {
     LED2 = !LED2;
    } 
    
/*  服務(wù)器發(fā)出的數(shù)據(jù)
value:100  //閥值
led1_on  //臥室LED開
led1_off  //臥室LED關(guān)
led2_on  //客廳LED開
led2_off  //客廳LED關(guān)
yes_auto_mode  //自動(dòng)模式
no_auto_mode  //手動(dòng)模式
*/ 
    //判斷是否收到了WIFI的數(shù)據(jù)
    if(lenU1>=13)
    {
      RecdataU1[lenU1]='\0';
      
      //串口打印數(shù)據(jù)
      USART0_Printf("WIFI收到的數(shù)據(jù):%s\n",(u8*)RecdataU1); 
      
      //臥室LED開
      if(strstr((char*)RecdataU1,"led1_on"))
      {
        USART0_Printf("臥室LED開.\n"); 
        u8 buff[100]="B:1---";
        //發(fā)送數(shù)據(jù)
        tx_data(buff,strlen((char*)buff));
        //運(yùn)行狀態(tài)燈
        LED1 = !LED1; 
      }
      //臥室LED關(guān)
      else if(strstr((char*)RecdataU1,"led1_off"))
      {
        USART0_Printf("臥室LED關(guān).\n"); 
         u8 buff[100]="B:0---"; 
        //發(fā)送數(shù)據(jù)
        tx_data(buff,strlen((char*)buff));
        //運(yùn)行狀態(tài)燈
        LED1 = !LED1; 
      }
      //客廳LED開
      else if(strstr((char*)RecdataU1,"led2_on"))
      {
         USART0_Printf("客廳LED開.\n"); 
         u8 buff[100]="C:1---"; 
        //發(fā)送數(shù)據(jù)
        tx_data(buff,strlen((char*)buff));
        //運(yùn)行狀態(tài)燈
        LED1 = !LED1; 
      }
      //自動(dòng)模式
      else if(strstr((char*)RecdataU1,"yes_auto_mode"))
      {
         USART0_Printf("設(shè)置為自動(dòng)模式.\n"); 
         mode=1;
      }
      //手動(dòng)模式
      else if(strstr((char*)RecdataU1,"no_auto_mode"))
      {
         USART0_Printf("設(shè)置為手動(dòng)模式.\n"); 
         mode=0;
      }
      //閥值
      else if(strstr((char*)RecdataU1,"value:"))
      {
        //運(yùn)行狀態(tài)燈
        LED1 = !LED1; 
        
        char *p=strstr((char*)RecdataU1,"value:");
        if(p)
         {
          int a=atoi(p+6);
          if(a>0)
           {
           switch_val=a; //得到新的閥值
           }
         }
        
        USART0_Printf("設(shè)置新的閥值:%d.\n",switch_val); 
      }
      
      clearBuffU1(); //清理緩存
    }
    
   
    time_cnt++;
    DelayMs(10);
      
    //1秒鐘時(shí)間到達(dá)
    if(time_cnt>100)
    {
      time_cnt=0;
      
     //讀取ADC值--也就是光照傳感器的值
     GasData = ReadGasData();
     
     //發(fā)送光照傳感器的值到上位機(jī)
     USART0_Printf("光照度:%d,模式:%d\n",GasData,mode);
     
     //如果是自動(dòng)模式
     if(mode)
      {
        //根據(jù)閥值判斷是否開啟關(guān)閉臥室,客廳的LED燈
        if(GasData > switch_val )
        {
          //開燈  
          u8 buff1[10]="B:1---"; 
          //發(fā)送數(shù)據(jù)
          tx_data(buff1,strlen((char*)buff1));
           //開燈  
          u8 buff2[10]="C:1---"; 
          //發(fā)送數(shù)據(jù)
          tx_data(buff2,strlen((char*)buff2));
        }
        else
        {
           //關(guān)燈  
          u8 buff1[10]="B:0---"; 
          //發(fā)送數(shù)據(jù)
          tx_data(buff1,strlen((char*)buff1));
           //關(guān)燈  
          u8 buff2[10]="C:0---"; 
          //發(fā)送數(shù)據(jù)
          tx_data(buff2,strlen((char*)buff2));  
        }
      }
    }
   }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png


?審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ZigBee
    +關(guān)注

    關(guān)注

    158

    文章

    2267

    瀏覽量

    242427
  • 照明系統(tǒng)
    +關(guān)注

    關(guān)注

    3

    文章

    401

    瀏覽量

    32861
  • CC2530
    +關(guān)注

    關(guān)注

    19

    文章

    221

    瀏覽量

    57759
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    962

    瀏覽量

    44755
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    主流ZigBee芯片大盤點(diǎn)(2):德州儀器 CC2530

    CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 應(yīng)用的一個(gè)真正的片上系統(tǒng)(SoC)解決方案。##引腳圖與引腳功能說(shuō)明。##特性介紹。##模塊說(shuō)明。##應(yīng)用與典型案例。##推薦TI公司
    發(fā)表于 08-20 09:30 ?3.8w次閱讀

    德州儀器推出業(yè)界首款新型ZigBee系統(tǒng)單芯片CC2530

    德州儀器 (TI) 推出業(yè)界首款實(shí)際采用新ZigBee Light Link 標(biāo)準(zhǔn)的ZigBee 系統(tǒng)單晶片 (SoC) CC2530。ZigBee
    發(fā)表于 06-05 11:01 ?2006次閱讀

    zigbeecc2530

    `曬曬我的zigbeecc2530)模塊`
    發(fā)表于 03-20 13:58

    基于CC2530的無(wú)線路燈節(jié)能智能監(jiān)控系統(tǒng)

    利用ZigBee CC2530 自組織無(wú)線網(wǎng)絡(luò)進(jìn)行路燈控制器的設(shè)計(jì), 將ZigBee 技術(shù)與傳統(tǒng)的路燈控制模式相結(jié)合,提出了基于CC2530Zi
    發(fā)表于 05-18 09:33 ?4804次閱讀

    基于CC2530芯片_zigbee基礎(chǔ)實(shí)驗(yàn)

    zigbee基礎(chǔ)實(shí)驗(yàn),基于CC2530芯片
    發(fā)表于 12-11 10:48 ?48次下載

    cc2530 adc測(cè)外部電壓

    CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 應(yīng)用的一個(gè)真正的片上系統(tǒng)(SoC)解決方案。它能夠以非常低的總的材料成本建立強(qiáng)大的網(wǎng)絡(luò)節(jié)點(diǎn)。要在zi
    發(fā)表于 11-07 18:53 ?5572次閱讀
    <b class='flag-5'>cc2530</b> adc測(cè)外部電壓

    cc2530是什么_cc2530能做什么

    CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 應(yīng)用的一個(gè)真正的片上系統(tǒng)(SoC)解決方案。它能夠以非常低的總的材料成本建立強(qiáng)大的網(wǎng)絡(luò)節(jié)點(diǎn)。CC25
    發(fā)表于 11-08 09:28 ?4.6w次閱讀

    基于CC2530ZigBee協(xié)調(diào)器節(jié)點(diǎn)設(shè)計(jì)

    本文給出了基于TI新一代芯片CC2530ZigBee協(xié)調(diào)器節(jié)點(diǎn)設(shè)計(jì)方法,該方法選用TICC2591作為射頻前端芯片。
    發(fā)表于 01-05 15:25 ?4.9w次閱讀
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>ZigBee</b>協(xié)調(diào)器節(jié)點(diǎn)設(shè)計(jì)

    CC2530芯片的基本特性和CC2530無(wú)線模塊的設(shè)計(jì)

    本文介紹了CC2530芯片的基本特性,論述了以CC2530芯片為核心的無(wú)線通信模塊的硬件設(shè)計(jì)和調(diào)試軟件設(shè)計(jì),在介紹設(shè)計(jì)規(guī)范和模塊結(jié)構(gòu)的基礎(chǔ)上,采用TI公司的CC2530芯片作為主控制芯片設(shè)計(jì)出具
    發(fā)表于 02-11 08:00 ?97次下載
    <b class='flag-5'>CC2530</b>芯片的基本特性和<b class='flag-5'>CC2530</b>無(wú)線模塊的設(shè)計(jì)

    如何使用ZigBee TI ZStack CC2530 2.5搭建開發(fā)環(huán)境

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用ZigBee TI ZStack CC2530 2.5搭建開發(fā)環(huán)境。
    發(fā)表于 05-10 18:14 ?25次下載
    如何使用<b class='flag-5'>ZigBee</b> TI ZStack <b class='flag-5'>CC2530</b> 2.5搭建開發(fā)環(huán)境

    基于CC2530ZigBee通信網(wǎng)的應(yīng)用設(shè)計(jì).pdf

    基于CC2530ZigBee通信網(wǎng)的應(yīng)用設(shè)計(jì).pdf
    發(fā)表于 12-15 18:17 ?23次下載

    Zigbee(CC2530)傳感器板

    電子發(fā)燒友網(wǎng)站提供《Zigbee(CC2530)傳感器板.zip》資料免費(fèi)下載
    發(fā)表于 07-04 14:49 ?10次下載
    <b class='flag-5'>Zigbee</b>(<b class='flag-5'>CC2530</b>)傳感器板

    CC2530 芯片介紹

    簡(jiǎn)介 CC2530 結(jié)合了領(lǐng)先的RF 收發(fā)器的優(yōu)良性能,業(yè)界標(biāo)準(zhǔn)的增強(qiáng)型8051 CPU,系統(tǒng)內(nèi)可編程閃存,8-KB RAM 和許多其它強(qiáng)大的功能。CC2530 有四種不同的閃存版本
    發(fā)表于 01-03 11:00 ?3689次閱讀

    基于CC2530Zigbee2007-PRO協(xié)議的無(wú)線溫濕度系統(tǒng)設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于CC2530Zigbee2007-PRO協(xié)議的無(wú)線溫濕度系統(tǒng)設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 10-24 09:50 ?6次下載
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>Zigbee</b>2007-PRO協(xié)議的無(wú)線溫濕度<b class='flag-5'>系統(tǒng)</b>設(shè)計(jì)

    基于CC2530ZigBee通信網(wǎng)絡(luò)的應(yīng)用設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于CC2530ZigBee通信網(wǎng)絡(luò)的應(yīng)用設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 10-26 09:34 ?3次下載
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>ZigBee</b>通信網(wǎng)絡(luò)的應(yīng)用設(shè)計(jì)