一、環境介紹
編譯內建開發環境: IAR
(安裝包下載下傳:https://download.csdn.net/download/xiaolong1126626497/19732120)
MCU:CC2530(ZigBee)
程式設計語言: C語言
手機APP: 采用QT設計,程式支援跨平台編譯運作(Android、IOS、Windows、Linux都可以編譯運作,對應平台上QT的環境搭建,之前部落格已經發了文章講解)
硬體包含: 3套CC2530開發闆(1個協調器、2個節點)、1個ESP8266序列槽WIFI、1個DHT11溫濕度傳感器、1個RGB多彩燈、1個BH1750光強度檢測傳感器.
完整項目源碼下載下傳位址:
https://download.csdn.net/download/xiaolong1126626497/19730948 資料包裡包含了: CC2530協調器源碼、2個節點源碼、手機APP源碼、Windows上位機源碼、手機APP可執行檔案、IAR下載下傳器驅動、IAR資料等等。二、功能介紹
這是基于CC2530設計的景觀照明控制系統,一共包含了3個CC2530節點(就是3塊CC2530開發闆)。
下面将這個3個CC2530開發闆稱為A、B、C節點。
A節點: 當做協調器、可以接收BC節點上傳的資料;A子產品配了一個ESP8266 WIFI子產品,可以連接配接手機APP,将BC節點上傳溫濕度資料再上傳給手機APP顯示。如果A節點在一定時間内沒有收到B、C節點的資料,就會通知手機APP,告訴使用者,B、C節點已經掉線。
B節點: 作為RGB多彩燈+溫濕度檢測節點,會根據目前溫濕度調整目前RGB燈的顔色,用于告訴景區的遊客,目前景區的溫濕度情況,采集的溫濕度也會通過CC2530傳遞給A節點。
C節點: 光照強度檢測+LED燈節點。 這裡的LED燈就是模拟景區的路燈,手機APP可以控制LED燈的開關,如果是白天的時候,LED燈會自動關掉,天氣變暗,自動打開。也可以設計時間,定時關燈。
三、相關的硬體介紹
3.1 DTH11 溫濕度傳感器
DHT11數字溫濕度傳感器是一款含有已校準數字信号輸出的溫濕度複合傳感器,它應用專用的數字子產品采集技術和溫濕度傳感技術,確定産品具有極高的可靠性和卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接配接。是以該産品具有品質卓越、超快響應、抗幹擾能力強、成本效益極高等優點。每個DHT11傳感器都在極為精确的濕度校驗室中進行校準。校準系數以程式的形式存在OTP記憶體中,傳感器内部在檢測信号的處理過程中要調用這些校準系數。單線制串行接口,使系統內建變得簡易快捷。超小的體積、極低的功耗,使其成為該類應用中,在苛刻應用場合的最佳選擇。産品為4針單排引腳封裝,連接配接友善。
3.2 ESP8266 WIFI
ESP8266系列無線子產品是高成本效益WIFI SOC模組,該系列子產品支援标準的IEEE802.11b/g/n協定,内置完整的TCP/IP協定棧。使用者可以使用該系列子產品為現有的裝置添加聯網功能,也可以建構獨立的網絡控制器。
能卓越
ESP8266EX 晶片内置超低功耗 Tensilica L106 32 位 RISC 處理器,CPU 時脈速度最⾼可達 160 MHz,⽀持實時作業系統 (RTOS) 和 Wi-Fi 協定棧,可将⾼達 80% 的處理能⼒應用于程式設計和開發。
高度內建
ESP8266 晶片高度內建天線開關、射頻巴倫、功率放大器、低噪聲接收放大器、濾波器等射頻子產品。模組尺寸小巧,尤其适用于空間受限的産品設計。
認證齊全
RF 認證:SRRC、FCC、CE-RED、KCC、TELEC/MIC、IC 和 NCC 認證;
環保認證:RoHS、REACH;
可靠性認證:HTOL、HTSL、μHAST、TCT、ESD。
豐富的産品應用
ESP8266 模組既可以通過 ESP-AT 指令固件,為外部主機 MCU 提供 Wi-Fi 連接配接功能;也可以作為獨立 Wi-Fi MCU 運作,使用者通過基于 RTOS 的 SDK 開發帶 Wi-Fi 連接配接功能的産品。使用者可以輕松實作開箱即用的雲連接配接、低功耗運作模式,以及包括 WPA3 在内的 Wi-Fi 安全支援等功能。
3.3 CC2530
CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 應用的一個真正的片上系統(SoC)解決方案。它能夠以非常低的總的材料成本建立強大的網絡節點。
CC2530 結合了領先的RF 收發器的優良性能,業界标準的增強型8051 CPU,系統内可程式設計閃存,8-KB RAM 和許多其它強大的功能。CC2530 有四種不同的閃存版本:CC2530F32/64/128/256,分别具有32/64/128/256KB 的閃存。CC2530 具有不同的運作模式,使得它尤其适應超低功耗要求的系統。運作模式之間的轉換時間短進一步確定了低能源消耗。
CC2530F256 結合了德州儀器的業界領先的黃金單元ZigBee 協定棧(Z-Stack™),提供了一個強大和完整的ZigBee 解決方案。
CC2530F64 結合了德州儀器的黃金單元RemoTI,更好地提供了一個強大和完整的ZigBee RF4CE 遠端控制解決方案。
3.4 RGB多彩燈顔色:全彩 紅綠藍三基色
亮度:高亮
電壓:5V
輸入:數字電平
三基色原理顯示多重顔色
通過PWM端口控制實作全彩顯示
3.5 BH1750 bh1750是16位數字輸出型,環境光強度傳感器。 四、節點硬體+手機APP介紹 4.1 C節點: 光敏傳感器+LED燈控制 4.2 B節點: 多彩燈+溫濕度 4.3 A節點: WIFI + APP 4.4 手機APP界面效果 五、手機APP上位機源碼六、CC2530節點源碼
節點源碼較多,下面就貼一些關鍵代碼。
6.1 uart.c#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(u8 *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; //清除發送完成标志,準備下一次發送
}
}
6.2 DHT11.c
#include "dht11.h"
#include "delay.h"
#define DATA_PIN P0_7
//溫濕度定義
uchar ucharFLAG,uchartemp;
uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4;
uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata;
uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp;
uchar ucharcomdata;
//延時函數
void Delay_us() //1 us延時
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void Delay_10us() //10 us延時
{
#if 0
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
#else
int i = 10;
while(i--);
#endif
}
void Delay_ms(unsigned int Time)//n ms延時
{
unsigned char i;
while(Time--)
{
for(i=0;i<100;i++)
Delay_10us();
}
}
//溫濕度傳感
void COM(void) // 溫濕寫入
{
uchar i;
for(i=0;i<8;i++)
{
ucharFLAG=2;
while((!DATA_PIN)&&ucharFLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
uchartemp=0;
if(DATA_PIN)uchartemp=1;
ucharFLAG=2;
while((DATA_PIN)&&ucharFLAG++);
if(ucharFLAG==1)break;
ucharcomdata<<=1;
ucharcomdata|=uchartemp;
}
}
void DHT11(void) //溫濕傳感啟動
{
DATA_PIN=0;
Delay_ms(19); //>18MS
DATA_PIN=1;
P0DIR &= ~0x80; //重新配置IO口方向
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
if(!DATA_PIN)
{
ucharFLAG=2;
while((!DATA_PIN)&&ucharFLAG++);
ucharFLAG=2;
while((DATA_PIN)&&ucharFLAG++);
COM();
ucharRH_data_H_temp=ucharcomdata;
COM();
ucharRH_data_L_temp=ucharcomdata;
COM();
ucharT_data_H_temp=ucharcomdata;
COM();
ucharT_data_L_temp=ucharcomdata;
COM();
ucharcheckdata_temp=ucharcomdata;
DATA_PIN=1;
uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);
if(uchartemp==ucharcheckdata_temp)
{
ucharRH_data_H=ucharRH_data_H_temp;
ucharRH_data_L=ucharRH_data_L_temp;
ucharT_data_H=ucharT_data_H_temp;
ucharT_data_L=ucharT_data_L_temp;
ucharcheckdata=ucharcheckdata_temp;
}
wendu_shi=ucharT_data_H/10;
wendu_ge=ucharT_data_H%10;
shidu_shi=ucharRH_data_H/10;
shidu_ge=ucharRH_data_H%10;
}
else //沒用成功讀取,傳回0
{
wendu_shi=0;
wendu_ge=0;
shidu_shi=0;
shidu_ge=0;
}
P0DIR |= 0x80; //IO口需要重新配置
}
6.3 BH1750.c
#include "bh1750.h"
u8 Read_BH1750_Data()
{
unsigned char t0;
unsigned char t1;
unsigned char t;
u8 r_s=0;
IIC_Start(); //發送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//擷取應答
if(r_s)USART0_Printf("error:1\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//擷取應答
if(r_s)USART0_Printf("error:2\r\n");
IIC_Stop(); //停止信号
IIC_Start(); //發送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//擷取應答
if(r_s)USART0_Printf("error:3\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//擷取應答
if(r_s)USART0_Printf("error:4\r\n");
IIC_Stop(); //停止信号
IIC_Start(); //發送起始信号
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//擷取應答
if(r_s)USART0_Printf("error:5\r\n");
IIC_WriteOneByteData(0x10);
r_s=IIC_GetACK();//擷取應答
if(r_s)USART0_Printf("error:6\r\n");
IIC_Stop(); //停止信号
DelayMs(300); //等待
IIC_Start(); //發送起始信号
IIC_WriteOneByteData(0x47);
r_s=IIC_GetACK();//擷取應答
if(r_s)USART0_Printf("error:7\r\n");
t0=IIC_ReadOneByteData(); //接收資料
IIC_SendACK(0); //發送應答信号
t1=IIC_ReadOneByteData(); //接收資料
IIC_SendACK(1); //發送非應答信号
IIC_Stop(); //停止信号
t=(((t0<<8)|t1)/1.2);
return t;
}
五、IAR環境搭建--搭建CC2530開發環境