LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

[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:

Autor: Patryk Mądry