В проекте использовал NodeMCU v3 (LoLin) на базе ESP8266. Для отображения информации использован дисплей SSD1306 с интерфейсом I2C. Показания температуры, влажности и давления выводятся с четырехконтактного датчика BME280.
Схема соединений проста. Контакт VCC дисплея и контакт VIN BME280 подключите к контакту 3V NodeMCU, контакты GND дисплея и датчика соответственно к контакту G (GND) NodeMCU. Шину SDA дисплея и датчика подключите к контакту D2 NodeMCU, а шину SCL — к контакту D1 NodeMCU.
В проекте использовалась среда Arduino IDE 1.8.19 в Windows 7. Подразумевается, что среда уже настроена для плат ESP8266 и в Windows установлен драйвер COM порта для этой платы.
Для отображения русского текста на OLED дисплее использовалась модифицированная библиотека OLED_I2C.h с добавленным русским шрифтом RusFont[]. Библиотеку можно скачать в Каталоге файлов на этом сайте.
Показания времени загружаются из интернета с одного из NTP серверов. Для правильного указания местного времени необходимо рассчитать и прописать в скетче константу для своей часовой зоны. У меня временнáя зона +9 от времени UTC (Чита, Якутск), т.е. +6 часов от московского времени. Как рассчитать константу, читайте в [1]. Для скетча надо подключить библиотеку NTPClient.h — это описано также в [1], [5].
В показаниях времени незначащие нули в часах и минутах не выводятся, такой формат времени выдает NTP сервер. День недели выдается числом: 0 - Sunday (Воскресенье), 1 - Monday (Понедельник), 2 - Tuesday (Вторник), 3 - Wednesday (Среда), 4 - Thursday (Четверг), 5 - Friday (Пятница), 6 - Saturday (Суббота). День недели выводится сокращенно по-русски ВСК, ПНД, ВТР, СРД, ЧТВ, ПТН и СБТ.
Информация на дисплее обновляется каждые 5 секунд.
Для скетча понадобятся библиотеки ESP8266WiFi.h и WiFiUdp.h. Библиотеку ESP8266WiFi.h можно скачать с martyncurrey.com/download/esp8266wifi-library/. В скачанном списке библиотек есть WiFiUdp.h.
Для работы скетча необходимы библиотеки Adafruit_BME280.h, Adafruit_Sensor.h. Как установить их, описано на dmitrysnotes.ru/domashnyaya-meteostanciya-na-esp8266-i-datchike-bme280.
Не забудьте прописать в скетче название своей Wi-Fi сети и пароль для Wi-Fi.
Скетч ESP8266_BME280_Rus.ino
// OLED_I2C_ViewFont
// Copyright (C)2019 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// **********************************************
// *** This demo is for 128x64 pixel displays ***
// **********************************************
//
// A quick demo of how to use my OLED_I2C library.
//
// Remember to use external pull-up resistors on the data and clock signals
// if they are required.
//
// You can connect the OLED display to any available pin. The library will
// use the Wire library for display communication.
#include <Wire.h> // Подключаем библиотеку Wire
#include <ESP8266WiFi.h> // Подключаем библиотеку ESP8266WiFi
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <Adafruit_BME280.h> // Подключаем библиотеку Adafruit_BME280
#include <Adafruit_Sensor.h>
#define SDA D2
#define SCL D1
#include <OLED_I2C.h>
OLED myOLED(SDA, SCL); // SDA - D2, SCL - D1 для дисплея
// задайте константу для своей временной зоны (часового пояса)
const long utcOffsetInSeconds = 32400; // time zone +9 (Chita): 9*60*60=32400
// Дни недели ВСК, ПНД, ВТР, СРД, ЧТВ, ПТН, СБТ
char daysOfTheWeek[7][12] = {"DCR", "GYL", "DNH", "CHL", "XND", "GNY", "C<N"};
// Определение NTP-клиента для получения времени
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
const char* ssid = "********"; // Название Вашей WiFi сети
const char* password = "************"; // Пароль от Вашей WiFi сети
extern uint8_t SmallFont[];
extern uint8_t RusFont[];
extern uint8_t MediumNumbers[];
Adafruit_BME280 bme;
void setup()
{
Serial.begin(9600);
if (!bme.begin(0x76)) { // Проверка инициализации датчика
Serial.println("Could not find a valid BME280 sensor, check wiring!"); // Печать об ошибке
while (1); // Зацикливаем
}
if (!myOLED.begin(SSD1306_128X64))
{
Serial.println("Failed memory allocation...");
while (1); // In case the library failed to allocate enough RAM for the display buffer...
}
myOLED.setFont(RusFont);
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());
float tempC = bme.readTemperature();
float humidity = bme.readHumidity();
float pressuremmHg = bme.readPressure() * 0.007500616; // перевод атм. давления Pa в mmHg
myOLED.clrScr();
myOLED.setFont(RusFont);
// Вывод на дисплей дня недели тремя символами на русском
myOLED.print(daysOfTheWeek[timeClient.getDay()], LEFT, 13);
myOLED.setFont(MediumNumbers);
// Вывод на дисплей показаний времени (часы и минуты)
myOLED.print(String(timeClient.getHours()) + "-" + String(timeClient.getMinutes()), CENTER, 6 );
myOLED.setFont(RusFont);
myOLED.print("Ntvgthfnehf", LEFT, 28); // Температура
myOLED.print("Dkf;yjcnm", LEFT, 40); // Влажность
myOLED.print("Lfdktybt", LEFT, 52); // Давление
myOLED.setFont(SmallFont);
Serial.println(bme.readTemperature()); // Печать температуры
myOLED.print(String(tempC) + " *C", RIGHT, 28); // Вывод на дисплей температуры
myOLED.print(String(humidity) + " %", RIGHT, 40); // Вывод на дисплей влажности
myOLED.print(String(pressuremmHg) + " mmHg", RIGHT, 52); // Вывод на дисплей давления в мм рт. ст.
myOLED.update();
delay (5000);
}
Скачать скетч и библиотеки
Набирать русский текст довольно легко. Переключаем клавиатуру на английскую раскладку и набираем текст, нажимая клавиши с русскими буквами [4]. Получаем нечитаемый английский текст, но при выводе на дисплей SSD1306 вы получите правильный русский текст. Для прописных русских букв нажмите Shift. Там же приводится таблица соответствия английских и русских букв.
Если скетч не работает, то проверьте адреса устройств на шине I2C. Для этого запустите скетч I2C_Scanner. На фото показана информация, выводимая при запуске скетча.
Пример вывода прописных и строчных букв русского алфавита на экран SSD1306
Скетчи и библиотеки можно скачать в Каталоге файлов.
Использованные ресурсы
1. https://radioprog.ru/post/910
2. http://zgo.narod.ru/publ/how_to_find_out_the_height_of_a_place_using_bmp180/1-1-0-135
3. http://zgo.narod.ru/publ/nodemcu_weather_station_on_bme280_and_ssd1306_with_time_display/1-1-0-119
4. https://hcomp.ru/blog/po/?ysclid=lrtyuceext338722074
5. https://lastminuteengineers.com/esp8266-ntp-server-date-time-tutorial/
|