两块 Arduino 通过 Firebase 传递温湿度数据
零部件与物料
| 零部件 | 数量 |
|---|---|
| Arduino UNO | 2 |
| ESP8266 ESP-01 | 2 |
| DHT11 温湿度传感器(3引脚) | 1 |
| DFRobot I2C 16×2 LCD 显示屏 | 1 |
| 面包板 | 2 |
| 公/母杜邦线 | 1套 |
软件与在线服务
- Arduino IDE
- Google Firebase Realtime Database
项目概述
本教程演示:UNO① 读取 DHT11 数据 → 串口发给 ESP8266① → 经 WiFi 写入 Firebase → ESP8266② 从 Firebase 读回 → 串口发给 UNO② → I2C LCD 显示。涵盖串口通信、WiFi 组网、云端存储,是物联网入门必修课。
步骤 1:明确各板角色
UNO 负责传感器采集,ESP8266 充当 WiFi 网关。两者串口直连,ESP8266 不直连互联网(由模块内部处理)。代码分板编写,避免混淆。
步骤 2:UNO 接 I2C LCD
I2C 接线简洁省引脚。DFRobot 模块开箱即用。若用 20×4 屏,构造函数改为 LiquidCrystal_I2C lcd(0x3F, 20, 4);。
步骤 3:第二块 UNO 接 DHT11
按官方教程接线装库,数据脚接 A0。
步骤 4:ESP8266 配置 Firebase
在代码中填入 WiFi SSID/密码、Firebase 项目 URL 与 Token。ESP8266 向实时数据库写入 temperature 与 humidity 节点。新手可参考配套视频教程。
步骤 5:掌握串口通信协议
串口仅发送有效数据字符串(如 25.3,60.1),任何调试打印都会破坏协议。传感器 UNO 发送逗号分隔字符串,ESP8266 解析后分别上传。
步骤 6:烧录与测试
依次烧录:传感器 UNO、传感器侧 ESP8266、显示侧 ESP8266。观察 LCD 每几秒刷新一次。拔插杜邦线前先拔 USB,防短路。
常见坑与对策
- ESP8266 烧录失败:IDE 选 Generic ESP8266 Module;仍失败则复位、重插模块再试。
- UNO 烧录失败:先插 USB 再启动上传器;烧录时 ESP8266 的 GPIO0 勿接 GND。
- 串口收发错位:ESP8266 TX 接 UNO RX,RX 接 TX(交叉);通信期间严禁打印非数据内容。
- LCD 乱码:串口延迟导致,每次打印前
lcd.clear()可解决大部分问题。
代码片段
lcd_arduino.ino(显示端 UNO)
#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(采集端 UNO)
#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 扩展板实时采集温度数据并上传至 InitialState
- Arduino 实时太阳能电池板监测:低成本数据采集系统
- 基于 Arduino Uno 的人体检测救援机器人:传感器集成分步指南
- Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
- Arduino 声纳实时测距与 Processing 可视化
- Bolt IoT + Arduino UNO 实现 6 路 LED 无级调光
- MAX30100脉搏血氧传感器与Arduino接入指南:获取PPG波形与SpO2
- 分步指南:将 YL-39/YL-69 土壤湿度传感器连接到 Arduino UNO
- 构建基于 PHP 的 Web 界面控制 Arduino Uno
- Arduino Nano + MPU6050 实现加速度转倾斜角度(Visuino 图形化编程)
- 基于 Arduino 与 DSM501A 传感器的空气质量监测仪
- CMMS 无缝迁移:数据迁移专家指南