Вторник, 30.04.2024
Завод горного оборудования
Меню сайта
Google_Translate
Категории раздела
Мои статьи [124]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Рейтинг@Mail.ru

Яндекс.Метрика
Главная » Статьи » Мои статьи

Метеостанция ESP8266 на BME280 и SSD1306 с сообщениями на русском

В проекте использовал 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/
 

Категория: Мои статьи | Добавил: zgo (11.02.2024)
Просмотров: 52 | Теги: часовой пояс, NTP, ESP8266, time zone, BME280, русский текст, russian text, SSD1306 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Поиск
Друзья сайта
  • Создать сайт
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Все проекты компании
  • Сайт завода zgo.ucoz.ru
  • Забайкальский край
    Дарасун
    Яндекс.Погода


    Хостинг Ucoz опять навязал видеорекламу, но обещает - "мы настроили систему так, чтобы в сутки на уникального посетителя приходилось не более двух показов."
    Совет, как не смотреть видеорекламу.

    Или используйте Uran - браузер от Ucoz без рекламы Скачать

    или подключите к браузеру блокировщик рекламы, например, Adblock Plus или uBlock Origin

    Универсальный декодер кириллицы



    Защита, контроль, управление.


    Ваш IP адрес IP informer

    DONATE (поддержи автора)
    Все статьи авторские, при использовании прошу ссылаться на сайт
    Copyright Дарасунский завод горного оборудования © 2004 - 2024
    Бесплатный конструктор сайтов - uCoz