前回「ESP8266モジュール(ESP-WROOM-02)を試す その32 Arduino IDE – ThingSpeakを使ってみる -」では、とりあえず手持ちのDHT11を使い、ここにあったスケッチの必要な部分だけを書き変えてそのまま使ってみた。
今回は、ThingSpeakへのデータ送信の部分を自由に使えるようにするため、コードを眺めてみた。
例として、サイン・カーブを描かせるようにデータを送る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include <ESP8266WiFi.h> //Replace with Your apiKey of Your Channel String apiKey = "##########"; const char* ssid = "########"; const char* password = "########"; const char* server = "api.thingspeak.com"; WiFiClient client; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); } float h = 0; float deg = 0; void loop() { h = sin(deg * 3.14 / 180); if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com String postStr = apiKey; postStr +="&field1="; postStr += String(h); postStr += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); Serial.print("Degree: "); Serial.print(deg); Serial.print(" Value: "); Serial.print(h); } client.stop(); Serial.println(" Waiting..."); // thingspeak needs minimum 15 sec delay between updates delay(20000); deg = deg + 10; if(deg > 350) deg = 0; } |
多少怪しかったりスマートでない部分もあるかもしれないが、一応こんな感じに送信できた。
ここにある Arduino + Ethernet Shield 用のスケッチをESP8266用に手直しするということだ。
コードを少しずつ見ていく。
この部分(1~11行)は特に問題は無い。
ThingSpeakで生成されるapiKey、ルータに接続する際のIDとPasswordを自分の環境に応じて書き変えるだけ。
モザイクがかけてある部分だ。
13~31行のvoid setup(){}は、Wi-Fiに接続する部分とその経過をシリアル・モニターに表示する部分だ。
表示するメッセージを好みで直す以外は、それこそ全く変更する部分がない。
背景が水色になっている部分は変更が無いところ。
実際にデータを送る部分だが、ある意味決まり文句なので逆にいじる部分は無い。
(1)hはsinの計算値を入れる変数、degは角度を0~360の間でループさせる変数だ。
弧度法から遠ざかっているので、わかりやすいように360度の度数法でやってみようとしたためだが、良かったのか悪かったのか不明だ。
(2)degをラジアンに直してからsin()に代入してhを計算している。
(3)ここがデータを送るための文字列postStrを用意している部分だ。
1件なのでこうなっているが、2件なら以下のように
1 2 3 4 5 6 |
String postStr = apiKey; postStr +="&field1="; postStr += String(a); postStr +="&field2="; postStr += String(b); postStr += "\r\n\r\n"; |
4件なら以下のように書くのだと思う。
1 2 3 4 5 6 7 8 9 10 |
String postStr = apiKey; postStr +="&field1="; postStr += String(a); postStr +="&field2="; postStr += String(b); postStr +="&field3="; postStr += String(c); postStr +="&field4="; postStr += String(d); postStr += "\r\n\r\n"; |
(4)はシリアル・モニターへの出力だから好みで変えればいい。
64行のdelayは、あまり短い間隔でデータを送ってはいけないということなのか、15秒は空けろと注釈にはあるが、20秒に設定してあったのでそのままにしてある。
ThingSpeakでインターバルについて調べるとここに
API Rate Limits
You can update a ThingSpeak channel every 15 seconds. Updating more frequently results in an error.
と書いてあった。
(5)が角度の値をループさせる部分。
10度ずつ増やしていって、350度の次は0度にし、これを繰り返す。
同様に、cos、tanのグラフも描かせてみた。
ざっと眺めてみたが、特に問題になるような点も無く、別のセンサーとかに変わっても送るべきデータさえ用意されれば十分使えそうな気がする。
ESP8266関連記事一覧へ