奔跑哥大俠的作品就是牛:
溫度是我們生活中接觸的較多的物理量之一,例如氣溫、人體溫度,但很多時候卻不能實地測量,例如在室內想實時知道室外的氣溫,這時候就需要使用無線傳輸來實現了。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所示。
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所示。
溫度測量部分采用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()
{
}
void loop(){
}
三、時鐘和顯示部分
時鐘和顯示部分采用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所示。
溫度測量部分采用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()
{
}
void loop()
{
}
四、時鐘校準部分
或許當你完成以上的工作之后,卻發現時間不正確,這是因為時鐘芯片或模塊在出廠之后沒有能夠保證一直供電,或者其他原因的影響,導致時鐘模塊的時間與當前時間有所差值,這時候就需要對時鐘模塊進行校準。在時鐘校準代碼中將時間改為當前時間,最好略微超前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 ()
{
}
void loop ()
{
}
五、實驗演示
實物演示圖如圖4所示,上方為時鐘和顯示部分,下方為溫度測量部分。為了更好的證明兩者是通過無線傳輸數據,溫度測量部分采用外接電源端口供電,時鐘和顯示部分采用USB端口供電。
圖4 實物演示圖