Firebase経由で2台のArduino間を温湿度データで連携するIoTチュートリアル
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 2 |
| ESP8266 ESP-01 | 2 |
| DHT11温湿度センサー(3ピン) | 1 |
| DFRobot I2C 16×2 LCDディスプレイ | 1 |
| ブレッドボード(汎用) | 2 |
| ジャンパーワイヤー(オス/メス) | 1セット |
アプリとオンラインサービス
- Arduino IDE
- Google Firebase(Realtime Database)
プロジェクト概要
このIoTチュートリアルでは、DHT11センサーで温湿度を取得し、1台目のArduino UNOからESP8266経由でFirebaseに送信。2台目のArduino UNOがFirebaseからデータを取得し、I2C LCDに表示します。シリアル通信、Wi-Fiネットワーキング、クラウドデータストレージといった、現代の組み込み開発に必須のスキルを実践的に習得できます。
ステップ1:各ボードの役割を理解する
UNOがセンサーインターフェース、ESP8266がWi-Fiゲートウェイを担当。両者はシリアルポートで通信し、ESP8266自体は直接インターネットに接続せず、Wi-Fiモジュールのみが接続します。各ボードのコードを分けて管理することで混乱を防ぎます。
ステップ2:LCDをUNOに接続
ピン数削減と簡潔さのためI2C接続を採用。DFRobotモジュールの20×4 LCDサンプルがそのまま動作します。20×4ディスプレイ使用時はコンストラクタをLiquidCrystal_I2C lcd(0x3F, 20, 4);に更新してください。
ステップ3:DHT11を2台目のUNOに配線
公式Arduino DHT11チュートリアルに従って配線とライブラリ導入。センサーはシングルデータピン(例ではA0)のみ必要です。
ステップ4:ESP8266とFirebaseをセットアップ
Wi-Fi認証情報とFirebaseプロジェクト詳細をスケッチに設定。Firebase Realtime DatabaseのシンプルなJSONツリーに、ESP8266がtemperatureとhumidityノードを書き込みます。初心者向けに解説動画も用意されています。
ステップ5:シリアル通信をマスターする
シリアル送信時は必要な文字列のみ出力。デバッグ用の余分な出力はプロトコルを破綻させます。実装では、センサー側UNOがカンマ区切り文字列(例:25.3,60.1)をESP8266へ送信し、ESP8266がパースして各値をFirebaseへ転送します。
ステップ6:アップロードとテスト
センサー側UNO、センサー側ESP8266、LCD側ESP8266の順にスケッチを書き込み。数秒ごとにLCDが更新されることを確認。ジャンパーワイヤー抜き差しの際は、必ずArduinoのUSBケーブルを外してから行い、誤ショートを防いでください。
よくある落とし穴と対処法
- ESP8266への書き込み失敗:IDEで汎用ESP8266ボードを選択。それでも失敗する場合はリセット、モジュール再挿入、再試行。
- UNOへの書き込み失敗:アップローダー起動前にUSBケーブル接続を確認。プログラミング中はESP8266のGPIO-0(IO0)をGNDから外す。
- シリアル不整合:ESP8266 TX→UNO RX、ESP8266 RX→UNO TX(クロス接続)。通信中は非データ文字列を出力しない。
- LCD表示乱れ:シリアル遅延でランダム文字が表示されることあり。
lcd.clear()を各表示前に実行すると解決。
コードスニペット
- lcd_arduino.ino
- lcd_esp8266.ino
- sensor_arduino.ino
- sensor_esp8266.ino
lcd_arduino.ino(Arduino)
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4);
String sensorData;
void setup() {
Serial.begin(9600);
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Temperature: ");
lcd.setCursor(18, 0);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.setCursor(15, 1);
lcd.print("%");
}
void loop() {
if (Serial.available()) {
sensorData = Serial.readString();
String temp = sensorData.substring(0, sensorData.indexOf(','));
String hum = sensorData.substring(sensorData.indexOf(',') + 1);
lcd.clear();
lcd.setCursor(13, 0);
lcd.print(temp);
lcd.setCursor(10, 1);
lcd.print(hum);
}
delay(2000);
}
lcd_esp8266.ino(ESP8266)
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#define FIREBASE_HOST "YOUR_FIREBASE_LINK"
#define FIREBASE_AUTH "YOUR_FIREBASE_TOKEN"
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
void setup() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
String temp = Firebase.getString("temperature");
String hum = Firebase.getString("humidity");
Serial.flush();
Serial.print(temp + "," + hum);
delay(2000);
}
sensor_arduino.ino(Arduino)
#include <SoftwareSerial.h>
#include <dht.h>
#define DHT_PIN A0
DHT dht;
void setup() {
Serial.begin(9600);
}
void loop() {
dht.read11(DHT_PIN);
String data = String(dht.temperature) + "," + String(dht.humidity);
Serial.flush();
Serial.print(data);
delay(2000);
}
sensor_esp8266.ino(ESP8266)
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#define FIREBASE_HOST "YOUR_FIREBASE_LINK"
#define FIREBASE_AUTH "YOUR_FIREBASE_TOKEN"
#define WIFI_SSID "YOUR_WIFI_SSID"
#define WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
void setup() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.begin(9600);
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
if (Serial.available()) {
String payload = Serial.readString();
int comma = payload.indexOf(',');
String temp = payload.substring(0, comma);
String hum = payload.substring(comma + 1);
Firebase.setString("temperature", temp);
Firebase.setString("humidity", hum);
if (Firebase.failed()) {
Serial.println("Failed to write to Firebase");
}
}
delay(2000);
}
製造プロセス
- ppDAQC Pi-PlateからInitialStateへ温度データをストリーミング - ヘッドレスRaspberry Piで実現
- Arduinoで実現する低コスト・リアルタイム太陽光パネル監視システム
- Arduino Unoベースの人間検知レスキューロボット:センサー統合ステップバイステップ
- Arduinoで作る赤外線心拍センサー:低コスト・リアルタイム波形表示のステップバイステップガイド
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- Bolt IoTとArduino UNOでLED輝度をシームレス制御
- MAX30100脈波センサーをArduinoで活用:ステップバイステップガイド
- YL-39/YL-69土壌湿度センサーをArduino UNOに接続するステップバイステップガイド
- PHPベースのWebインターフェースでArduino Unoを制御する構築ガイド
- Arduino NanoとMPU6050で加速度から傾斜角を算出 - Visuino活用チュートリアル
- シームレスなCMMS移行:データ移行のエキスパートガイドライン