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