LoginSignup
5
1

More than 5 years have passed since last update.

ESPr × Milkcocoa for Arduino SDK

Last updated at Posted at 2016-12-25

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

ESPr × Milkcocoa for Arduino SDK

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

今年の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との相性は抜群です。

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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1