[PROJEKT] Stacja pogodowa na Arduino – moduł z czujnikiem BME280 oraz wyświetlacz 2×16 znaków
Teraz można zaprogramować płytkę Arduino. Pierwszym krokiem jest instalacja niezbędnych bibliotek. Należy pobrać bibliotekę do obsługi wyświetlacza 2×16 znaków z podświetleniem RGB (dostępna jest ona na portalu oraz na dole artykułu, w sekcji „do pobrania”) oraz bibliotekę do obsługi czujnika BME280 (dostępna na portalu Github, odpowiednio pod linkiem i linkiem, a także na na dole artykułu, w sekcji „do pobrania”). Instalacja biblioteki odbywa się w sposób standardowy – w programie Arduino IDE należy otworzyć menu Szkic >> Dołącz bibliotekę >> Dołącz bibliotekę .ZIP i wybrać pobrane biblioteki znajdujące się na dysku twardym.
Po instalacji bibliotek można przystąpić do napisania programu, który odczyta informacje o temperaturze, wilgotności oraz ciśnieniu z układu BME280, a następnie wyświetli wyniki pomiarów na wyświetlaczu 2×16. Pełen kod programu znajduje się w sekcji „do pobrania” na dole artykułu. Teraz przyjrzę się bliżej temu programowi.
Pierwszym krokiem jest załączenie bibliotek do obsługi podłączonych modułów:
#include <DFRobot_BME280.h> #include <Wire.h> #include "DFRobot_RGBLCD.h"
Następnie zadeklarowano zmienne oraz definicje:
int r,g,b; float temp, pa, hum, alt; int t=0; #define SEA_LEVEL_PRESSURE 1009.7f #define BME_CS 10
Zadeklarowane zostały zmienne odpowiedzialne za kolor podświetlenia wyświetlacza 2×16 znaków (r, g, b), zmienne, w których będą przechowywane wyniki pomiarów z czujnika BME280 (temp – temperatura, pa – ciśnienie, hum – wilgotność) oraz zmienna alt, gdzie przechowywana jest wysokość nad poziomem morza obliczona na podstawie ciśnienia. Do tego celu potrzebna jest informacja o aktualnym ciśnieniu na poziomie morza, można ją przyjąć na poziomie około 1009.4 hPa. Należy ją następnie umieścić w definicji SEA_LEVEL_PRESSURE.
Następnie należy zainicjować działanie bibliotek dla obu modułów (z czujnikiem BME280 oraz z wyświetlaczem 2×16 znaków)
DFRobot_BME280 bme; DFRobot_RGBLCD lcd(16,2);
W funkcji konfiguracyjnej setup() ustawiono prędkość transmisji portu szeregowego – odczytane dane z czujnika będą również przesyłane w ten sposób. Sprawdzana jest także komunikacja z układem BME280 (domyślnie układ posiada adres 0x77), jeżeli moduł nie zostanie wykryty, na port szeregowy wysyłany jest komunikat. Inicjowane jest też działanie wyświetlacza.
void setup() { Serial.begin(115200); if (!bme.begin(0x77)) { Serial.println("No sensor device found, check line or address!"); while (1); } lcd.init(); }
Na początku pętli głównej programu do zmiennych (temp, pa, hum, alt) zapisywane są wartości zmierzone przez czujnik BME280.
void loop() { //Odczyt danych z czujnika temp = bme.temperatureValue(); pa = bme.pressureValue(); hum = bme.humidityValue(); alt = bme.altitudeValue(SEA_LEVEL_PRESSURE);
Następnie wartości te przesyłane są przez port szeregowy, co umożliwia ich odczyt za pomocą monitora portu szeregowego.
//Odczyt danych z czujnika temp = bme.temperatureValue(); pa = bme.pressureValue(); hum = bme.humidityValue(); alt = bme.altitudeValue(SEA_LEVEL_PRESSURE); //Wypisane danych do konsoli Serial.print("Temperatura: "); Serial.print(temp); Serial.println(" C"); Serial.print("Cisnienie: "); Serial.print(pa/1000); Serial.println(" hPa"); Serial.print("Wilgotnosc: "); Serial.print(hum); Serial.println(" %"); Serial.print("Wysokosc n.p.m: "); Serial.print(alt); Serial.println(" m");
Po wgraniu programu na płytkę oraz otwarciu monitora portu szeregowego zobaczymy następujący widok:
Rys 6. Wyświetlone informacje o zmierzonej temperaturze, ciśnieniu, wilgotności oraz wysokości n.p.m w monitorze portu szeregowego
W dalszej części programu dane są wypisywane na wyświetlacz LCD. Ze względu na wielkość wyświetlacza, najpierw na ekranie jest wyświetlana zmierzona temperatura oraz ciśnienie. Zmierzoną wartość ciśnienia można wyskalować w hektopaskalach (hPa) dzieląc wartość przez 100. Wyświetlacz został podświetlony na kolor niebieski, ale dzięki możliwości wyboru kolory podświetlania w module, można uzależnić jego kolor od zmierzonej wartości np. temperatury.
// Wyswielacz lcd.setRGB(0, 0, 200); lcd.setCursor(0,0); lcd.print("Temp: "); lcd.print(temp); lcd.print(" C"); lcd.setCursor(0,1); lcd.print("P: "); lcd.print(pa/100); lcd.print(" hPa"); delay(7000);
Następnie na wyświetlaczu zostanie wyświetlane zmierzona wartość wilgotności oraz obliczona wysokość nad poziomem morza. Podświetlenie wyświetlacza tym razem zostało ustawione na kolor zielony. Oba ekrany są wyświetlane kolejno przez 7 sekund, następnie pętla wykonuje się od początku.
lcd.setRGB(0, 200, 0); lcd.setCursor(0,0); lcd.print("Hum: "); lcd.print(hum); lcd.print(" %"); lcd.setCursor(0,1); lcd.print("Alt: "); lcd.print(alt); lcd.print(" m"); delay(7000); }
Działanie programu zostało przedstawione na wideo poniżej: