Tento projekt slouží k měření teploty, tlaku a času a k jejich zobrazení na OLED displeji. Současně data vypisuje na sériovou linku. Kód využívá několik knihoven: Wire.h pro komunikaci přes I2C sběrnici, Adafruit_Sensor.h a Adafruit_BMP280.h pro práci se senzorem BMP280, RTClib.h pro ovládání RTC modulu DS3231 a U8glib.h pro řízení OLED displeje.
Kód pro Arduino:
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> #include <RTClib.h> #include "U8glib.h" // Adresy zařízení na I2C sběrnici #define BMP280_ADRESA (0x76) // Inicializace zařízení Adafruit_BMP280 bmp; // Senzor BMP280 RTC_DS3231 rtc; // RTC modul U8GLIB_SSD1306_128X64 mujOled(U8G_I2C_OPT_NONE); // OLED displej // Proměnné pro korekci tlaku int korekce = 32; void setup() { Serial.begin(9600); // Inicializace BMP280 if (!bmp.begin(BMP280_ADRESA)) { Serial.println("BMP280 senzor nenalezen, zkontrolujte zapojeni!"); while (1); } // Inicializace RTC modulu if (!rtc.begin()) { Serial.println("RTC modul nenalezen, zkontrolujte zapojeni!"); while (1); } // Nastavení času (odkomentujte tento řádek při prvním nahrání, pak opět zakomentujte) rtc.adjust(DateTime(2024, 1, 15, 21, 33, 30)); } void loop() { // Získání hodnot z BMP280 float teplota = bmp.readTemperature(); float tlak = (bmp.readPressure() / 100.00) + korekce; // Získání času a data z RTC DateTime now = rtc.now(); // Výpis na sériovou linku (pro kontrolu) Serial.print("Datum: "); Serial.print(now.day()); Serial.print("/"); Serial.print(now.month()); Serial.print("/"); Serial.print(now.year()); Serial.print(" Čas: "); Serial.print(now.hour()); Serial.print(":"); Serial.print(now.minute()); Serial.print(":"); Serial.println(now.second()); Serial.print("Teplota: "); Serial.print(teplota); Serial.println(" °C"); Serial.print("Tlak: "); Serial.print(tlak); Serial.println(" hPa"); Serial.println(); // Aktualizace displeje mujOled.firstPage(); do { vykresliDisplej(now, teplota, tlak); } while (mujOled.nextPage()); delay(1000); } void vykresliDisplej(DateTime now, float teplota, float tlak) { mujOled.setFont(u8g_font_unifont); // Zobrazení data mujOled.setPrintPos(0, 10); mujOled.print("Datum: "); mujOled.print(now.day()); mujOled.print("/"); mujOled.print(now.month()); // Zobrazení času mujOled.setPrintPos(0, 25); mujOled.print("Cas: "); mujOled.print(now.hour()); mujOled.print(":"); if (now.minute() < 10) mujOled.print("0"); // Přidání 0 pro jednociferné minuty mujOled.print(now.minute()); mujOled.print(":"); if (now.second() < 10) mujOled.print("0"); // Přidání 0 pro jednociferné sekundy mujOled.print(now.second()); // Zobrazení teploty mujOled.setPrintPos(0, 40); mujOled.print("Teplota: "); mujOled.print(teplota); mujOled.print(" C"); // Zobrazení tlaku mujOled.setPrintPos(0, 55); mujOled.print("Tlak: "); mujOled.print(tlak); mujOled.print(" hPa"); }
Na začátku jsou definovány adresa senzoru BMP280 a objekty pro jednotlivé komponenty. Dále je nastavena korekce tlaku, aby se hodnoty mohly přepočítat na tlak přepočtený na hladinu moře. V části setup se inicializuje sériová komunikace a kontroluje správné zapojení senzoru BMP280 a RTC modulu. Je zde také možnost jednorázově nastavit aktuální čas na RTC modul.
V hlavní smyčce loop kód získává hodnoty z BMP280 a RTC. Tyto hodnoty, tedy teplotu, tlak, datum a čas, vypisuje na sériovou linku a zároveň je zobrazuje na OLED displeji. K vykreslení údajů na displeji se používá funkce mujOled.print, která zajišťuje formátování a přehledné zobrazení.
Komponenty:
- OLED displej 128x64
- RTC snímač času DS3231
- Teploměr, tlakoměr BMP280
Celý projekt je navržen tak, aby umožnil vytvořit jednoduchou meteostanici. Zapojte každý komponent takto: VCC – 3V3, SDA – A4, SCL, - A5 a GND – GND.
!!! Po zapojení při prvním nahrání kódu musíte řádek:
rtc.adjust(DateTime(2024, 1, 15, 21, 33, 30));
upravit na aktuální čas, po nahrání můžete zkomentovat (přidat // na začátek řádku)
a tím snímač času bude mít aktuání čas dokud bude napájen baterií !!!
Příklad sériového výstupu:
Datum: 19/1/2025 Čas: 10:35:15
Teplota: 21.45 °C
Tlak: 1013.25 hPa
Datum: 19/1/2025 Čas: 10:35:16
Teplota: 21.45 °C
Tlak: 1013.25 hPa