Передача данных температуры и влажности между двумя Arduino через Firebase
Компоненты и материалы
| Arduino UNO | ×2 |
| ESP8266 ESP-01 | ×2 |
| Датчик температуры и влажности DHT11 (3-проводной) | ×1 |
| I2C LCD-дисплей 16×2 (DFRobot) | ×1 |
| Бредборд | ×2 |
| Перемычки (Male/Female) | ×1 набор |
Программное обеспечение и сервисы
- Arduino IDE
- Google Firebase (Realtime Database)
Обзор проекта
В этом IoT-уроке вы научитесь считывать температуру и влажность с датчика DHT11 на одном Arduino UNO, отправлять значения в Firebase через ESP8266, а затем получать их на втором Arduino UNO для вывода на I2C LCD. Этот практический пример демонстрирует последовательную коммуникацию, Wi-Fi-сеть и облачное хранение данных — ключевые навыки для современных встраиваемых разработчиков.
Шаг 1 — Понимание роли каждой платы
UNO служит интерфейсом датчика, а ESP8266 — шлюзом Wi-Fi. Они общаются через последовательный порт; ESP8266 не подключается к интернету напрямую, только Wi-Fi-модуль это делает. Держите код для каждой платы раздельно, чтобы избежать путаницы.
Шаг 2 — Подключение LCD к UNO
Используйте I2C для простоты и экономии пинов. Модуль DFRobot работает из коробки. Для дисплея 20×4 обновите конструктор: LiquidCrystal_I2C lcd(0x3F, 20, 4);.
Шаг 3 — Подключение DHT11 ко второму UNO
Следуйте официальному уроку по DHT11 для подключения и установки библиотеки. Датчик требует только один пин данных (в примере A0).
Шаг 4 — Настройка ESP8266 с Firebase
Настройте Wi-Fi-учётные данные и параметры проекта Firebase в скетче. Firebase Realtime Database предоставляет простое JSON-дерево, куда ESP8266 пишет узлы temperature и humidity. Для новичков видеоурок охватывает каждый шаг.
Шаг 5 — Настройка последовательной коммуникации
При передаче данных по последовательному порту выводите только требуемую строку. Любые дополнительные отладочные печати могут нарушить протокол. В нашей реализации датчичный UNO отправляет строку с запятой (например, 25.3,60.1) в ESP8266, который парсит и пересылает каждое значение в Firebase.
Шаг 6 — Загрузка и тестирование
Загрузите скетч датчика в первый UNO, скетч датчик-ESP8266 в первый ESP8266, и скетч LCD-ESP8266 во второй ESP8266. Проверьте, что LCD обновляется свежими показаниями каждые несколько секунд. Всегда отключайте USB-кабель Arduino перед отсоединением перемычек, чтобы избежать случайных замыканий.
Типичные проблемы и решения
- Не загружается в ESP8266: выберите Generic ESP8266 Module в IDE. Если не помогает — сбросьте плату, перевставьте модуль, попробуйте снова.
- Не загружается в UNO: убедитесь, что USB подключен до запуска загрузчика. Уберите GPIO-0 (IO0) ESP8266 от GND во время прошивки.
- Расхождение последовательного порта: соедините TX ESP8266 с RX UNO и RX ESP8266 с TX UNO (перекрёстно). Не печатайте лишние строки во время обмена.
- Артефакты на LCD: задержки Serial могут вызывать мусор на экране. Вызов
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 на headless Raspberry Pi
- Мониторинг солнечной панели в реальном времени: дешёвая система сбора данных на Arduino и Excel
- Робот для поиска людей на базе Arduino Uno: пошаговая интеграция датчиков
- Надежный ИК-датчик пульса на Arduino: пошаговое руководство
- Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
- Бесшовное управление яркостью светодиодов с помощью Bolt IoT и Arduino UNO
- Подключение датчика пульса MAX30100 к Arduino: Пошаговое руководство
- Пошаговое руководство: подключение датчика влаги почвы YL-39/YL-69 к Arduino UNO
- Создание PHP-веб-интерфейса для управления Arduino Uno
- Бесшовная миграция CMMS: экспертные руководящие принципы переноса данных