IoT開発(3)-ESP-WROOM-02でデータを送信

2021年6月12日

この記事は、下の記事からの続きです。
環境などのセットアップについては、これらのエントリを参考にしてください。

前回のエントリで、ArduinoプログラムをESP-WROOM-02に書き込み、センサーの値を読み取ることができるようになりました。
そこで今回は、「読み取ったセンサー値をネットワークに送信して見える化」します。

1.使用するセンサー

今回使用するセンサーは、前回同様「MDK001」です。
購入元はマルツさんでコチラです。
使用やサンプルコードは、コチラです。

※今回のエントリで使用するコードは、このコードを参考にしています。

2.「見える化」の準備

取得したセンサーの値の見える化は、IoTデータのグラフ化サービスであるAmbientを使用します。
過去のエントリでも、MDK001の値をAmbientを利用して見える化しています。
(本エントリと合わせて参照していただけたら幸いです。)
このエントリでは、MDK001をRaspberryPiに接続してデータを取得/送信しています。
今回は、Arduinoを使用しますので、改めてセットアップが必要です。
しかし、「セットアップ」とは言っても、Ambientのチュートリアルに必要な内容が全て記載されています。
このチュートリアルに記載されている手順に従って、ライブラリのインストールを行ってください。
それで、準備完了です。

3.配線

配線は、前回と全く同じです。
しかし念のため、下表にまとめておきます。

ESP-WROOM-02とMDK001の配線
ESP-WROOM-02 MDK001
3V3 VDD
IO14 SCL
IO12 SDO
IO13 SDI
GND CS
GND GND

4.プログラム

4.1.コード

使用するプログラムは、Ambientのチュートリアルと、前回のエントリ(http://wp.me/p5CywK-kR)で紹介したコードを合わせたものになります。
実際のコードは、下記の通り。

#include <SPI.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include "Ambient.h"

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

#define _DEBUG 1
#if _DEBUG
#define DBG(...) { Serial.print(__VA_ARGS__); }
#define DBGLED(...) { digitalWrite(__VA_ARGS__); }
#else
#define DBG(...)
#define DBGLED(...)
#endif /* _DBG */

#define LED 4
#define CS_E  15

const char* ssid = "xxxx";	//接続するAPのIDを設定して下さい。
const char* password = "yyyy";	//接続するAPのパスワードを設定して下さい。

unsigned int channelId = aaaa;	//AmbientのチャンネルIDを設定して下さい。
const char* writeKey = "bbbb";	//AmbientのチャンネルIDのライトキーを設定して下さい。

WiFiClient client;
Ambient ambient;

void setup()
{
    wifi_set_sleep_type(LIGHT_SLEEP_T);

#ifdef _DEBUG
    Serial.begin(115200);
    delay(20);
#endif
    DBG("Start");
    pinMode(LED, OUTPUT);

    WiFi.begin(ssid, password);

    int i = 0;
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);

        DBGLED(LED, i++ % 2);
        DBG(".");
    }

    DBGLED(LED, LOW);
    DBG("WiFi connected\r\n");
    DBG("IP address: ");
    DBG(WiFi.localIP());
    DBG("\r\n");

    ambient.begin(channelId, writeKey, &client);

    DBG("Set SPI to communicate with MDK001");
    DBG("\r\n");
    pinMode(CS_E, OUTPUT);
    digitalWrite(CS_E, HIGH);
    
    //Initialize SPI configuration.
    SPI.begin();
    SPI.setDataMode(SPI_MODE3);
    SPI.setBitOrder(MSBFIRST);
    SPI.setClockDivider(SPI_CLOCK_DIV8);
    
    digitalWrite(CS_E, LOW);
    SPI.transfer(0x54);
    
    delay(240);
}

void loop()
{
    DBGLED(LED, 1);
    uint16_t readVal = 0;
    float temp = 0;

    readVal = (uint16_t)SPI.transfer(0) << 8; //Upper 8bit.
    readVal = readVal | SPI.transfer(0);
    DBG("readVal = ");
    DBG(readVal, HEX);
    DBG("\r\n");

    readVal = readVal >> 3;

    if (0x1000 & readVal) {
    readVal = (uint32_t)readVal - 8192;
    }
    temp = ((float)readVal) / 16.0;
    
    ambient.set(1, temp);
    ambient.send();

    DBG("temperature = ");
    DBG(temp);
    DBG("\r\n");
    DBGLED(LED, 0);
    
    delay(3000);
}

4.2.プログラム内容

簡単ですが、プログラムの内容を解説します。
今回のプログラムで一番最初に気になるのが、setup()の先頭の下記コードかと思います。

wifi_set_sleep_type(LIGHT_SLEEP_T);

これはESP-WROOM-02、さらに言うとESP8266の消費電力モードを設定するコードです。
ココでは「LIGHT」としていますが、「DEEP…」というモードもあります。
今回の主題ではないので、ここでは割愛します。
次にWifiの設定です。
Wifiは、以下のコードで設定しています。

WiFi.begin(ssid, password);

int i = 0;
while (WiFi.status() != WL_CONNECTED) {
    delay(500);

    DBGLED(LED, i++ % 2);
    DBG(".");
}

接続するAP(wifiルーターとか)に、コードの先頭で指定したssid、およびそのパスワードを使用して接続します。
その後、接続が完了する、即ち状態が「WL_CONNECTED」になるまで待ちます。
このとき、デバッグのために、LEDが点滅します。
またシリアルモニターには、「.」(ドット)が出力され続けます。
接続が完了すれば、あとはMDK001/SPIの設定が行われます。
loop()では、MDK001の値を取得する部分は、これまでのプログラムと同じです。
異なるのは、下記の部分のみです。

ambient.set(1, temp);
ambient.send();

この処理で、MDK001から取得した値をambientに送信しています。

5.送信した結果

測定したデータを見える化した結果は、以下のようになります。
iot_develop_003_esp_wroom_02_001
はい。
気温が測定できています。

6.まとめ

今回のエントリで、測定したデータを無線でネットワークのサービスに送信、見える化できるようになりました。
色々な場所にセンサーを設置/データを測定して、その結果の「見える化」に挑戦していきます。

ではっ!

続きます

以下の記事に続きます。
こちらの記事も併せて読んでいただけると、幸いです。
IoT開発(4)-ESP-WROOM-02を電池で駆動
IoT開発(5)-ESP-WROOM-02をDeepSleepで長時間駆動させる