<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> Arduino >> 瀏覽文章

        基于ZigBee與Arduino的無線溫度測量裝置

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


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

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

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

        3 時鐘和顯示部分硬件連接圖(點擊查看大圖)
        溫度測量部分采用Zigduino控制器與DS18B20來實現溫度的測量,即可使用第三方函數庫DallasTemperature來實現,只是將帶有兩位小數的溫度數據先放大100倍,以去除小數點,再提取出溫度數據的整數部分和小數部分,具體代碼如下所示。
         
        #include   //加載液晶顯示庫
        #include          //加載I2C總線庫
        #include //加載無線庫
        #include "DS3231.h"       //加載DS3231時鐘庫
         
        DS3231 RTC; //創建時鐘類
        LiquidCrystal lcd(7, 6, 5, 4, 3, 2);  //依次為液晶RS、E、D4、D5、D6、D7所連接的引腳
        char i,j;
         
        void setup()
        {
                          ZigduinoRadio.begin(11); //設置通道為11,可設置為11-26
                          lcd.begin(16, 2);        //初始化1602液晶顯示屏
                 Wire.begin();           //初始化I2C總線
                 RTC.begin();           //啟動DS3231實時時鐘模塊
                          lcd.clear();            //清除液晶顯示屏上的內容
        void loop()
        {
                lcd.setCursor(0, 0);
                DateTime now = RTC.now();  //獲取當前時間
                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);   //顯示小時
                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())//判斷無線是否接受到數據
                {
                  i=(char)ZigduinoRadio.read();//將接收到的數據賦給變量i,因為我們在發射端發送的數據為char型變量,故要接收char型可以直接在接收變量前面加(char),這樣既可使接收到的數據變為char型。
                  j=(char)ZigduinoRadio.read();
                }
                 lcd.print(i,DEC);     //顯示溫度數據的整數部分
                 lcd.print(".");
                 if(j>9){
                    lcd.print(j,DEC);   //顯示溫度數據的小數部分
                }
                else{
                  lcd.print("0");
                  lcd.print(j,DEC);
                }
                 lcd.write(0xdf);   //顯示攝氏溫度單位℃
                           lcd.write('C');  
        }

        四、時鐘校準部分
        或許當你完成以上的工作之后,卻發現時間不正確,這是因為時鐘芯片或模塊在出廠之后沒有能夠保證一直供電,或者其他原因的影響,導致時鐘模塊的時間與當前時間有所差值,這時候就需要對時鐘模塊進行校準。在時鐘校準代碼中將時間改為當前時間,最好略微超前30秒左右,因為編譯和下載需要浪費一會兒時間,然后將校準代碼下載至連接有DS3231實時時鐘模塊的Zigduino或Arduino 控制器,時鐘校準代碼如下所示。
        #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);   //需要校準的時間,最好
        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(); //獲取時間
            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);
        }

        五、實驗演示
        實物演示圖如圖4所示,上方為時鐘和顯示部分,下方為溫度測量部分。為了更好的證明兩者是通過無線傳輸數據,溫度測量部分采用外接電源端口供電,時鐘和顯示部分采用USB端口供電。
          

         

        圖4 實物演示圖
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮