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

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

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

Arduino с датчиком BME280 и индикацией времени

 

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

 

Категория: Мои статьи | Добавил: zgo (03.11.2023)
Просмотров: 217 | Теги: arduino, метеостанция, BME280, weather station, NTP | Рейтинг: 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