Измерване на температура и налягане с BMP180, OLED SSD1306 и Arduino

Измерване на температура и налягане с BMP180, OLED SSD1306 и Arduino

Въведение

В този проект ще съчетаем два мощни компонента – барометричния сензор BMP180 и OLED SSD1306 дисплей, за да създадем метеорологична станция, която ще показва температура, атмосферно налягане и надморска височина управлявани от Arduino UNO. Този проект е лесен за изпълнение и предоставя полезна информация, която може да се използва в различни приложения, като например следене на атмосферни условия.

Свързване на компонентите

За да свържете BMP180 и SSD1306 към Arduino, ще използваме интерфейса I2C, който позволява работа само с два кабела (SDA и SCL) за комуникация с тези компоненти.

Свързване на BMP180:

  • VCC към 3.3V (важно е BMP180 да не се свързва към 5V)
  • GND към GND
  • SCL към аналогов пин A5 (на Arduino Uno)
  • SDA към аналогов пин A4 (на Arduino Uno)

Свързване на OLED дисплея SSD1306:

  • VCC към 3.3V или 5V (зависи от конкретния модел на дисплея)
  • GND към GND
  • SCL към A5 (ако използваме същата I2C шина)
  • SDA към A4 (същата I2C шина)

Нагледно свързване на компонентите е представена в началната картинка на статията “Arduino проект за измерване на температура и налягане с BMP180 и OLED SSD1306“, а статията ни с ревю на Arduino UNO ще ви помогне за правилното свързване на компонентите.

Използвани библиотеки

Този проект използва следните библиотеки:

  1. Adafruit BMP085 – за работа с BMP180 сензора.
  2. Adafruit GFX – графична библиотека за рендиране на текст и графики на OLED дисплея.
  3. Adafruit SSD1306 – библиотека за контрол на SSD1306 OLED дисплея.

За да инсталирате тези библиотеки, отворете Arduino IDE, отидете на Sketch -> Include Library -> Manage Libraries и потърсете всяка от тези библиотеки, след което кликнете върху Install. Може да свалите тези библиотеки от нашите статии за управление на OLED SSD1306 и BMP180 с Arduino:

Също така може да ги намерите в GitHub: Adafruit Industries

Код за измерване на температура и налягане с BMP180, OLED SSD1306 и Arduino

#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Дефиниции за OLED дисплея
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Дефиниции за BMP180
Adafruit_BMP085 bmp;

void setup() {
  // Инициализация на серийна комуникация
  Serial.begin(9600);

  // Инициализация на OLED дисплея
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  
  // Инициализация на BMP180 сензора
  if (!bmp.begin()) {
    Serial.println("BMP180 sensor not found, check wiring!");
    while (1);
  }

  // Начален екран на OLED дисплея
  display.setTextSize(1);
  display.setCursor(5, 20);
  display.println("WWW.ARDUDEVELOP.EU");
  display.setCursor(20, 40);
  display.println("BMP180 + OLED");
  display.display();
  delay(3000); // Изчакване за начален екран
}

void loop() {
  // Четене на данните от BMP180
  float temperature = bmp.readTemperature();
  float pressure = bmp.readPressure() / 100.0; // Превръщане на налягането в хектопаскали (hPa)
  float altitude = bmp.readAltitude(101500);

  // Принтиране в серийния монитор
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" *C");

  Serial.print("Pressure: ");
  Serial.print(pressure);
  Serial.println(" hPa");

  // Показване на данните на OLED дисплея
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 5);
  display.print("Temp: ");
  display.print(temperature);
  display.println(" *C");

  display.setCursor(0, 20);
  display.print("Press: ");
  display.print(pressure);
  display.println(" hPa");

  display.setCursor(0, 35);
  display.print("Alti: ");
  display.print(altitude);
  display.println(" meters");

  display.display(); // Обновяване на дисплея

  delay(2000); // Определено време за обновяване на данните
}

Пълно обяснение на кода

Библиотеки и дефиниции

Първо, включваме необходимите библиотеки за работа с BMP180 и OLED дисплея. Дисплеят се дефинира със своите размери и I2C адрес.

  • Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); – Създаваме обект за контрол на OLED дисплея.
  • Adafruit_BMP085 bmp; – Създаваме обект за работа с BMP180 сензора.

setup() функция

В тази функция се инициализират серийната комуникация, OLED дисплея и BMP180 сензора.

  1. Serial.begin(9600); – Стартираме серийния монитор, за да можем да наблюдаваме данните в реално време.
  2. display.begin() – Инициализира OLED дисплея. Ако не успее, изписва съобщение за грешка.
  3. bmp.begin() – Инициализира BMP180. Ако сензорът не бъде открит, се показва грешка и програмата спира.

Начален екран на OLED дисплея

След успешната инициализация се показва начален екран с текст, който се задържа за 3 секунди.

loop() функция

Функцията loop() изпълнява следните стъпки на всеки цикъл:

  1. Четене на температура: float temperature = bmp.readTemperature();
    • Тази команда използва библиотеката на BMP180, за да изчете текущата температура от сензора. Стойността се съхранява във float променлива, която представлява температурата в градуси по Целзий.
  2. Четене на налягането: float pressure = bmp.readPressure() / 100.0;
    • Тук изчитаме атмосферното налягане от BMP180, което по подразбиране е в паскали (Pa). За по-удобно четене, стойността се преобразува в хектопаскали (hPa), като се дели на 100.
  3. Изчисляване на надморската височина: float altitude = bmp.readAltitude(101500);
    • Тази команда използва налягането, измерено от сензора, за да изчисли надморската височина в метри. Функцията readAltitude() приема като параметър налягането при морското равнище, което в този пример е зададено на 101500 Паскала (или 1015 hPa).

След като съберем тези данни, те се отпечатват в серийния монитор и също така се показват на OLED дисплея.

  1. Изчистване на дисплея: display.clearDisplay();
    • Тази команда изчиства екрана на OLED дисплея, премахвайки предишните данни, за да може новата информация да се изобрази правилно.
  2. Задаване на размер на текста: display.setTextSize(1);
    • Командата задава размера на текста, който ще се изобрази на екрана. В този случай е зададен размер 1, което означава нормален текст.
  3. Позициониране на текста: display.setCursor(0, 5);
    • Тази команда определя координатите (0, 5), където ще се започне да се пише текстът на екрана. В този случай, курсорът се позиционира в горния ляв ъгъл на дисплея.
  4. Отпечатване на данните на екрана: display.print("Temp: "); display.print(temperature); display.println(" *C");
    • Тук командата print() отпечатва текста “Temp: “, следван от измерената температура temperature. Командата println() добавя символа “°C” и пренася курсора на нов ред.

Следва подобен процес за изобразяване на налягането и надморската височина:

  • Налягането се показва на следващия ред, като се използват същите функции setCursor(), print(), и println(), но с различни координати и текст.
  • Надморската височина се изобразява по същия начин, като се използват подходящи координати и текст.

Това забавяне от 2 секунди между цикли дава време на потребителя да прочете информацията на екрана преди тя да бъде обновена с нови данни.

Обновяване на дисплея: display.display();

Тази команда изпраща всички подготвени за показване данни към OLED дисплея, като обновява неговото съдържание.

Забавяне преди следващото обновяване: delay(2000);

Заключение

Този проект е отличен пример за това как можем да интегрираме сензор за околната среда и дисплей за визуализация на данни с помощта на Arduino. BMP180 предоставя прецизни измервания на температура, налягане и надморска височина, а OLED дисплеят ги показва в компактен и удобен формат. Този проект е чудесна основа за изграждане на собствена метеорологична станция или мониторинг на атмосферни условия.

Translate »