ESPr × Milkcocoa for Arduino SDK


この記事は、Milkcocoa Advent Calendar 2016 17日目の記事です。枠が空いてしまったので、遅ればせながら書かせて頂きます。🙇

ESPr × Milkcocoa for Arduino SDK

11月に明星和楽というITフェスティバルで、アートをテーマにしたIoTの展示を行いました。

今年のMashupAwardsにもエントリーさせて頂きました。
http://hacklog.jp/works/49919

展示物には、ESPr Developer(ESP-WROOM-02開発ボード)を使用しているのですが、ESPrにはArduinoのスケッチを直接書き込むことができます。
つまり、MilkcocoaのArduinoSDKを使ったスケッチをそのまま流用することが可能です。

サンプルコード

動作としては、

  • ESPrでWiFiに接続する
  • Milkcocoaへのデータpushをonpush()で監視して、処理を行う

という簡単なものです。
setColor周りは、作成したIoTデバイスのLED色を変える処理です。(今回は詳細割愛します。)

実際はArduinoIDEで作成したファイルなので拡張子が.inoですが、コードハイライト有効化のため.cで記載しています。

sample.c
#include <Milkcocoa.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Adafruit_NeoPixel.h>

#define MILKCOCOA_APP_ID    "<your-milkcocoa-app-id>"
#define MILKCOCOA_DATASTORE_NETWORK "network_status"
#define MILKCOCOA_DATASTORE_COLOR "color"
#define MILKCOCOA_SERVERPORT    1883
#define MAX_VAL 64 // 0 to 255 for brightness

const char* ssid = "<your-wifi-ssid>";
const char* password = "<your-wifi-password>";
const char MQTT_SERVER[] PROGMEM    = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM  = __TIME__ MILKCOCOA_APP_ID;
boolean connectedStatus = false;
int colorCode = 1;

WiFiServer server(80);
WiFiClient client;
Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);
Adafruit_NeoPixel pixel = Adafruit_NeoPixel(60, 12, NEO_GRB + NEO_KHZ800);

extern "C" {
    #include "user_interface.h"
}

void onpush(DataElement *elem);
void setup() {
    Serial.begin(115200);

    // Connect to WiFi network
    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");

    // Start the server
    server.begin();
    Serial.println("Server started");

    // Print the IP address
    Serial.println(WiFi.localIP());

    pixel.begin();
    pixel.show(); // Initialize all pixels to 'off'

    // Milkcocoa
    milkcocoa.on(MILKCOCOA_DATASTORE_COLOR, "push", onpush);
}

void loop() {
    if (!connectedStatus) {
        milkcocoa.loop();
        DataElement elem = DataElement();
        elem.setValue("status", "connected");
        milkcocoa.push(MILKCOCOA_DATASTORE_NETWORK, &elem);
        connectedStatus = true;
    }
    milkcocoa.loop();
}

void onpush(DataElement *elem) {
    Serial.println(elem->getInt("colorCode"));
    colorCode = elem->getInt("colorCode");
    setColor(colorCode);
}

void setColor(uint16_t colorCode) {
    uint16_t i;
    switch (colorCode) {
        case 1:
            // red
            for (i=0; i<pixel.numPixels(); i++) {
                pixel.setPixelColor(i, pixel.Color(MAX_VAL, 0, 0));
                pixel.show();
            }
            break;
        case 2:
            // green
            for (i=0; i<pixel.numPixels(); i++) {
                pixel.setPixelColor(i, pixel.Color(0, MAX_VAL, 0));
                pixel.show();
            }
            break;
        case 3:
            // blue
            for (i=0; i<pixel.numPixels(); i++) {
                pixel.setPixelColor(i, pixel.Color(0, 0, MAX_VAL));
                pixel.show();
            }
            break;
    }
}

まとめ

Arduino系のIoTボードでは、SDKのおかげで簡単にMilkcocoaを使うことができます。ESPrはWiFiさえあればそれ単体でネットワークに接続可能なので、Milkcocoaとの相性は抜群です。

こちらの発表資料にも概要を載せてありますので、興味ある方はぜひご参照ください。