九州・福岡・東京ときどきIoT

21年間のはてなダイアリー&アメブロからの避難所

Adafruit の IoT サービスについて

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.2 ダッシュボード(Dashboard

  • フィードの値を視覚的に表示・操作するためのインターフェース。
  • ウィジェット(グラフ、ゲージ、スイッチ、ボタン、マップ など)を使って、自由に構成できます。

2.3 API(MQTT / REST)

Adafruit IO は以下の2種類の API を提供します:

  • MQTT(推奨):軽量でIoTに適したプロトコル。ESP32などで使用するのに最適。
  • REST API:HTTPベースで、ブラウザやスクリプトからアクセス可能。

 

3. 使用例:ESP32とセンサーの連携

3.1 事前準備

  • Adafruit のアカウント作成
  • aio_keyAPIキー)と 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. ダッシュボードの使い方

  1. Adafruit IO にログイン
  2. 「Dashboards」→「Create a New Dashboard
  3. 任意のウィジェット(グラフ、スライダー、ボタンなど)を追加
  4. 対象の Feed に接続

 

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する

構成

  • ESP32 + LED(GPIO 2)
  • Adafruit IO 上にフィード led_control を作成
  • ダッシュボードに「Toggle(スイッチ)」ウィジェットを追加

 

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 ダッシュボードの設定手順

  1. Adafruit IO にログイン
  2. Dashboards > Create を選択
  3. ダッシュボードを開き、「+」を押して Toggle ウィジェットを追加
  4. フィードとして led_control を選択
  5. 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. トラブル対策のポイント

症状

原因・対策

接続しない

Wi-Fi SSID/パスワード、IOキー/ユーザー名の確認

ボタンが反応しない

フィード名が一致しているか確認

LEDが動作しない

GPIOピン番号と接続の確認

何も表示されない

Serial Monitor でログを確認、handleMessage() が呼ばれているか

 

 

もっと複雑な操作(PWM制御、複数デバイス制御など)

複数デバイス制御について詳解

 

複数のデバイス制御を 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_SSID "your_ssid"

#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 ダッシュボード設定

  1. Feed を 2つ作成:led1_controlled2_control
  2. ダッシュボードに 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

 

以上内容の動作の裏付けは取っていません。

自己責任で参考にしてください。