用Arduino將DS18B20的溫度上傳至xively.com

這個教程會為你講解:

*連接一個DS18B20溫度傳感器到Arduino

*用單線接口從傳感器讀取數據

*直接通過Arduino發送數據至xively.com

*在網絡上查看到 結果圖

http://xively.com是一個物聯網主機,可以基於你提供的數據來生成圖片。

在這個例子中我會去監控我房間里的溫度。

第一步:材料清單

Arduino測溫度1

* 帶以太網插板的Arduino 我有一個Arduino Uno clone 和一個WIZnet W5100 插板

* 電源供給(可以通過一個USB口)

我很幸運因為我的路由器上有USB端口可以提供5V的輸出,這意味着無論路由器在哪都可以給Arduino供電。

* DS18B20溫度傳感器

* RJ45 網線連接Arduino和你的路由器

步驟2:原理圖 Arduino溫度2   * Arduino gnd接地端 接DS18B20兩個外部引腳

* Arduino 5V 接4.7k 電阻

* 4.7k電阻的另一個引腳接DS18B20中間引腳

* Arduino 數字引腳2 接DS18B20 中間引腳

* RJ45 電纜連接Arduino和路由器

* Arduino電源線(通過USB或電源插頭,我用USB接的路由器)

步驟3:預備知識

Arduino溫度4

要求的Arduino的三個庫:

onewire庫來自 http://www.pjrc.com/teensy/td_libs_OneWire.html 

httpclient庫來自 https://github.com/amcewen/HttpClient 

Xively來自https://github.com/xively/xively_arduino


在你的Arduino/庫目錄中 安裝這些庫 一個在http://xively.com上申請的賬戶(之前的pachebe.com和cosm.com)

https://xively.com/get_started/上申請一個免費的開發者賬戶

選擇一個用戶名,密碼,設置你的地址和時區等等。你會收到一個確認郵件,點擊激活鏈接激活你的賬戶。 你可以選擇test drive測試驅動來學習xively或者跳過,這完全取決於你。

正在做測試驅動?我等待一下~

做完啦?讓我們繼續

步驟4:在Xively上增加一個新的設備 Arduino溫度3   你現在應該在xively的開發設備頁。這是興趣的開始。

點擊+ADD Device 給新設備名稱如Arduino DS18B20溫度記錄器。

填寫關於這個設備的描述,他的位置如我的創客空間。我喜歡在這加一個我家的網頁鏈接,儘管在之後的指令里有一個專用的web地址區域。 選擇數據是否公開。

你真的想讓世界知道你的創客空間有多熱嘛?我選擇空開除非我做的是個鬧鐘之類的。 點擊頁面底部的增加設備按鈕。

步驟5:你新設備的xively 界面,以及所有的訪問代碼 Arduino溫度5   你現在的頁面有大量的信息,不要有壓力。

這個頁面可以分成8個部分:

* 產品ID,產品秘密,串口號,激活代碼

* 狀態(已激活),源ID,源網址URL鏈接(它會顯示圖片數據),API端點

* “Add channels to your device!” — Arduino會在代碼中處理它

* 請求日誌–這個是為了調試和確認 Arduino端的運行。

* 位置–地理位置傳感器(可選)

* API keys– 我們之後再Arduino代碼中需要這個

* 元數據–可編輯 * 觸發器– 當一些事情發生時 ping一個網頁(例如溫度掉到零度以下 )

步驟6:Arduino代碼

Arduino溫度6

<code>

#include <SPI.h>

#include <Ethernet.h>

#include <HttpClient.h>

#include <Xively.h>

#include <OneWire.h> // MAC address for your Ethernet shield byte

mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Your Xively key to let you upload data char xively

Key[] = “”; // enter the key, under API Keys

unsigned long feedId = 0; // enter your feed ID, under Activated

int frequency = 15000; // delay between updates (milliseconds) // Analog pin which we’re monitoring (0 and 1 are used by the Ethernet shield)

int sensorPin = 2; // Define the strings for our datastream IDs

char sensorId[] = “temp”;

XivelyDatastream datastreams[] = { XivelyDatastream(sensorId, strlen(sensorId),DATASTREAM_FLOAT), }; // Finally, wrap the datastreams into a feed XivelyFeed

feed(feedId, datastreams, 1 /* number of datastreams */);

EthernetClient client; XivelyClient xivelyclient(client); // initialize the one-wire interface OneWire ds(sensorPin);  // on pin 2 (a 4.7K resistor is necessary) /* 5v – 4.7k resistor – 18B20 middle pin – D2 gnd – 18B20 both legs (joined together) */

void setup() {

// put your setup code here, to run once: Serial.begin(9600);

Serial.println(“Starting single datastream upload to Xively…”);

Serial.println();

while (Ethernet.begin(mac) != 1) {

Serial.println(“Error getting IP address via DHCP, trying again…”); delay(5000); }

Serial.print(“IP address: “);

for (byte thisByte = 0; thisByte < 4; thisByte++) {

// print the value of each byte of the IP address:

Serial.print(Ethernet.localIP()[thisByte], DEC);

Serial.print(“.”); }

Serial.println(); }

void loop() {

byte present = 0;

byte type_s;

byte data[12];

byte addr[8];

float celsius;

if ( !ds.search(addr)) {

Serial.println(“No more addresses.”);

delay(250);

ds.reset_search();

return; }

if (OneWire::crc8(addr, 7) != addr[7]) {

Serial.print(“CRC is not valid!”); return; } // the first ROM byte indicates which chip

switch (addr[0]) {

case 0x10: Serial.print(”  Chip = DS18S20″);  // or old DS1820 type_s = 1; break; case 0x28:

Serial.print(”  Chip = DS18B20″);

type_s = 0;

break;

case 0x22: Serial.print(”  Chip = DS1822″);

type_s = 0;

break;

default: Serial.println(“Device is not a DS18x20 family device.”);

return;

}

Serial.println();

ds.reset();

ds.select(addr);

ds.write(0x44, 1);        // start conversion, with parasite power on at the end delay(1000);

// maybe 750ms is enough, maybe not

// we might do a ds.depower() here, but the reset will take care of it.

present = ds.reset();

ds.select(addr);

ds.write(0xBE);         // Read Scratchpad

for ( i = 0; i < 9; i++) {

// we need 9 bytes data[i] = ds.read();

int16_t raw = (data[1] << 8) | data[0];

if (type_s) { raw = raw << 3; // 9 bit resolution default

if (data[7] == 0x10) {

// “count remain” gives full 12 bit resolution

raw = (raw & 0xFFF0) + 12 – data[6];

}

}

else { byte cfg = (data[4] & 0x60); // at lower res, the low bits are undefined, so let’s zero them

if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms

else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms

else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //

// default is 12 bit resolution, 750 ms conversion time

}

celsius = (float)raw / 16.0; datastreams[0].setFloat(celsius);

Serial.print(“Current temperature: “);

Serial.print(datastreams[0].getFloat());

Serial.println(” celsius”);

Serial.println(“Uploading it to Xively”);

int ret = xivelyclient.put(feed, xivelyKey);

Serial.print(“xivelyclient.put returned “);

Serial.println(ret); Serial.println();

delay(frequency); }

</code>

步驟7:歡迎來到物聯網的世界 Arduino溫度7   一旦你上傳代碼到Arduino,你應該能在請求日誌部分看到數據,還有在圖片上出現的數據點。

恭喜你,你正在上傳你創客空間的數據給全世界看

下一步是什麼呢?這取決於你

你一天開多少次前車門?

你的秋海棠的水位是多少?

你的洗車器洗完車了么?

你的咖啡機空着呢么?

你在外出的時候孩子玩音樂有多大聲?

有數以萬計的可能監控的事物,看看你的周圍就可以了。 這裡可以看我的創客空間<bs><bs><bs><bs><bs><bs><bs><bs><bs><bs><bs> 卧室: https://xively.com/feeds/1238358657

當前溫度是26.5攝氏度,應該是秋天了。

國內用戶推薦使用:Yeelink 樂為物聯
原文來自:instructables.com