Čas a teplota na oled displeji

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

Další podobné články

ROBOTICKÉ RAMENO

Stavebnice obsahuje všechny potřebné díly na sestavení robotnického ramene včetně spojovacího materiálu, pouze je nutné dokoupit čtyři kusy MIKRO SERV SG90. Dále je nutné dokoupit řídící jednotku já jsem použil domácí zásoby ARDUINO NANO a pro něho pak modul ARDUINO NANO IO SHIELD pro jednoduchost zapojení. Díly pro sestavení ramene jdou dobře tzv. vylamovat „vypadávají skoro sami. K servům pokud použijete nové tak doporučuji je před montáží odzkoušet zda jsou funkční v plném rozsahu tj. od 0° do 180°, po namontování a zjištění že servo nefunguje to pak opravdu dost zahýbá s nervy. 

Electronic TiltMaze

Cílem tohoto projektu je vytvoření jednoduchého ovládacího systému, který umožňuje naklápění dvou servomotorů pomocí analogového joysticku. Platforma řízená servomotory může simulovat pohyb například v ose X a Y — tedy naklánění doleva/doprava a dopředu/dozadu. Tento systém může sloužit jako základ pro různé aplikace:

- Manuální ovládání kamery nebo senzoru (např. na pohyblivé konstrukci nebo robotovi)
- Interaktivní ovládací panel pro školní projekty nebo herní ovladač