Adafruit の IoT サービスには主に Adafruit IO があります。以下はその概要です。
Adafruit IO 概要
Adafruit IO は、IoT(モノのインターネット)向けに提供されているクラウドベースのサービスで、センサーやデバイスからのデータを可視化・管理したり、外部から制御したりすることができます。
主な特徴
- データの可視化: ダッシュボードでグラフ、ゲージ、ボタンなどのウィジェットを使ってデータを視覚的に表示可能。
- MQTT / REST API 対応: 標準プロトコルを使って簡単にデバイスと通信可能。
- デバイスの制御: ボタンやスイッチウィジェットを使って遠隔からデバイス制御。
- IFTTTとの連携: 条件に応じて他のサービスと連携。
- 無料プランあり: プロトタイピングに十分な無料プランを提供(データ保持期間・フィード数に制限あり)。
使用例
- ESP32 や Raspberry Pi でセンサー値(温度・湿度など)を送信し、Adafruit IO でグラフ化。
- Web ブラウザからLEDをオンオフ。
- スケジュールに従って自動操作(例えば毎朝ライトをオン)。
料金プラン
- 無料プラン:
- 30日間のデータ保存
- 最大10フィード、5ダッシュボード
- 有料プラン(Adafruit IO+):
- より多くのフィードやデータ保存期間
- 商用プロジェクトや大規模な用途向け
ESP32などでの実装も非常に簡単で、Arduinoライブラリも公式で用意されています。
Adafruit IO 詳解
では、Adafruit IO についてさらに詳しく解説します。構成として以下のように整理します:
1. Adafruit IO とは?
Adafruit IO は、アメリカの電子工作メーカー Adafruit が提供する、IoT デバイス向けのクラウドプラットフォームです。センサーなどから取得したデータをオンラインで可視化・保存・共有でき、さらにデバイスの遠隔操作も可能です。
個人の電子工作から小規模なIoTシステムまで幅広く対応でき、ESP32 などのマイコンとも非常に親和性が高いです。
2. 機能詳細
2.1 フィード(Feed)
- データの単位。温度、湿度、スイッチなど個別の値を送信・保存する単位です。
- 各フィードは名前で識別され、センサーの値やユーザー操作の値などが記録されます。
- フィードの値を視覚的に表示・操作するためのインターフェース。
- ウィジェット(グラフ、ゲージ、スイッチ、ボタン、マップ など)を使って、自由に構成できます。
2.3 API(MQTT / REST)
Adafruit IO は以下の2種類の API を提供します:
3. 使用例:ESP32とセンサーの連携
3.1 事前準備
- Adafruit のアカウント作成
- aio_key(APIキー)と username の取得
- Arduino IDE で ESP32 開発環境を構築
- Adafruit MQTT Library または Adafruit IO Arduino Library をインストール
3.2 ESP32 スケッチ例(MQTT経由)
cpp
コピーする編集する
#include "WiFi.h"
#include "AdafruitIO_WiFi.h"
// Adafruit IO 認証情報
#define IO_USERNAME "your_username"
#define IO_KEY "your_aio_key"
// WiFi 設定
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASS "your_wifi_password"
// Adafruit IO接続のインスタンス生成
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
// フィードの設定
AdafruitIO_Feed *temperature = io.feed("temperature");
void setup() {
Serial.begin(115200);
io.connect();
while(io.status() < AIO_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to Adafruit IO!");
}
void loop() {
io.run();
float temp = analogRead(34) * (3.3 / 4095) * 100; // 仮の温度換算
temperature->save(temp);
delay(10000);
}
このコードでは、ESP32が10秒ごとにアナログ入力(GPIO 34)から読み取った値を温度に変換し、Adafruit IOの temperature フィードに送信します。
4. ダッシュボードの使い方
5. IFTTTやWebhookとの連携
Adafruit IO は外部サービスとも連携可能です:
- IFTTT 連携:例えば、気温が一定以上であればメール送信など。
- Webhook:Adafruit IO で受け取ったデータを別のWebサービスに送ることが可能。
6. プランと制限
|
プラン |
無料 |
Adafruit IO+(有料) |
|
フィード数 |
10 |
無制限 |
|
ダッシュボード |
5 |
無制限 |
|
データ保存 |
30日 |
無制限(または長期) |
|
更新頻度 |
1分ごと(制限あり) |
より短い間隔での更新可能 |
7. 長所と短所
長所
- 初心者にもわかりやすいUI
- Arduino/ESP32との親和性
- MQTT対応でリアルタイム処理に強い
- 無料でもある程度のプロジェクトが可能
短所
- 大量のデバイスには無料枠が足りない
- 商用利用には制限あり(要有料プラン)
デバイスの遠隔操作の例
ESP32 などのマイコンを Adafruit IO 経由で「遠隔操作」するには、以下のような仕組みを使います:
1. 基本的な考え方
- Adafruit IO 上で「フィード(Feed)」を作成。
- ダッシュボードに「ボタン」や「スイッチ」などのウィジェットを配置。
- ESP32 から Adafruit IO に接続し、フィードの状態を監視(handleMessage())。
- ボタンが押されたら、ESP32 がそれを検知して、LED やリレーなどを操作。
2. 実例:ボタンでLEDをON/OFFする
構成
2.1 Arduino スケッチ
cpp
コピーする編集する
#include "WiFi.h"
#include "AdafruitIO_WiFi.h"
// WiFi設定
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASS "your_wifi_password"
// Adafruit IOの認証情報
#define IO_USERNAME "your_username"
#define IO_KEY "your_aio_key"
// Adafruit IO接続用オブジェクト
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
// フィード定義(ON/OFFの信号を受け取る)
AdafruitIO_Feed *ledControl = io.feed("led_control");
// GPIO番号
#define LED_PIN 2
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
// 接続開始
io.connect();
// フィードにコールバック関数を登録
ledControl->onMessage(handleMessage);
// 接続完了待ち
while(io.status() < AIO_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to Adafruit IO");
// コールバック処理の有効化
ledControl->get();
}
void loop() {
io.run(); // Adafruit IOの通信処理
}
// ボタンの状態が変わったときに呼ばれる関数
void handleMessage(AdafruitIO_Data *data) {
Serial.print("Received: ");
Serial.println(data->value());
if (data->toPinLevel() == HIGH) {
digitalWrite(LED_PIN, HIGH); // ON
} else {
digitalWrite(LED_PIN, LOW); // OFF
}
}
2.2 ダッシュボードの設定手順
- Adafruit IO にログイン
- Dashboards > Create を選択
- ダッシュボードを開き、「+」を押して Toggle ウィジェットを追加
- フィードとして led_control を選択
- ON→「1」、OFF→「0」などに設定
3. 仕組みの解説
- Adafruit IO にあるフィード led_control は、ボタンのON/OFFに応じて「1」または「0」の値を持ちます。
- ESP32 側では、その値を MQTT 経由で常時監視していて、値が変化したときに handleMessage() が呼ばれます。
- data->toPinLevel() は、フィードの値を HIGH or LOW に変換してくれる便利関数です。
4. 応用例
- リレーをON/OFFして家電を操作
- サーボモーターの角度をスライダーで制御
- スケジュール操作:Adafruit IO + IFTTTで定時にトリガー
5. トラブル対策のポイント
|
症状 |
原因・対策 |
|
接続しない |
|
|
ボタンが反応しない |
フィード名が一致しているか確認 |
|
LEDが動作しない |
GPIOピン番号と接続の確認 |
|
何も表示されない |
Serial Monitor でログを確認、handleMessage() が呼ばれているか |
複数デバイス制御について詳解
複数のデバイス制御を Adafruit IO 経由で行う場合、1つのESP32で複数のデバイスを制御する方法と、複数のESP32などのマイコンを別々に制御する方法の2通りがあります。それぞれ詳しく解説します。
1. 1つのESP32で複数デバイスを制御する方法
構成例
- GPIO 2 → LED 1
- GPIO 4 → LED 2
- Adafruit IO 上のフィード:led1_control, led2_control
スケッチ例(Arduino)
cpp
コピーする編集する
#include "WiFi.h"
#include "AdafruitIO_WiFi.h"
// WiFi & Adafruit IO 設定
#define WIFI_PASS "your_pass"
#define IO_USERNAME "your_username"
#define IO_KEY "your_aio_key"
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
// フィード定義
AdafruitIO_Feed *led1Feed = io.feed("led1_control");
AdafruitIO_Feed *led2Feed = io.feed("led2_control");
#define LED1_PIN 2
#define LED2_PIN 4
void setup() {
Serial.begin(115200);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
io.connect();
// フィードへのコールバック設定
led1Feed->onMessage(handleLed1);
led2Feed->onMessage(handleLed2);
while(io.status() < AIO_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected!");
led1Feed->get(); // 初期状態の取得
led2Feed->get();
}
void loop() {
io.run();
}
// フィードごとの処理
void handleLed1(AdafruitIO_Data *data) {
digitalWrite(LED1_PIN, data->toPinLevel());
Serial.print("LED1: ");
Serial.println(data->value());
}
void handleLed2(AdafruitIO_Data *data) {
digitalWrite(LED2_PIN, data->toPinLevel());
Serial.print("LED2: ");
Serial.println(data->value());
}
Adafruit IO ダッシュボード設定
- Feed を 2つ作成:led1_control、led2_control
- ダッシュボードに Toggle ボタンを2つ追加し、それぞれのフィードに割り当て
2. 複数のESP32を別々に制御する方法(マルチデバイス)
構成例
- ESP32-A:GPIO 2 → LED A(Feed: led_a)
- ESP32-B:GPIO 2 → LED B(Feed: led_b)
Adafruit IO のアカウントは共通でも、それぞれのESP32は別のフィードを監視・操作します。
ESP32-Aのコード(略)
cpp
コピーする編集する
AdafruitIO_Feed *ledFeed = io.feed("led_a");
// handleLedA()
ESP32-Bのコード(略)
cpp
コピーする編集する
AdafruitIO_Feed *ledFeed = io.feed("led_b");
// handleLedB()
ダッシュボード
それぞれのフィードを個別のトグルスイッチで制御可能。
1つのダッシュボードにまとめても、デバイス単位に分けてもOK。
3. 複雑な制御の例
3.1 スライダーでPWM制御
- Feed: pwm_level
- ESP32 側で analogWrite(または ledcWrite)でLEDの明るさ制御
- ウィジェット:スライダー(0〜255)
3.2 スケジュール制御
- Adafruit IO + IFTTT
- たとえば「毎日朝7時にフィード water_pump に 1 を送信」
- ESP32 がその値を受け取って動作開始
4. 注意点・ベストプラクティス
|
項目 |
推奨設定・対策 |
|
フィード命名 |
デバイスごとに一意に。例:dev1_led, dev2_motor |
|
通信量の最適化 |
必要なときだけ save() する(節約 & レスポンス向上) |
|
通信安定性 |
io.run() を loop() 内で毎回呼び出す |
|
再接続処理 |
if(io.status() != AIO_CONNECTED) io.connect(); で再接続処理を入れてもOK |
以上内容の動作の裏付けは取っていません。
自己責任で参考にしてください。