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)控制效果演示。
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)試信息。
2.2 光敏傳感器
?編輯
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); ?
}
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));
}
}
}
}
}
?審核編輯:湯梓紅
-
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
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論