Arduino MKR1000 + DHT11 で MQTT IoT デモ - Samsung ARTIK Cloud連携
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino MKR1000(Wi-Fi内蔵) | 2 |
| DHT11 温湿度センサー(4ピン) | 1 |
| LED(赤・黄等、アクチュエーター模擬用) | 2 |
使用アプリ・オンラインサービス
- Arduino IDE
- Samsung ARTIK Cloud for IoT(※現在サービス終了、代替: ThingsBoard, AWS IoT, Azure IoT 等)
- ライブラリ:
WiFi101,MQTT(Joel Gaehwiler版),ArduinoJson
プロジェクト概要
2台のArduino MKR1000を用い、一方をDHT11センサー搭載の「送信デバイス」、もう一方をLED搭載の「受信/アクチュエーターデバイス」として、Samsung ARTIK CloudのMQTTブローカー経由で連携させるデモです。送信側が温湿度を定期的にパブリッシュし、ARTIK Cloudのルールエンジンで閾値判定を行い、受信側へアクション(LED点灯/消灯)をコマンド送信します。※ARTIK Cloudは2020年にサービス終了していますが、アーキテクチャは汎用MQTTブローカー(Mosquitto, EMQX, AWS IoT Core等)へ容易に移植可能です。
Arduino IDE セットアップ
ライブラリマネージャから以下をインストール:
WiFi101(MKR1000用Wi-Fiドライバー)MQTTby Joel Gaehwiler(軽量MQTTクライアント)ArduinoJson(JSONシリアライズ/パース)
送信側:DHT11 センサーデバイス設定
- ARTIK Cloudでデバイスタイプ「DHT11 Sensor」作成
- デバイス「DHT11 Sensor A1」登録、デバイスID/トークン取得
- 物理配線:DHT11 Data → MKR1000 ピン2、VCC/GND接続
- MQTTパラメータ設定(SSL/TLSポート8883)
送信側キーコード
// MQTT設定
char mqttCloudServer[] = "api.artik.cloud";
int mqttCloudPort = 8883;
char mqttCloudClientName[] = "ARTIK-Arduino";
char mqttCloudUsername[] = "[device-id]";
char mqttCloudPassword[] = "[device-token]";
char mqttCloudDataOut[] = "/v1.1/messages/[device-id]";
WiFiSSLClient ipCloudStack;
MQTTClient mqttCloudClient;
void sendToArtikCloud(float temperature, float humidity) {
loadBuffer(temperature, humidity);
mqttCloudClient.publish(mqttCloudDataOut, buf);
}
void loadBuffer(float temperature, float humidity) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& dataPair = jsonBuffer.createObject();
dataPair["temperature"] = temperature;
dataPair["humidity"] = humidity;
dataPair.printTo(buf, sizeof(buf));
}
void getNextSample(float* Temperature, float* Humidity) {
delay(2000);
*Humidity = dht.readHumidity();
*Temperature = dht.readTemperature();
Serial.print("Temperature="); Serial.println(*Temperature);
Serial.print("Humidity="); Serial.println(*Humidity);
}
受信側:LED アクチュエーターデバイス設定
- デバイスタイプ「DHT11 Actor」作成
- デバイス「DHT11 Actor A1」登録
- 物理配線:赤LED → ピン11、黄LED → ピン13
- MQTTパラメータ(非SSLポート1883、アクショントピック購読)
受信側キーコード(アクション受信・パース・LED制御)
char mqttCloudActionsIn[] = "/v1.1/actions/[device-id]";
WiFiClient ipCloudStack;
MQTTClient mqttCloudClient;
void messageReceived(String topic, String payload, char* bytes, unsigned int length) {
parseBuffer(payload);
}
void parseBuffer(String payload) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(payload);
const char* nameparam = root["actions"][0]["name"];
int actionLEDRed = root["actions"][0]["parameters"]["led_red"];
int actionLEDYellow = root["actions"][0]["parameters"]["led_yellow"];
// 赤LED制御(遅延OFF付き)
if (actionLEDRed == 1) {
if (savedRedValue != 1) { digitalWrite(LED_RED_PIN, HIGH); savedRedValue = 1; }
savedRedTime = millis();
} else {
if (savedRedValue != 0 && millis() - savedRedTime > RED_DELAY) {
digitalWrite(LED_RED_PIN, LOW); savedRedValue = 0;
}
}
// 黄LED制御(同様)
// ...
}
ARTIK Cloud ルール設定例
4つのルールで温湿度の組み合わせによりLEDを制御:
- 温度 > 32℃ かつ 湿度 > 34% → 赤ON, 黄ON
- 温度 > 32℃ かつ 湿度 < 35% → 赤ON, 黄OFF
- 温度 < 33℃ かつ 湿度 > 34% → 赤OFF, 黄ON
- 温度 < 33℃ かつ 湿度 < 35% → 赤OFF, 黄OFF
完全スケッチ(2ファイル)
記事内に artik_dht11_sensor.ino と artik_led_actor.ino の全文が掲載されています。主な構成:
- Wi-Fi接続 → MQTT接続(ユーザー名=デバイスID, パスワード=デバイストークン)
- 送信側:定期的にDHT11読み取り → JSON生成 → MQTTパブリッシュ
- 受信側:MQTT購読 → JSONパース → ルールに基づくLED制御(遅延OFFタイマー付き)
移行・応用のヒント
- ARTIK Cloud終了に伴い、MQTTブローカーを ローカルMosquitto / EMQX / AWS IoT Core / Azure IoT Hub / ThingsBoard 等へ置き換え可能
- ルールエンジンは Node-RED / Home Assistant / ThingsBoard Rule Chain 等で代替
- DHT11 → DHT22 / BME280 / SHT3x 等へセンサー置換で精度向上
- LED → リレー / ソリッドステートリレー / MOSFET で実負荷(ファン、ヒーター等)制御へ拡張
ArduinoJsonは v6系(JsonDocument)への移行推奨
製造プロセス
- DHT11温湿度センサーで作る温度アラート – LEDとピエゾブザーで視覚/聴覚通知
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- DHT11 と Blynk で温湿度をリアルタイム監視する Arduino チュートリアル
- MKR1000ピン配置完全解説:IoT開発に最適なArduinoボード