專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> Arduino >> 瀏覽文章

基于ZigBee與Arduino的無(wú)線溫度測(cè)量裝置

作者:我不是奔跑哥   來(lái)源:我不是奔跑哥的空間   點(diǎn)擊數(shù):  更新時(shí)間:2014年06月08日   【字體:
奔跑哥大俠的作品就是牛:
溫度是我們生活中接觸的較多的物理量之一,例如氣溫、人體溫度,但很多時(shí)候卻不能實(shí)地測(cè)量,例如在室內(nèi)想實(shí)時(shí)知道室外的氣溫,這時(shí)候就需要使用無(wú)線傳輸來(lái)實(shí)現(xiàn)了。Arduino控制器外圍實(shí)現(xiàn)ZigBee無(wú)線傳輸功能的主要有XBee模塊和Zigduino控制器,XBee模塊是串口操作,使用Arduino控制器與XBee模塊即可實(shí)現(xiàn)ZigBee無(wú)線傳輸,但是XBee模塊價(jià)格較高,而且需要轉(zhuǎn)接板或連接線,不利于集成化;Zigduino是帶有ZigBee無(wú)線傳輸功能的Arduino兼容控制器,具有集成化程度高、體積小、性價(jià)比高的優(yōu)點(diǎn)。從性價(jià)比的角度出發(fā),本文最終采用Zigduino控制器來(lái)實(shí)現(xiàn)溫度數(shù)據(jù)的ZigBee無(wú)線傳輸。
本文利用Zigduino內(nèi)部集成的無(wú)線模塊實(shí)現(xiàn)數(shù)據(jù)的無(wú)線傳輸,溫度測(cè)量部分采用單總線數(shù)字式溫度傳感器DS18B20實(shí)現(xiàn)溫度測(cè)量,時(shí)鐘和顯示部分使用DS3231實(shí)時(shí)時(shí)鐘模塊和LCD1602液晶顯示模塊實(shí)現(xiàn)時(shí)鐘和溫度的顯示功能。
一、Zigduino IDE的設(shè)置
Zigduino是一款兼容Arduino的開源硬件控制器,不僅與Arduino控制器保持兼容,而且內(nèi)部集成了802.15.4協(xié)議無(wú)線模塊,支持任何基于802.15.4協(xié)議的無(wú)線模塊,包括ZigBee,MAC/6LoWPAN和 RF4CE。雖然Zigduino的核心單片機(jī)Atmega128RFA1的工作電壓為3.3V,但是Zigduino控制器的引腳兼容5V,并且可以與Arduino擴(kuò)展板保持兼容。除此之外,Zigduino控制器還內(nèi)置了鋰電管理模塊,并且具有128KB FLASH和16KB SRAM,可以滿足較復(fù)雜的應(yīng)用需求。Zigduino實(shí)物圖如圖1所示。
 


1 Zigduino實(shí)物圖
Zigduino的開發(fā)環(huán)境是基于Aduino的開發(fā)環(huán)境開發(fā)而來(lái),可以使用Ziduino完整版或Arduino IDE擴(kuò)展包來(lái)實(shí)現(xiàn)Zigduino的開發(fā)。IDE完整版下載地址:http://pan.baidu.com/share/link?shareid=387242&uk=3643299,IDE擴(kuò)展包下載地址:http://pan.baidu.com/share/link?shareid=419678&uk=3643299
完整版的使用方法:直接解壓縮后運(yùn)行arduino.exe,在板卡里選擇OCROBOT HoneyBee即可正常使用。
擴(kuò)展包的使用方法:將擴(kuò)展包內(nèi)2個(gè)文件夾復(fù)制到原IDE的根目錄下,替換掉提示重復(fù)的文件后,再次運(yùn)行arduino.exe即可正常使用。
二、溫度測(cè)量部分
溫度測(cè)量部分采用Zigduino控制器和溫度傳感器DS18B20來(lái)實(shí)現(xiàn),將DS18B20的VDD和GND分別接至Zigduino 控制器的5V和GND,數(shù)據(jù)引腳DQ接至Zigduino控制器的數(shù)字端口D2,并且在數(shù)據(jù)引腳DQ與+5V之間連接阻值為4.7kΩ的上拉電阻,以保證溫度傳感器DS18B20能夠正常工作,Zigduino控制器與DS18B20的連接示意圖如圖2所示。
 

2 溫度測(cè)量部分硬件連接圖
溫度測(cè)量部分采用Zigduino控制器與DS18B20來(lái)實(shí)現(xiàn)溫度的測(cè)量,即可使用第三方函數(shù)庫(kù)DallasTemperature來(lái)實(shí)現(xiàn),只是將帶有兩位小數(shù)的溫度數(shù)據(jù)先放大100倍,以去除小數(shù)點(diǎn),再提取出溫度數(shù)據(jù)的整數(shù)部分和小數(shù)部分,具體代碼如下所示。
#include        //加載無(wú)線庫(kù)
#include            //加載單總線總線庫(kù)
#include    //加載單總線溫度傳感器庫(kù)
#define ONE_WIRE_BUS 2       //定義單總線所連接的引腳
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
char i,j;       //定義變量,用于存放溫度數(shù)據(jù)的整數(shù)和小數(shù)部分
int a;         //定義變量,用于存放溫度數(shù)據(jù)
void setup()
{
  ZigduinoRadio.begin(11);//設(shè)置通道為11,可設(shè)置為11-26
  sensors.begin();   //初始化傳感器
}
void loop(){
  sensors.requestTemperatures(); // 從DS18B20傳感器獲取溫度數(shù)據(jù)
  a=sensors.getTempCByIndex(0)*100; //將溫度數(shù)據(jù)放大100倍,以去除小數(shù)點(diǎn)
  i=a/100;    //取出溫度數(shù)據(jù)的整數(shù)部分
  j=a0;   //取出溫度數(shù)據(jù)的小數(shù)部分
  ZigduinoRadio.beginTransmission();//無(wú)線開始通信標(biāo)志
  ZigduinoRadio.write(i);//無(wú)線發(fā)送溫度數(shù)據(jù)的整數(shù)部分
  ZigduinoRadio.write(j);//無(wú)線發(fā)送溫度數(shù)據(jù)的小數(shù)部分
  ZigduinoRadio.endTransmission();//無(wú)線結(jié)束通信標(biāo)志
  delay(1000);   //更新速率為1次/秒
}

三、時(shí)鐘和顯示部分
時(shí)鐘和顯示部分采用Zigduino控制器和DS3231實(shí)時(shí)時(shí)鐘模塊、LCD1602液晶顯示屏模塊來(lái)實(shí)現(xiàn),將DS3231的5V和GND分別接至Zigduino 控制器的5V和GND,信號(hào)引腳SCL、SDA分別接至Zigduino控制器的端口SCL、SDA;將LCD1602液晶顯示屏模塊的VCC、GND、R/W分別接至Zigduino 控制器的5V、GND和GND,對(duì)比度調(diào)節(jié)引腳VEE通過(guò)10kΩ的電位器來(lái)調(diào)節(jié)分壓值,從而實(shí)現(xiàn)對(duì)比度的調(diào)節(jié),信號(hào)控制引腳RS、E分別直接至Zigduino 控制器數(shù)字端口D7和D6,數(shù)據(jù)輸入引腳D4、D5、D6、D7分別接至Zigduino 控制器數(shù)字端口D5、D4、D3、D2。具體的連接示意圖如圖3所示。
 

3 時(shí)鐘和顯示部分硬件連接圖(點(diǎn)擊查看大圖)
溫度測(cè)量部分采用Zigduino控制器與DS18B20來(lái)實(shí)現(xiàn)溫度的測(cè)量,即可使用第三方函數(shù)庫(kù)DallasTemperature來(lái)實(shí)現(xiàn),只是將帶有兩位小數(shù)的溫度數(shù)據(jù)先放大100倍,以去除小數(shù)點(diǎn),再提取出溫度數(shù)據(jù)的整數(shù)部分和小數(shù)部分,具體代碼如下所示。
 
#include   //加載液晶顯示庫(kù)
#include          //加載I2C總線庫(kù)
#include //加載無(wú)線庫(kù)
#include "DS3231.h"       //加載DS3231時(shí)鐘庫(kù)
 
DS3231 RTC; //創(chuàng)建時(shí)鐘類
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);  //依次為液晶RS、E、D4、D5、D6、D7所連接的引腳
char i,j;
 
void setup()
{
                  ZigduinoRadio.begin(11); //設(shè)置通道為11,可設(shè)置為11-26
                  lcd.begin(16, 2);        //初始化1602液晶顯示屏
         Wire.begin();           //初始化I2C總線
         RTC.begin();           //啟動(dòng)DS3231實(shí)時(shí)時(shí)鐘模塊
                  lcd.clear();            //清除液晶顯示屏上的內(nèi)容
void loop()
{
        lcd.setCursor(0, 0);
        DateTime now = RTC.now();  //獲取當(dāng)前時(shí)間
        lcd.print(now.year(), DEC);   //顯示年份
        lcd.print('/');
        lcd.print(now.month(), DEC);  //顯示月份
        lcd.print('/');
        lcd.print(now.date(), DEC);   //顯示日期
        lcd.setCursor(0, 1);
        lcd.print(now.hour(), DEC);   //顯示小時(shí)
        lcd.print(':');
        if(now.minute()>9){       //判斷是否分鐘的十位部分是否為零,若十位部分為零,則在十位處顯示0,,例如為5分鐘,則顯示為05。下同。
          lcd.print(now.minute(), DEC);  //顯示分鐘
        }
        else{
          lcd.print("0");
          lcd.print(now.minute(), DEC);
        }
        lcd.print(':');      
        if(now.second()>9){
           lcd.print(now.second(), DEC);   //顯示秒鐘
        }
        else{
          lcd.print("0");
          lcd.print(now.second(), DEC);
        }
        lcd.print(" ");
        if (ZigduinoRadio.available())//判斷無(wú)線是否接受到數(shù)據(jù)
        {
          i=(char)ZigduinoRadio.read();//將接收到的數(shù)據(jù)賦給變量i,因?yàn)槲覀冊(cè)诎l(fā)射端發(fā)送的數(shù)據(jù)為char型變量,故要接收char型可以直接在接收變量前面加(char),這樣既可使接收到的數(shù)據(jù)變?yōu)閏har型。
          j=(char)ZigduinoRadio.read();
        }
         lcd.print(i,DEC);     //顯示溫度數(shù)據(jù)的整數(shù)部分
         lcd.print(".");
         if(j>9){
            lcd.print(j,DEC);   //顯示溫度數(shù)據(jù)的小數(shù)部分
        }
        else{
          lcd.print("0");
          lcd.print(j,DEC);
        }
         lcd.write(0xdf);   //顯示攝氏溫度單位℃
                   lcd.write('C');  
}

四、時(shí)鐘校準(zhǔn)部分
或許當(dāng)你完成以上的工作之后,卻發(fā)現(xiàn)時(shí)間不正確,這是因?yàn)闀r(shí)鐘芯片或模塊在出廠之后沒(méi)有能夠保證一直供電,或者其他原因的影響,導(dǎo)致時(shí)鐘模塊的時(shí)間與當(dāng)前時(shí)間有所差值,這時(shí)候就需要對(duì)時(shí)鐘模塊進(jìn)行校準(zhǔn)。在時(shí)鐘校準(zhǔn)代碼中將時(shí)間改為當(dāng)前時(shí)間,最好略微超前30秒左右,因?yàn)榫幾g和下載需要浪費(fèi)一會(huì)兒時(shí)間,然后將校準(zhǔn)代碼下載至連接有DS3231實(shí)時(shí)時(shí)鐘模塊的Zigduino或Arduino 控制器,時(shí)鐘校準(zhǔn)代碼如下所示。
#include
#include "DS3231.h"
DS3231 RTC; //Create the DS3231 object
char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
//year, month, date, hour, min, sec and week-day(starts from 0 and goes to 6)
//writing any non-existent time-data may interfere with normal operation of the RTC.
//Take care of week-day also.
DateTime dt(2011, 11, 10, 15, 18, 0, 5);   //需要校準(zhǔn)的時(shí)間,最好
void setup ()
{
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();
    RTC.adjust(dt); //Adjust date-time as defined 'dt' above
}
void loop ()
{
    DateTime now = RTC.now(); //獲取時(shí)間
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.date(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    Serial.print(weekDay[now.dayOfWeek()]);
    Serial.println();
    delay(1000);
}

五、實(shí)驗(yàn)演示
實(shí)物演示圖如圖4所示,上方為時(shí)鐘和顯示部分,下方為溫度測(cè)量部分。為了更好的證明兩者是通過(guò)無(wú)線傳輸數(shù)據(jù),溫度測(cè)量部分采用外接電源端口供電,時(shí)鐘和顯示部分采用USB端口供電。
  

 

圖4 實(shí)物演示圖
關(guān)閉窗口

相關(guān)文章