ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【ESP32】data.sparkfun.comにESP32から値を送る方法

data.sparkfun.com公式

「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関数よりも前にエラーが出た関数を移動させるとコンパイルが通るという現象もあるようです。