В проекте использована плата WeMos D1 R1 WiFi на базе ESP8266 UNO и датчик BME280. Датчик BME280 четырехконтактный с питанием +5В. Для индикации использован дисплей LCD 1602 с адаптером I2C.
Индикатор и датчик оба подключаются по интерфейсу I2C, поэтому шины SDA и SCL и их шины питания +5В и GND запараллелены на небольшом кусочке беспаечной макетной платы и с нее уже подключены к плате WeMos. Шину SDA подключите к пину, обозначенному D14/SDA/D4. Шину SCL подключите к пину, обозначенному D15/SCL/D3. С обратной стороны платы эти пины имеют обозначения GPIO4 и GPIO5. Шины питания подключите к соответствующим пинам 5V и GND.
Красные стрелки указывают пины подключения шин SDA и SCL
Если это ваш первый проект, то вам нужно в Windows установить среду Arduino IDE и настроить её для плат ESP8266. Об этом написано во многих источниках, также об этом можно прочитать в [1] и [2].
Запустите в Windows среду Arduino IDE и в меню выберите Инструменты -> Плата -> Менеджер плат и из списка выберите плату LOLIN(WeMos) D1 R1:
Для работы скетча нужно подключить библиотеку NTPClient. Для этого в меню пройдите Скетч -> Подключить библиотеку -> Управлять библиотеками... В окне поиска Менеджера библиотек введите NTP и нажмите Enter. Через пару секунд в окне появится библиотека NTPClient. Нажмите на кнопку Установка. У меня эта библиотека уже установлена (INSTALLED).
Для скетча также понадобятся библиотеки ESP8266WiFi.h и WiFiUdp.h. Библиотеку ESP8266WiFi.h можно скачать с martyncurrey.com/download/esp8266wifi-library/. В скачанном списке библиотек есть WiFiUdp.h. Как установить NTPClient.h, также описано на radioprog.ru/post/910.
Скачайте из Каталога файлов сайта скетч и архивы библиотек. Обычно скетчи размещаются в Моих Документах в папке Arduino. Во вложенной папке libraries размещаются библиотеки и ZIP-архивы библиотек. Скопируйте туда скачанные скетч и архивы. Скачанные ZIP-архивы библиотек необходимо установить в среде Arduino IDE - идем Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку...
Скетч WeMos_BME280_ntp-1
#include <Wire.h>
#include <ESP8266WiFi.h> // Подключаем библиотеку ESP8266WiFi
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <LiquidCrystal_I2C.h>
#include <GyverBME280.h>
GyverBME280 bme;
LiquidCrystal_I2C lcd(0x3f, 16, 2); // укажите свой адрес 0x20..0x27 address
const long utcOffsetInSeconds = 32400; // time zone +9 (Chita): 9*60*60=32400
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// Определение NTP-клиента для получения времени
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
const char* ssid = "*******"; // Название Вашей WiFi сети
const char* password = "*******"; // Пароль от Вашей WiFi сети
void setup() {
Serial.begin(9600);
// запуск датчика и проверка на работоспособность
if (!bme.begin(0x76)) Serial.println("Error!");
Wire.begin();
delay(1000);
lcd.init();
lcd.backlight();
lcd.home();
Serial.print("Connecting to "); // Отправка в Serial port
Serial.println(ssid); // Отправка в Serial port
WiFi.begin(ssid, password); // Подключение к WiFi Сети
while (WiFi.status() != WL_CONNECTED) { // Проверка подключения к WiFi сети
delay(500); // Пауза
Serial.print("."); // Отправка в Serial port
}
Serial.println(""); // Отправка в Serial port
Serial.println("WiFi connected."); // Отправка в Serial port
Serial.print("IP address: "); // Отправка в Serial port
Serial.println(WiFi.localIP()); // Отправка в Serial port
timeClient.begin();
}
void loop() {
timeClient.update();
Serial.print(daysOfTheWeek[timeClient.getDay()]);
Serial.print(", ");
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
//Serial.println(timeClient.getFormattedTime());
// температура
Serial.print("Temperature: ");
Serial.println(bme.readTemperature());
// влажность
Serial.print("Humidity: ");
Serial.println(bme.readHumidity());
// давление
Serial.print("Pressure: ");
Serial.println(bme.readPressure());
Serial.println();
float p2;
int pi;
p2 = (bme.readPressure() / 133.3224); // Па в мм рт.ст.
pi = trunc(p2); // отбрасывание дробной части числа
lcd.setCursor(0, 0);
lcd.print("P=");
lcd.setCursor(2, 0);
lcd.print(pi); // вывод атм. давл. на LCD
lcd.setCursor(5, 0);
lcd.print("mm");
lcd.setCursor(8, 0);
lcd.print("T=");
lcd.setCursor(10, 0);
lcd.print(bme.readTemperature());
lcd.setCursor(14, 0);
lcd.print((char)223);
lcd.setCursor(15, 0);
lcd.print("C") ;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print(bme.readHumidity());
lcd.setCursor(4, 1);
lcd.print("% ");
lcd.setCursor(7, 1);
lcd.print(daysOfTheWeek[timeClient.getDay()]);
lcd.setCursor(10, 1);
lcd.print(" ");
if (timeClient.getHours() < 10) {
lcd.setCursor(12, 1);
lcd.print(" ");
}
lcd.setCursor(11, 1);
lcd.print(timeClient.getHours());
lcd.setCursor(13, 1);
lcd.print(":");
if (timeClient.getMinutes() < 10) {
lcd.setCursor(15, 1);
lcd.print(" ");
}
lcd.setCursor(14, 1);
lcd.print(timeClient.getMinutes());
delay (5000);
}
Скачать скетчи и библиотеки
Для правильного отображения местного времени вам необходимо рассчитать и прописать в скетче константу вашей часовой зоны (часового пояса). У меня часовая зона +9 от времени UTC т.е. +6 часов от московского времени. Подробно об этом на radioprog.ru/post/910. Список часовых зон (time zone) можно посмотреть на [6].
Моя константа const long utcOffsetInSeconds = 32400; — для часовой зоны +9 (Чита, Якутск).
Как известно, для дисплея LCD 1602 можно создать дополнительно еще 8 символов. Для вывода дней недели по-русски в скетче WeMos_BME280_ntp-2 создал пять символов П, Ч, н, т, б. Дни недели выводятся двумя символами Вс, Пн, Вт, Ср, Чт, Пт и Сб.
На AliExpress можно заказать LCD 1602 с русскими буквами. В строке поиска на сайте AliExpress задайте LCD 1602 русский, будут выданы варианты для покупки.
Дисплей с русскими буквами с AliExpress
Скетч WeMos_BME280_ntp-3 написан для такого дисплея. Дни недели выводятся тремя буквами Вск, Пнд, Втр, Срд, Чтв, Птн и Сбт. Также выпускаются дисплеи со знакогенераторами для Японии, Европы и иврита.
Скетчи WeMos_BME280_ntp-1, WeMos_BME280_ntp-2, WeMos_BME280_ntp-3 и библиотеки можно скачать в Каталоге файлов.
Также попробовал плату RobotDyn WIFI D1 R2 ESP8266. Никаких изменений в скетче не потребовалось. Шины SDA, SCL подключаются к крайним контактам внизу в правой части платы.
В Менеджере плат выберите плату LOLIN(WEMOS) D1 R2 & mini.
Эта плата имеет разъем для подключения внешней WiFi антенны. Если у вас слабый сигнал WiFi, то вам лучше использовать эту плату вместе с внешней антенной.
Антенну можно заказать на AliExpress. В строке поиска на AliExpress задайте Wi-Fi 2,4G 3dbi PCB антенна IPX IPEX WLAN. Будут выданы разные варианты для покупки. Выберите антенну с IPX разъемом.
Если проект не работает, то сначала проверьте в Менеджере плат, правильно ли выбрана плата. Затем просмотрите сообщения, выдаваемые в монитор порта. Должны выдаваться сообщения о подключении, IP адрес, день недели на английском, местное время - часы, минуты и секунды, затем показания BME280 - температура, влажность и давление. Вывод дня недели, текущего времени и показания датчика будет циклически повторяться. Если вы получаете нечитаемые сообщения, то проверьте в настройках монитора скорость порта и выставьте её в соответствие с установленной в скетче.
Если фон на индикаторе светится и больше ничего нет, то отрегулируйте яркость экрана потенциометром на адаптере I2C платы LCD. После этого должны появится знакоместа. Если знакоместа есть, а никаких символов нет, то скорее всего неправильно задан адрес индикатора LCD 1602 на шине I2C. Для проверки адресов запустите скетч I2C_Scanner. Скетч выдает в монитор порта шестнадцатеричные адреса устройств, найденных на шине I2C. Должны быть 0x3f – адрес индикатора LCD 1602 и 0x76 – адрес датчика BME280. Если полученные адреса отличаются от этих, то исправьте в скетче адреса на свои.
P.S. Не устанавливайте датчик BME280 в корпус вместе с платой WeMos. Датчик в корпусе будет давать неверные показания, даже если корпус имеет вентиляционные отверстия. Установите датчик снаружи корпуса, чтобы был обеспечен свободный доступ окружающего воздуха.
Отредактировал статью 2 января 2024 г.
Использованные источники
1. https://nerd-corner.com/wemos-d1-r2-setup-and-wifi-integration/
2. http://zgo.narod.ru/publ/nodemcu_v3_esp8266_displays_temperature_and_time_readings_on_a_web_page/1-1-0-93
3. https://lastminuteengineers.com/esp8266-ntp-server-date-time-tutorial/
4. https://kit.alexgyver.ru/tutorials/bme280/?ysclid=lofivy8ts5148527924
5. https://www.uctronics.com/download/Amazon/K0061_ESP8266_KIT.pdf
6. https://en.wikipedia.org/wiki/List_of_UTC_offsets
7. https://en.wikipedia.org/wiki/List_of_UTC_offsets#/media/File:World_Time_Zones_Map.png
8. https://robotchip.ru/russkie-simvoly-na-lcd1602a/?ysclid=lqq7581ubz486129449
9. http://wiki.amperka.ru/products:display-lcd-text-16x2-i2c?ysclid=lpj3pymwre312008398
|