早押しボタン!最新IoTチップESP32とAmbientで遊んでみよう

ストップウォッチを使ってゲーム遊びをした経験。ありますよね。
STARTとSTOPをいかに短い期間に押すかという単純なゲームです。
今日は最新のIoTチップESP32を搭載したESP-WROOM-32を使用し、早押しゲームを行ってみました。結果はIoTセンサ用のクラウドサービスAmbientへ送信します。教室などで多人数で競えば、楽しいかもしれません。
公開中

作り方

Espressifの最新チップESP32が実装されたESP-WROOM-32モジュールのGPIO 0にプッシュスイッチを接続します。論理は押下時にLOWレベルになるようにします。既にファームウェア書き換え用にスイッチを接続している場合が多いでしょう。
次にArduino IDEをセットアップします。Windowsをお使いの場合は、下記を参照してください。
Arduino IDEでESP32(ESP-WROOM-32)を使用する方法
下記はスケッチです。スケッチの作成に当たり、Ambientのライブラリを参考にしました。2016年12月23日現在、ESP32用のライブラリarduino-esp32がサポートしているWi-Fi用コマンドが限られていますので、一部の処理を省略し、作成し直しました。
スケッチのSSIDとPASSの部分をお手持ちの無線LANアクセスポイントに合わせて設定し、Ambient(https://ambidata.io/)から取得したチャネルIDとライトキーをそれぞれAmbientChannelId とAmbientWriteKey に記入し、ESPモジュールへ書き込みます。
私が公開しているチャンネルID 725のライトキーをお教えすることも可能です。試していただける方は、ぜひFacebookから連絡ください。
Facebook
ESP32用スイッチ早押し ~ボタンを2回押したときの速度をAmbientへ送信する~
#include <WiFi.h>                           // ESP32用WiFiライブラリ
#define PIN_LED 2                           // IO 2 にLEDを接続
#define PIN_SW 0                            // IO 0 にスイッチを接続
#define AmbientChannelId 725                // チャネルID(整数)
#define AmbientWriteKey "xxxxxxxxxxxxxxxx"  // ライトキー(16桁の16進数)
#define SSID "1234ABCD"                     // 無線LANアクセスポイントのSSID
#define PASS "password"                     // パスワード
#define HOST "54.65.206.59"
void setup(){
    pinMode(PIN_LED,OUTPUT);
    pinMode(PIN_SW,INPUT_PULLUP);
    Serial.begin(9600);
    Serial.println("Example Ambient SW");
    WiFi.mode(WIFI_STA);
    WiFi.begin(SSID,PASS);
    while(WiFi.status() != WL_CONNECTED){
        delay(500);
        Serial.print('.');
    }Serial.println();
    Serial.println(WiFi.localIP());
}
void loop(){
    WiFiClient client;
    unsigned long t0,t1;
    char s[64],data[64],http[384];
    while(digitalRead(PIN_SW));
    t0=millis();
    while(!digitalRead(PIN_SW));
    digitalWrite(PIN_LED,HIGH);
    delay(8);
    while(digitalRead(PIN_SW));
    t1=millis();
    delay(100);
    while(!digitalRead(PIN_SW));
    dtostrf(1000.L/(double)(t1-t0),5,2,s);
    sprintf(data,"{\"writeKey\":\"%s\",\"d1\":\"%s\"}",AmbientWriteKey,s);
    Serial.print(s);
    Serial.println(" Hz");
    if(!client.connect(HOST,80)){
        Serial.println("connection failed");
        return;
    }
    sprintf(http,"POST /api/v2/channels/%d/data HTTP/1.0\r\n",AmbientChannelId);
    sprintf(s,"Host: %s\r\n",HOST);
    strcat(http,s);
    sprintf(s,"Content-Length: %d\r\n",strlen(data));
    strcat(http,s);
    strcat(http,"Content-Type: application/json\r\n");
    strcat(http,"\r\n");
    strcat(http,data);
    client.print(http);
    delay(30);
    client.stop();
    digitalWrite(PIN_LED,LOW);
}
ボクにもわかるESPモジュール
https://bokunimo.net/blog/category/esp/
by ボクにもわかる電子工作
https://bokunimo.net/