![Измерване на температура и налягане с BMP180, OLED SSD1306 и Arduino](http://ardudevelop.eu/wp-content/uploads/2024/10/Arduino-проект-за-измерване-на-температура-и-налягане-с-BMP180-и-OLED-SSD1306.png)
Въведение
В този проект ще съчетаем два мощни компонента – барометричния сензор 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 ще ви помогне за правилното свързване на компонентите.
Използвани библиотеки
Този проект използва следните библиотеки:
- Adafruit BMP085 – за работа с BMP180 сензора.
- Adafruit GFX – графична библиотека за рендиране на текст и графики на OLED дисплея.
- Adafruit SSD1306 – библиотека за контрол на SSD1306 OLED дисплея.
За да инсталирате тези библиотеки, отворете Arduino IDE, отидете на Sketch -> Include Library -> Manage Libraries и потърсете всяка от тези библиотеки, след което кликнете върху Install. Може да свалите тези библиотеки от нашите статии за управление на OLED SSD1306 и BMP180 с Arduino:
- BMP085 и Arduino: измерване на температура, налягане и височина
- Управление на OLED SSD1306 дисплей с Arduino UNO
Също така може да ги намерите в 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 сензора.
- Serial.begin(9600); – Стартираме серийния монитор, за да можем да наблюдаваме данните в реално време.
- display.begin() – Инициализира OLED дисплея. Ако не успее, изписва съобщение за грешка.
- bmp.begin() – Инициализира BMP180. Ако сензорът не бъде открит, се показва грешка и програмата спира.
Начален екран на OLED дисплея
След успешната инициализация се показва начален екран с текст, който се задържа за 3 секунди.
loop()
функция
Функцията loop()
изпълнява следните стъпки на всеки цикъл:
- Четене на температура:
float temperature = bmp.readTemperature();
- Тази команда използва библиотеката на BMP180, за да изчете текущата температура от сензора. Стойността се съхранява във float променлива, която представлява температурата в градуси по Целзий.
- Четене на налягането:
float pressure = bmp.readPressure() / 100.0;
- Тук изчитаме атмосферното налягане от BMP180, което по подразбиране е в паскали (Pa). За по-удобно четене, стойността се преобразува в хектопаскали (hPa), като се дели на 100.
- Изчисляване на надморската височина:
float altitude = bmp.readAltitude(101500);
- Тази команда използва налягането, измерено от сензора, за да изчисли надморската височина в метри. Функцията
readAltitude()
приема като параметър налягането при морското равнище, което в този пример е зададено на 101500 Паскала (или 1015 hPa).
- Тази команда използва налягането, измерено от сензора, за да изчисли надморската височина в метри. Функцията
След като съберем тези данни, те се отпечатват в серийния монитор и също така се показват на OLED дисплея.
- Изчистване на дисплея:
display.clearDisplay();
- Тази команда изчиства екрана на OLED дисплея, премахвайки предишните данни, за да може новата информация да се изобрази правилно.
- Задаване на размер на текста:
display.setTextSize(1);
- Командата задава размера на текста, който ще се изобрази на екрана. В този случай е зададен размер 1, което означава нормален текст.
- Позициониране на текста:
display.setCursor(0, 5);
- Тази команда определя координатите (0, 5), където ще се започне да се пише текстът на екрана. В този случай, курсорът се позиционира в горния ляв ъгъл на дисплея.
- Отпечатване на данните на екрана:
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 дисплеят ги показва в компактен и удобен формат. Този проект е чудесна основа за изграждане на собствена метеорологична станция или мониторинг на атмосферни условия.