Sestava

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

komponenty

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í !!!

zapojeni

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

FB tw

Další podobné články