• conect+

Arduino互換ボードとconect+をWeb APIでつなげてみた!

最終更新: 2019年12月4日

こんにちは、conect+の中の人(エンジニア)です。 今回は、Web APIを使って、Arduino互換ボードとconect+をつないで、室内の温度監視を実現してみたいと思います。


(こちらの記事はWordファイルでもご確認頂けます)

システム構成

今回実現するシステムの構成は、下記のようになります。

準備

今回準備したものは以下になります。

・WiFi搭載Arduino互換ボード(ESP32-DevKitC ESP-WROOM-32開発ボード)

・温度センサー(アナログ・デバイセズ社製TMP36)

・ブレッドボード

・ジャンパーワイヤー

・Windows 10搭載パソコン(開発用)

※Arduinoスターターキットをお持ちの方は、キットに付属の温度センサー、ブレッドボード、ジャンパーワイヤーを使えます。

ボードの紹介

今回使用するボードのスペックです。対応無線規格

WiFi:802.11b / g / a

Bluetooth 4.2 ※技適取得済CPUTensilica LX6 240MHzメモリ520KB SRAMフラッシュメモリ4MB主なインターフェース

・静電容量タッチインターフェース(10点)

・32kHzオシレータ

・GPIO(21点)

・UART(3Ch)

・SPI(2Ch)

・I2S(2Ch)

・ADC(16Ch)

・DAC(2Ch)

・I2C(2Ch) ・SDIO:マスター/スレーブ電源

・5V(PCからのバスパワー給電) マイクロUSBケーブルで接続

このボードは秋月電子通商やAmazonから購入可能です。

手順

ソフトウェア開発環境準備

■Arduino IDEのインストール

Arduino互換ボードは、Arduino IDEを使ってプログラミングが可能です。

まずはArduino IDEのセットアップを行いましょう。

筆者の使用しているパソコンのOSはWindows 10です。

Windows 10環境の場合、UWP(Universal Windows Platform)版のArduino IDEをMicrosoft Storeからダウンロードできます。

Windows 10以外の環境の方は、Arduinoの公式Webサイト

https://www.arduino.cc/en/Main/Software

から、自分の環境にあったバージョンのIDEをダウンロードしてください。

■ESP32用の設定

Arduino IDEのインストールができたら、続いて使用するボード用の設定を行います。

①Arduino IDEを起動し、ファイルメニューから「環境設定」を選択します。

②設定タブの「追加のボードマネージャーのURL:」に以下の値を入力し、OKボタンをクリックします。

 https://dl.espressif.com/dl/package_esp32_index.json

③続いてツールメニューから、ボード→ボードマネージャーを選択します

④以下のようなダイアログが表示されます。リストの中の「esp32 by Espressif Systems」を見つけて、インストールボタンをクリックします。

⑤インストールが完了したら、再度ツールメニューを開き、ボード→ESP32 Dev Moduleを選択します。

■ボードとシリアル通信するためのドライバインストール

Arduino IDEで開発したプログラムをボードに送信するには、USB UARTドライバをインストールする必要があります。

以下のWebサイトから、お使いの開発用パソコン環境にあったものをダウンロードし、インストールしてください。

https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

温度センサーの接続

次に、ボードと温度センサーの配線を行います。

今回使用する温度センサーは、周りの温度に比例した電圧を出力します。温度センサーをボードのADC(AD変換器)に接続して、その電圧値を取得します。

以下のように配線を行います。今回はADCの0Chを使用します。



次回は conect+ の Web API、アプリ設定を行います。




第一回ではArduino IDEのセットアップから、温度センサーの接続までを行いました。

今回はconect+での設定方法についてお伝えします。

製品登録

conect+側の設定を行います。

基本的には以前の記事「Raspberry Piとconect+をWeb APIでつなげてみた!」で設定した内容と同じなので、簡単に説明します。

大きな違いは、センサーが温度センサーのみとなります。

まず、製品の追加を行います。

ブラウザでconect+のコンソールサイトにログイン後、クリエイトをクリックすると、現在のプロジェクトが表示されます。

「+」をクリックし、新規にプロジェクトを作成します。


以下のような画面が表示されるので、接続方法として「Web API」を選択し、製品名を入力後、「保存」をクリックします。


次に画像を設定します。画像タブを選択し、アイコン画像およびサムネイル画面として、ボードの画像を選択後、「保存」をクリックします。


次に、温度センサーの設定を行います。センサータブを選択し、「+」をクリックします。

以下のようなダイアログが表示されるので、キーとセンサー名称を入力し、追加ボタンをクリックします。

続いて、Web APIのアクセス情報を取得します。

プロジェクトリストで、登録した製品情報の編集ボタンをクリックし、表示されたメニューからWebAPIを選択します。


以下のような画面が表示されるので、APIキーを控えておきます。


続いて、計測データ保存APIタグをクリックします。

ボードからセンサーデータの値を送るためのURLが記載されています。また、Web APIで設定するリクエストデータのフォーマットも記載されているので、合わせて確認しておいてください。


次回は Arduino互換ボード側のプログラミングを行います。






第二回ではconect+での設定までを行いました。

今回はArduino互換ボード側のプログラミングを行っていきます。

ボード側プログラミング

■サーバー証明書の取得

HTTPSでWeb APIにアクセスした際に、接続先がconect+のサーバーかどうか確認するため、クライアント(ボード)側にルート証明書が必要になります。

今回は、開発用パソコンの中にある証明書を取得して、ボードで使用します。

Chromeを例に手順を説明します。

①ブラウザで「https://api.conect.plus/」にアクセスします。

②アドレス欄の鍵マークをクリックし、「証明書」を選択します。

③下記のようなダイアログが表示されるので、詳細タブを選択し、「ファイルにコピー」をクリックします。

④証明書のエクスポートウィザードが起動します。「次へ」をクリックしてください。

⑤「Base 64 encoded X.509(.CER)」を選択し、「次へ」をクリックしてください。

⑥ファイルの保存先を指定して、「次へ」をクリックしてください。

⑦完了をクリックしてください。証明書が出力されます。



■プログラム

ルート証明書を取得できたら、次にプログラミングを行います。

Arduino IDE上で、以下のようなコードを実装します。



#include <WiFi.h>

#include <HTTPClient.h>

#include <time.h>


const char* ssid = "SSID ";

const char* password = "PASSWORD";

const char* root_ca = \


"-----BEGIN CERTIFICATE-----\n" \

"MIIFZTCCBE2gAwIBAgIQDixaIIKJJdtB+UIs0ldeoTANBgkqhkiG9w0BAQsFADBG\n" \ "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg\n" \

"Q0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0xODA5MTUwMDAwMDBaFw0xOTEwMTUx\n" \

"MjAwMDBaMBoxGDAWBgNVBAMTD2FwaS5jb25lY3QucGx1czCCASIwDQYJKoZIhvcN\n" \

"AQEBBQADggEPADCCAQoCggEBANglfDUXK8cdi7c2yjTHb34V7g1pZQvmKzrlY2Gs\n" \

"70hQjZVm5Ek163X733gzk33Qv631OCEnhZtbuGJQ7dd+1uPUJLvVJZHDQrdFI4Lp\n" \

"pm/G08x/K8koywFf2JKQkw0V5S0013j/tBHW2tWrPuvKkXaNpayNqqCRHHdEPik/\n" \

"QOui6W8KQ3VdxQ9G5zloepuG7EiUTw9HO+uP6GczXa5lbxbOxdTMaIp3knOUoGA5\n" \

"2dyv2PIf8UJhFCJ2z7bJBtkk5f7kugRf2Pd/ZMW8J32f7QkNFjTY9lt4pWovDHiX\n" \

"+HXzal85hjuR5BemPk8S9wb7YHO7bUlveReJi7X9s9/y69cCAwEAAaOCAnkwggJ1\n" \

"MB8GA1UdIwQYMBaAFFmkZgZSoHuVkjyjlAcnlnRb+T3QMB0GA1UdDgQWBBQNDGMK\n" \

"aiAU5QSI2h+4c5AyyPq5kzAaBgNVHREEEzARgg9hcGkuY29uZWN0LnBsdXMwDgYD\n" \

"VR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjA7BgNV\n" \

"HR8ENDAyMDCgLqAshipodHRwOi8vY3JsLnNjYTFiLmFtYXpvbnRydXN0LmNvbS9z\n" \

"Y2ExYi5jcmwwIAYDVR0gBBkwFzALBglghkgBhv1sAQIwCAYGZ4EMAQIBMHUGCCsG\n" \

"AQUFBwEBBGkwZzAtBggrBgEFBQcwAYYhaHR0cDovL29jc3Auc2NhMWIuYW1hem9u\n" \

"dHJ1c3QuY29tMDYGCCsGAQUFBzAChipodHRwOi8vY3J0LnNjYTFiLmFtYXpvbnRy\n" \

"dXN0LmNvbS9zY2ExYi5jcnQwDAYDVR0TAQH/BAIwADCCAQIGCisGAQQB1nkCBAIE\n" \

"gfMEgfAA7gB1AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAABZdqj\n" \

"zmYAAAQDAEYwRAIgIFpoByHZImSkfYRGuCR84KNS6CWwH1A4RET4uso1lD0CIFrZ\n" \

"onblq2xKbk5uSz+bPNSutm7JXflz15X/F/WoH3GSAHUAh3W/51l8+IxDmV+9827/\n" \

"Vo1HVjb/SrVgwbTq/16ggw8AAAFl2qPPTAAABAMARjBEAiBTicLRGfJCVyISxE4R\n" \

"4KdZaoR1NRXOOmbqXJk7JAwLvgIgD44N4uuEh/ihpULn9v492RBeenbqOT/plMXD\n" \

"Z1rd2QswDQYJKoZIhvcNAQELBQADggEBACOnPLGoKHJIqf9RmIXJ4aBBL0KGe5Ws\n" \

"0ro0QneesZthr/7KVfEtTM80Er3etpI+WMPodtWTWQRP5jqHMOb/LeDoHw/hXjlH\n" \

"bQhHA1iQs6I6Hg2MSVMYYirpLpnyFMd8CZgqtICwfc1AOp4A6ts9b/7NtgjeIzCr\n" \

"K6llHJCf5xsaEIOct6V9cW/aQd86zy28b+/7YNCgYlYtLsBHGqcWiONRpKvDZAu4\n" \

"+Y0Mt8l4npggbzkQOBpGJoLZWXCIYhPY2AZKjTFBanuGrCwyECzAWsaEaESk41cL\n" \

"fmdHhlLSYOT/1JODzStpr7OYLKG70ewH/eZwiuMyeEHlVzwLhi5wkUQ=\n" \

"-----END CERTIFICATE-----\n";


void setup()

{


// シリアル通信の初期化処理

Serial.begin(115200);

delay(1000);


// WiFiの初期化処理

WiFi.begin(ssid, password);


// WiFi接続待ち処理

while (WiFi.status() != WL_CONNECTED)

{

delay(1000);

Serial.println("Connecting to WiFi..");

}

Serial.println("Connected to the WiFi network");


// 時刻同期処理

configTime( 0, 0, "ntp.nict.jp");

delay(1000);

}


void loop()

{

time_t t;

struct tm *tm;

char time_data[20];

char send_data[256];

int senser_val = 0;

float volt = 0.0;

float temp = 0.0;


// WiFi接続確認

if ((WiFi.status() == WL_CONNECTED))

{


// Web API処理

HTTPClient http;


// URLの設定

http.begin("https://api.conect.plus/v1/XXXXXXXXXXXXXXXXXXXXX/data", root_ca);


//content-typeの設定(JSON)

http.addHeader("Content-Type", "application/json");



// 現在時刻を取得(UTC)

t = time(NULL);

tm = localtime(&t);

sprintf(time_data, "%04d-%02d-%02d %02d:%02d:%02d",

tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,

tm->tm_hour, tm->tm_min, tm->tm_sec);


// ADC Ch0から温度センサーの出力電圧を取得

senser_val = analogRead(A0);

volt = ((float)senser_val / 4096.0) * 5.0;

temp = (volt - 0.5) * 100.0;


// 送信データ生成

sprintf(send_data, "{\"deviceName\": \"ROOM01 Monitor\",\"key\": \"temperature\","\

"\"sensingAt\": \"%s\"," \

"\"value1\": %.1f}", time_data, temp);

Serial.println(send_data);


// Web API呼び出し(POST)

int httpCode = http.POST(send_data);


// ステータスの確認

if (httpCode > 0)

{

String payload = http.getString();

Serial.println(httpCode);

Serial.println(payload);

}

else

{

Serial.println("Error on HTTP request");

}


// リソースの解放

http.end();

}


delay(10000);

}



※プログラムの解説

・変数ssidとpasswordに、実行環境の無線LAN情報を設定してください

・変数root_caに、前章で取得したルート証明書をテキストエディタで開き、転記します。


・関数setup()は、起動時に一回呼ばれます。ここで必要な初期化処理を行っていきます。


 今回は、以下の処理を行っています。

 シリアル通信の初期化処理(デバッグ出力用)

            WiFi接続処理

            WiFi接続完了待ち処理

 時刻同期処理(ntpサーバーに時刻を問合せ、ボードに設定します)


・関数loop()は、その名の通りボードが起動している間、繰り返し呼び出される処理です。

ここで、実現したい処理を記述します。今回は、以下の処理を行っています。

-----

WiFiの接続確認

Web APIとしてアクセスするURLの設定(Web API設定で確認したURLを設定)

Content-Typeの設定(Conect+のWeb APIでは、データはJSON形式なので、JSONを指定)

現在時刻を取得(タイムゾーンはUTCです)

ADCのCh0から、温度センサーの出力電圧を取得して、温度(℃)に変換

送信データを作成

  • deviceName: デバイス名を指定。今回は、"ROOM01 Monitor"としています。

  • key : conect+ のセンサー設定で登録したキー” temperature”を指定しています。

  • sensingAt : 計測日時をUTCで指定します。

  • value1 :温度センサーで計測した値を指定しています(小数点一桁まで)。


 Web API呼び出し(POST)

リソースの解放

-----


※温度センサーの出力電圧は0℃の時0.5Vで、1℃ごとに10mV上がります。また、ADCの分解能は12bitです。

次回はプログラムを動かして、動作確認を行います。



第三回ではArduino互換ボード側のプログラミングまでを行いました。

今回は実際にプログラムを動かして、conect+ APIの動作を確認していきます。

■実行

作成したプログラムをコンパイルして、実機に転送し、実行します。

①プログラムを検証・コンパイルします。


②ボードとパソコンをUSBケーブルで接続します。

③Arduino IDEのツールメニューから、ボードが接続されているシリアルポートを選択します。


④ボードにプログラムを転送します。



⑤ボードを再起動させます。

⑥Arduino IDEのツールメニューからシリアルモニタを起動します。

⑦実行状況がモニタに出力されることを確認します。


⑧スマートフォンの画面でも確認してみます。iPhoneのconect+アプリを起動し、ログインします。

 ガジェット「ESP32-WROOM-32」を追加します。

 デバイスIDに「ROOM01 Monitor」を設定してください。

 10秒ごとに更新される温度センサーのデータが表示されます。

以上、Arudino互換ボードとconect+との連携方法を解説いたしました。

Arduino IDEでも、簡単にconect+のWeb APIと接続するプログラムが作成できます。

スマートフォンのIoTアプリも、とてもカッコいいUIが生成できます。

PoCだけでなく、実際の事業で使えるレベルのシステムが、簡単に素早く構築できるのが特徴です。

まずは是非一度conect+をお試しください!

719回の閲覧
 

conect.plus Corp. - IoT Data Design

 SB Innoventure / SoftBank Group

東京都港区東新橋1-9-2 汐留住友ビル27階

購読登録フォーム

  • Google Places
  • Facebook

© conect.plus Corp. All Rights Reserved.