# ThingSpeak

由於現在Internet of Thing(物聯網)發展快速，希望設備資訊狀態能透過通訊能隨時監測的狀況下，也越來越多的雲端IOT資料平台，例如現在要用的[ThingSpeak](https://thingspeak.com)，把Raspberry Pi上的溫濕度透過網路傳送到ThingSpeak網站上，然後就可以透過網站就可以即時知道目前Raspberry Pi的溫濕度狀況，接下來先申請ThingSpeak的帳號

## 申請ThingSpeak帳號

進入ThingSpeak網站(<https://thingspeak.com>)，可以看到如下的畫面，請點選畫面中綠底白字的「Get Started For Free」\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQBvlsEindtFhl5%2Fthingspeak01.png?generation=1556903031595338\&alt=media)

接著會看到如下的表單，請依序填寫完成後，點選下方藍底白字的「Continue」，接著會轉到另一個頁面，告知要去註冊的E-Mail收信，並點選mail中的連結做確認\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQDg4ueRpKD0heU%2Fthingspeak02.png?generation=1556903031638191\&alt=media)

註冊完後，正常會收到一封確認信在註冊的E-Mail，如下圖為收到的確認信，請點選「Verify your email」或下方的連結\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQFgCFooDZVP0Su%2Fthingspeak03.png?generation=1556903031040432\&alt=media)

點選後，會轉到MathWorks網站，看到「Your profile was verified」代表確認完成\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQHXI15s8G5gv2m%2Fthingspeak04.png?generation=1556903030457498\&alt=media)

接著再打開進入ThingSpeak網站(<https://thingspeak.com>)，點選右上角的「Sign In」會看到如下圖的登入畫面，請輸入註冊的E-Mail，然後點選「Next」![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQJrym-CJ66H_gL%2Fthingspeak05.png?generation=1556903030605892\&alt=media)

輸入註冊時所填寫的密碼後，點選「Sign In」![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQLTqRQc4LjaYpE%2Fthingspeak05-1.png?generation=1556903030589296\&alt=media)

第一次登入時會出現如下的畫面，從剛剛確認信點選連結時轉跳到MathWorks時就會發現，其實註冊的是MathWorks帳號，只是做了連結，在此頁會說明…，看完點選「OK」即可\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQNKAnYF3C6Bs6y%2Fthingspeak06.png?generation=1556903031180786\&alt=media)

接著出現一個表單，問使用ThingSpeak的意圖，那請自已選取後，點選下方的「OK」\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQPc6fmsANpsd0b%2Fthingspeak07.png?generation=1556903030987818\&alt=media)

看到下圖的畫面代表已經完成註冊並且登入![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQRO53tcr5UzAit%2Fthingspeak08.png?generation=1556903030806705\&alt=media)

## 建立Channels

註冊好帳及並且登入ThingSpeak後，會進入My Channels頁面，目前是沒有專案的，只有一個「New Channel」和一個搜尋的欄位，那如果建立了很多的Channels時可以輸入該Channel的tag後，點選右邊的方大鏡做搜尋，那先點選「New Channel」\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQTmhGBSymAKyYP%2FthingspeakChannels01.png?generation=1556903030156196\&alt=media)

點選「New Channel」後會看到有很多的欄位，那右邊有help及欄位的說明，最主要填寫「Name」和「Field」Name的部分可依自已喜好填寫，這邊先填入「DHT22」，Field這部分一個chanel最多就是8個Field，但我們目前就是溫度和濕度兩個值，所以就在Field1填寫「temperature」，在Field2填寫「humidity」這個所填寫的文字會顯示在圖上Y軸的左方，當然也可以直接填寫中文；也可以填寫一下「Description」說明這個channel是做什麼用的，另外下方有一個「Tags」有填寫在搜尋的地方才找得到，填寫完成後就點選下方的「Save Channel」\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQVEscMyURXtI4R%2FthingspeakChannels02.png?generation=1556903030053664\&alt=media)

接著就進入剛剛所建立的channel，會出現如下圖的畫面，上方有說明，功能列及圖表，分別為Field1(溫度temperature)，Field2(濕度humidity)，但目前是空的，所以沒有畫圖\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQXwc685zK7ej0O%2FthingspeakChannels03.png?generation=1556903030144622\&alt=media)

channel建立好了，接下來就是要傳送資料到這個channel，在功能列的地方，選「API Keys」，會看到Write API Keys及Read API Keys，右下角有一個「API Requests」區塊，已經提供可以馬上使用的API網址，就可以透過網址，填入key及field的值就可以把資料上傳，當然要上傳資料就要使用「Update a Channel Feed」這串網址「<https://api.thingspeak.com/update?api_key=Q8BGENDUC797GENI&field1=0> 」，另外這個key值非常重要，api只認key，不認使用者帳號，所以key值給了別人，就可以對該key值的channel做更新，如果要更換key值，只要在點選key值下方的「Generate) New ... API Key」就可以產生新的key值\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQZ4t0WUar26w8a%2FthingspeakChannels04.png?generation=1556903032032234\&alt=media)

接下來就在瀏覽器中直接執行下面的網址做測試，注意一下網址，有修改field1及field2及其後方的值

* 溫度(Field1)
* ```
  https://api.thingspeak.com/update?api_key=Q8BGENDUC797GENI&field1=30
  https://api.thingspeak.com/update?api_key=Q8BGENDUC797GENI&field1=40
  ```
* 濕度(Field2)
* ```
  https://api.thingspeak.com/update?api_key=Q8BGENDUC797GENI&field2=55
  https://api.thingspeak.com/update?api_key=Q8BGENDUC797GENI&field2=70
  ```

再回到所建立的channel首頁，就可以看到剛剛執行的update網址，已經把所設定的field1及field2值上傳，系統會自動畫出線圖，x軸就是上傳的時間，y軸就是上傳的值，如下圖\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQajkdWliT05xjL%2FthingspeakChannels06.png?generation=1556903031563917\&alt=media)

## 透過Python上傳到ThingSpeak

測試手動執行網址可以上傳到channl後，那接下來使用python把所取得的溫濕度上傳到ThingSpeak所建立的channel，接著把下方的程式碼複製到Raspberry Pi中，並且儲存成dht22.py，並加入可執行的權限

```
cd ~
nano dht22.py
chmod +x dht22.py
```

程式原始碼：

```
#!/usr/bin/python
import sys
import Adafruit_DHT
import httplib, urllib
import time

thingSpeakApiKey = "Q8BGENDUC797GENI"

def main():
    [temp,humidity] = dht22()
    params = urllib.urlencode({'field1': '{0:0.1f}'.format(temp), 'field2': '{0:0.1f}'.format(humidity), 'key': thingSpeakApiKey})
    post_to_thingspeak(params)


# Get Temperature,Humidity
def dht22():
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.AM2302,4)
    #humidity, temperature = Adafruit_DHT.read_retry(sensor,pin)

    if humidity is not None and temperature is not None:
        print('Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature,humidity))
        return(temperature,humidity)
    else:
        print('Failed to get reading. Try again!')
        return(0,0)


# Set ThingSpeak Connection
def post_to_thingspeak(payload):
    headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
    not_connected = 1
    while (not_connected):
        try:
            conn = httplib.HTTPConnection("api.thingspeak.com:80")
            conn.connect()
            not_connected = 0
        except (httplib.HTTPException, socket.error) as ex:
            print "Error: %s" % ex

    #time.sleep(10) # sleep 10 seconds
    conn.request("POST", "/update", payload, headers)
    response = conn.getresponse()
    #print( response.status, response.reason, payload, time.strftime("%c"))
    data = response.read()
    conn.close()

# end main
if __name__ == "__main__":
    sys.exit(main())
```

執行測試程式，執行指令`./dht22.py` 或 python dht22.py 就會出現如下的畫面

```
pi@raspberrypi:~ $ ./dht22.py
Temp=26.8* Humidity=90.9%
```

程式執行完後再回到ThingSpeak上所建立的channel，如下圖也新增了一筆剛剛執行dht22.py程式所上傳的資料，可以把滑鼠指標移到圓點上，會出現一個浮動訊息視窗，裡面顯示該點的時間及溫度或濕度\
![](https://326572801-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZQ-x81-SQ8XuBk9%2F-LdydabJht7DXYEyRYFn%2F-LdydiQczA1TmyVBUS0t%2Fthingspeak_python01.png?generation=1556903032016082\&alt=media)

## 定時執行

dht22.py程式只會執行一次後就結束程序，所以這邊透過設定crontab去定時執行dht22.py程式把資料傳送到ThingSpeak上，設定的方式很簡單執行以下的指令

```
sudo crontab -e
```

然後加入下面這一行指令後儲存，下面的設定是每10分鐘執行一次，如果要測試可以自已修改該數值

```
*/10 * * * *     /home/pi/dht22.py >/dev/null 2>&1
```

儲存後，再回到ThingSpeak上看channel內的溫濕度是否有新增資料
