В последние годы наблюдается тенденция ко все большему увеличению объемов памяти современных микроконтроллеров, однако ее все равно недостаточно, к примеру, для таких задач как хранение в режиме реального времени данных, считываемых с датчиков. В этом случае приходят на помощью облачные хранилища данных, которые в настоящее время становятся все более популярными. Таким образом, микроконтроллер по каким-нибудь каналам связи (обычно это GSM или WiFi) передает данные, считываемые с подключенных к нему датчиков, на это облачное хранилище данных, с которого, в свою очередь, вы можете считать данные из любой точки земного шара, где есть доступ к сети Интернет.
Одним из самых известных подобных хранилищ данных является сервис Thingspeak, который активно используется в настоящее время для различных проектов из сферы интернета вещей. И на нашем сайте вы можете посмотреть достаточно много проектов с использованием сервиса Thingspeak. Но если вы, к примеру, являетесь поклонниками продуктов от компании Google, то вы можете для целей хранения в режиме реального времени данных от датчиков использовать сервис Firebase, подробно работу с которым мы рассматривали в нашей предыдущей статье про управление светодиодом с помощью NodeMCU ESP8266 и Firebase – рекомендуем ознакомиться с ней прежде чем переходить к чтению данной статьи.
В данной статье мы рассмотрим передачу данных температуры и влажности на сервер Firebase с помощью NodeMCU ESP8266.
Необходимые компоненты
- Модуль NodeMCU ESP8266 (купить на AliExpress).
- Датчик температуры и влажности DHT11 (купить на AliExpress).
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Датчик температуры и влажности DHT11
Датчик DHT11 осуществляет измерение температуры и влажности окружающего воздуха и передает эту информацию через свой цифровой выход. Датчик отличается высокой надежностью и стабильностью работы, и приемлемой для большинства проектов точностью измерений (если вам нужен более точный датчик температуры, то рекомендуем присмотреться к датчику DS18B20, подключение которого к плате Arduino мы рассматривали в этой статье).
Датчик DHT11 содержит в своем составе резистивный элемент для измерения влажности и компонент измерения температуры NTC типа (с отрицательным температурным коэффициентом). Также датчик оснащается недорогим 8-битным микроконтроллером с быстрым временем ответа и поставляется в виде модуля с 4-мя выходам. Внешний вид датчика показан на следующем рисунке.
Также на нашем сайте вы можете посмотреть все проекты с использованием датчика DHT11 – их достаточно много.
Схема проекта
Схема проекта для передачи данных температуры и влажности на сервер Firebase с помощью NodeMCU ESP8266 представлена на следующем рисунке.
Как видите, схема крайне проста.
Объяснение программы для NodeMCU ESP8266
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе подключим библиотеки для работы с модулем ESP8266 и сервером Firebase.
1 2 |
#include <ESP8266WiFi.h #include <FirebaseArduino.h |
Эти библиотеки можно скачать по следующим ссылкам:
https://github.com/FirebaseExtended/firebase-arduino/blob/master/src/Firebase.h
https://github.com/bblanchon/ArduinoJson
Если во время компиляции программы у вас будет выдаваться ошибка о том, что библиотека ArduinoJson.h у вас не установлена, то скачайте ее по приведенной выше ссылке и установите.
В программе мы будем с помощью NodeMCU ESP8266 считывать данные с датчика DHT11 и передавать их на сервер Firebase с 5-секундным интервалом. Для этого нам необходим будет путь, по которому мы будем передавать данные. Данные температуры и влажности мы будем передавать по одному и тому же родительскому пути, но разным наследуемым от него (дочерним) путям.
Также в программе нам необходимо задать два параметра (FIREBASE_HOST и FIREBASE_AUTH), которые нам понадобятся для взаимодействия с Google Firebase. Эти параметры сделают возможным обмен данными между ESP8266 и Firebase. Как получить эти параметры, описано в нашей предыдущей статье по работе с сервисом Google Firebase. После того как вы их получите, внесите соответствующие изменения в эти две строчки кода.
1 2 |
#define FIREBASE_HOST "your-project.firebaseio.com" // the project name address from firebase id #define FIREBASE_AUTH "Uejx9ROxxxxxxxxxxxxxxxxxxxxxxxxfQDDkhN" // the secret key generated from firebase |
Следующие два параметра необходимы для подключения модуля ESP8266 к сети Wi-Fi. Замените идентификатор сети (SSID) и пароль (password) на значения для своей сети Wi-Fi.
1 2 |
#define WIFI_SSID "xxxxxxxxxxxxx" // input your home or public wifi name #define WIFI_PASSWORD "xxxxxxxxxxxxxx" //password of wifi ssid |
Определим контакт NodeMCU ESP8266 для подключения к нему контакта данных датчика DHT11. Вы можете использовать для этого любой цифровой контакт NodeMCU, мы использовали контакт D4.
1 |
#define DHTPIN D4 |
Библиотека для работы с датчиком DHT (DHT library) универсальна и может работать со всеми известными датчиками DHT, поэтому в программе вы должны указать с каким датчиком вы будете работать — с DHT11 или DHT22.
1 2 |
#define DHTTYPE DHT11 // select dht type as DHT 11 or DHT22 DHT dht(DHTPIN, DHTTYPE); |
Подключимся к выбранной Wi-Fi сети и к выбранной базе данных сервера firebase.
1 2 |
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); |
Начнем считывать данные с датчика DHT11 – он подключен у нас к контакту D4 NodeMCU.
1 |
dht.begin(); |
Считаем данные температуры и влажности с датчика DHT11 и сохраним их в переменных типа float.
1 2 |
float h = dht.readHumidity(); // Reading temperature or humidity takes about 250 milliseconds! float t = dht.readTemperature(); // Read temperature as Celsius (the default) |
Проверим работоспособен ли датчик DHT11 и правильно ли он подключен. Если данные с него не считываются, то, скорее всего, он не работоспособен или не подключен, в этом случае мы будем выводить на экран сообщение об ошибке и будем снова возвращаться к проверке работоспособности датчика.
1 2 3 4 |
if (isnan(h) || isnan(t)) { // Check if any reads failed and exit early (to try again). Serial.println(F("Failed to read from DHT sensor!")); return; } |
Также в целях отладки мы будем выводить в окно монитора последовательной связи (serial monitor) считанные данные с датчика DHT11 и передавать их в виде строковых переменных на сервер firebase. Также обратите внимание на то, что минимальная задержка между последовательными считываниями данных с датчика DHT11 составляет 2 секунды, поэтому убедитесь в том, что используете в программе задержку большую чем 2 секунды.
1 2 3 4 5 |
Serial.print("Humidity: "); Serial.print(h); String fireHumid = String(h) + String("%"); //convert integer humidity to string humidity Serial.print("% Temperature: "); Serial.print(t); Serial.println("°C "); String fireTemp = String(t) + String("°C"); delay(4000); |
И, наконец, мы будем передавать данные температуры и влажности на сервер firebase используя путь “your-project.firebaseio.com/DHT11/Humidity/”.
1 2 |
Firebase.pushString("/DHT11/Humidity", fireHumid); //setup path and send readings Firebase.pushString("/DHT11/Temperature", fireTemp); //setup path and send readings |
Вы можете посмотреть все переданные вами данные в своем аккаунте в firebase. Для этого перейдите в раздел “Database” (база данных) в вашем проекте (“Your Project”) в вашей консоли (“My console”) в Firebase.
Более подробно про настройку Firebase для считывания данных вы можете прочитать в нашей предыдущей статье по этой тематике.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/* Sending Sensor Data to Firebase Database by CircuitDigest (http://www.circuitdigest.com/) */ #include <ESP8266WiFi.h> // esp8266 library #include <FirebaseArduino.h> // firebase library #include <DHT.h> // dht11 temperature and humidity sensor library #define FIREBASE_HOST "your-project.firebaseio.com" // адрес вашего проекта в вашем аккаунте firebase #define FIREBASE_AUTH "Uejx9ROxxxxxxxxxxxxxxxxxxxxxxxxfQDDkhN" // ваш секретный ключ из firebase #define WIFI_SSID "network_name" // идентификатор вашей wifi сети #define WIFI_PASSWORD "password" // пароль вашей wifi сети #define DHTPIN D4 // к этому контакту подключен датчик DHT11 #define DHTTYPE DHT11 // указываем тип используемого dht датчика: DHT11 или DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); delay(1000); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // пытаемся соединиться с сетью wifi Serial.print("Connecting to "); Serial.print(WIFI_SSID); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(); Serial.print("Connected to "); Serial.println(WIFI_SSID); Serial.print("IP Address is : "); Serial.println(WiFi.localIP()); //print local IP address Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); // соединяемся с сервером firebase dht.begin(); // начинаем считывание данных с датчика dht } void loop() { float h = dht.readHumidity(); // считывание данных температуры или влажности занимает около 250 milliseconds! float t = dht.readTemperature(); // Read temperature as Celsius (the default) if (isnan(h) || isnan(t)) { // Check if any reads failed and exit early (to try again). Serial.println(F("Failed to read from DHT sensor!")); return; } Serial.print("Humidity: "); Serial.print(h); String fireHumid = String(h) + String("%"); // конвертируем значение влажности в строковую переменную Serial.print("% Temperature: "); Serial.print(t); Serial.println("°C "); String fireTemp = String(t) + String("°C"); // конвертируем значение температуры в строковую переменную delay(4000); Firebase.pushString("/DHT11/Humidity", fireHumid); //setup path and send readings Firebase.pushString("/DHT11/Temperature", fireTemp); //setup path and send readings } |
5 ответов к “Передача с помощью NodeMCU ESP8266 данных температуры и влажности на Google Firebase”
Спасибо за очень качественные уроки. Все получилось и работает хорошо. Была проблемма сначала , но догадался как ее решить и все пошло нормально.Суть проблемы (возможно еще кто то столкнулся с этим):
#define DHTPIN D4 -в таком виде при компиляции показывало ошибку в этой строке , я убрал «D» , оставил 4 , ошибка не повторилась , но и результат измерения не появился.
Посмотрел на какую ногу идет GPIO4 -это D2, переставил контакт данных с D4 на D2 и все заработало.
Спасибо и вам за то, что оценили наш труд, и за конструктивный комментарий к статье
Сделал все как написано в статье, в терминале вижу передаваемые данные а в базе они не появляются. Можете объяснить почему?
Леонид, так сразу сложно сказать, не видя ничего что у вас происходит, почему они не появляются в базе. Ключ секретный в программе изменили на свой? А у вас заработал более простой проект данной тематики — управление светодиодом с помощью Google Firebase?
Добрый день.
Полезная информация.
Спасибо.
Тоже заинтересовался этой темой.
Но с применением связки «ESP-12F WeMos D1 WiFi», «Arduino UNO» и внешнего приложения.
Рабочее название: «Метеостанция с охранной сигнализацией».
Результат, в целом, удовлетворительный (в рамках поставленных целей).
Если интересно, то можно посмотреть здесь:
roamer55.ru/my_projs/arduino_prj/my_ts/005_step/ex_grp_03/ex_03_001.pdf ;
roamer55.ru/main_programming/arduino/arduino_technosphere_000/arduino_technosphere_000_005/