「data.sparkfun.com」というIoT用の無料で使えるサイトを知ったのでESP32から値を送ってみました。今回はその方法をまとめていきます。
1:data.sparkfun.comでストリームを作成する
data.sparkfun.comにアクセスし、createボタンを押します。移動先のページで各項目を入力することで値を送るストリームを作成できます。
項目名 | 内容 | 必須 |
---|---|---|
Title | 作成するストリームのページに表示されるタイトル | ◯ |
Description | 作成するストリームのページの表示される詳細な説明 | ◯ |
Show in Public Stream List? | Visibleの場合は全体リストに公開、Hiddenの場合は非公開 | ◯ |
Fields | 値を受け取る変数名 | ◯ |
Stream Alias | エイリアスの設定。sensorと入力するとhttp://data.sparkfun.com/sensorでアクセスできる | × |
Tags | タグの設定 | × |
Location | 場所の設定 | × |
上記の入力が終了しSaveボタンを押すと、必要なキーや値を送る例を表示したページに移動します。各値は忘れないようにメモしておきます。
ちなみに各項目の内容は以下の通りです。
項目名 | 内容 |
---|---|
Public URL | 作成されたストリームのURL。ここで送られた値を確認する |
Public Key | ストリームからデータを取り出す時に必要なキー |
Private Key | ストリームにデータを送る時に必要なキー |
Delete Key | ストリームを削除する時に必要なキー |
Format | ストリームにデータを送る時のフォーマット |
Example | Formatに合わせた具体例 |
2:ESP32をネット接続してストリームに値を送信する
1でストリームが完成したら、FormatにしたがってESP32からネット経由で値を送信します。具体的にはESP32に以下のソースを書き込めば実現できます。
・Sparkfun.ino
#include <WiFi.h> const char* ssid = "***"; // インターネットに接続できるWiFiのSSID const char* password = "***"; // SSIDのパスワード const char* publicKey = "*****"; // ストリーム作成時に払い出されたPublic Key const char* privateKey = "*****"; // ストリーム作成時に払い出されたPrivate Key const char* fields = "field"; // ストリーム作成時に設定したFields const char* host = "data.sparkfun.com"; // host WiFiClient client; void setup() { Serial.begin(115200); // WiFiに接続 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); } Serial.print("Connected to "); Serial.println(ssid); if (client.connect(host, 80)) { int val = 100; // 今回は100という数値を送信 // Formatに合わせたURLを作成 String url = String("/input/") + publicKey + "?private_key=" + privateKey + "&" + fields + "=" + val; // URLを発行 client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n\r\n"); delay(1000); while (client.available()) { Serial.print(client.readStringUntil('¥r')); // 結果のhtmlを表示 } } else { Serial.println("Connection failed!"); } } void loop() { }
WiFiに接続した後に100という値を送信するURLを作成し発行します。その結果のhtmlをシリアルモニタに表示させています。
以上の方法で値をストリームに送信できます。ストリームから値を取得したり削除したりはまだ試していませんが、いわゆるIoTっぽいことがこれでできるようになります。ストリームを使って色々値のやりとりできたら楽しいですね。
※追記:ストリームからの値取得
ストリームからの値を取得することもできたので修正したソースを追記しておきます。
・Sparkfun2.ino
#include <WiFi.h> const char* ssid = "****"; const char* password = "****"; const char* publicKey = "*****"; const char* privateKey = "*****"; const char* fields = "field"; const char* host = "data.sparkfun.com"; WiFiClient client; // 引数の値を送信する関数(全角文字はストリームに送信できない。失敗する) void sendDataToSparkfun(String val) { String url = String("/input/") + publicKey + "?private_key=" + privateKey + "&" + fields + "=" + val; client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n\r\n"); // 結果を表示 while (client.available()) { Serial.print(client.readStringUntil('¥r')); } } // ストリームの値を取得する関数 void getDataFromSparkfun() { String url = String("/output/") + publicKey + ".csv?page=1"; client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n\r\n"); // 結果を表示 while (client.available()) { Serial.print(client.readStringUntil('¥r')); } } void setup() { Serial.begin(115200); // WiFiに接続 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); } Serial.print("Connected to "); Serial.println(ssid); if (client.connect(host, 80)) { String value = "1111"; // 1111を送信 sendDataToSparkfun(value); delay(1000); getDataFromSparkfun(); } else { Serial.println("Connection failed!"); } } void loop() { }
※Arduino IDEでのコンパイル時に特におかしなところがないのに「"関数名" was not declared in this scope」というエラーが発生した場合、setup関数よりも前にエラーが出た関数を移動させるとコンパイルが通るという現象もあるようです。