Pokojový teploměr

Zdravím všechny Arduino příznivce a představuji vám můj skromný pokojový teploměr.

Jelikož se kvůli mému poměrně výkonnému počítači často stávalo, že se v místnosti vytopilo až na 30° C, rozhodl jsem se, že si postavím menší kontrolní teploměr, kolik stupňů je zrovna v pokoji.

Motivovala mě hlavně představa, že si budu regulovat teplotu pomocí otvírání okna, nebo podobně, ale zatím si musím vystačit s tímto mini teploměrem.

Teď už ale k věci:

Začal jsem tím, že jsem si v Autodesk Inventoru navrhl krabičku, pro ty co nemají Inventor doporučuji webový CAD ONSHAPE, je zdarma a intuitivní.

 

přikládám případný soubor stl. Není to perfektní, jsem amatér, ale stačí. (soubor ke stažení dole poz. red.)

Program:

Použil jsem knihovny:

  • <Wire.h>
  • <Adafruit_AHTX0.h> - K AHT10 senzoru
  • <Adafruit_GFX.h> - podpůrný Adafruit driver
  • <Adafruit_SSD1306.h> - K displeji

Program je vcelku jednoduchý,
Každých 10 sekund přečte hodnotu z adresy senzoru a vypíše ji na displej.  Pro okrasu je zde i malá uvítací animace při zapnutí teploměru.

Kód pro arduino:

#include <Wire.h>
#include <Adafruit_AHTX0.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_AHTX0 aht;

float lastTemp = -1000;
float lastHum = -1000;

void showWelcomeAnimation() {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(20, 5);
    display.println("Vitej, Priteli");
    display.display();
    delay(1500);

    int barWidth = 108;
    int barHeight = 6;
    int barX = 10;
    int barY = 22;

    display.drawRect(barX, barY, barWidth, barHeight, SSD1306_WHITE);
    display.display();
    
    for (int i = 0; i <= barWidth; i += 5) {
        display.fillRect(barX + 1, barY + 1, i, barHeight - 2, SSD1306_WHITE);
        display.display();
        delay(30);
    }
    delay(500);
    display.clearDisplay();
    display.display();
}

void setup() {
    Serial.begin(9600);
    Wire.begin();

    if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
        Serial.println("SSD1306 nenalezen!");
        while (1);
    }
    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);

    if (!aht.begin()) {
        Serial.println("AHT10 nenalezen!");
        while (1);
    }

    showWelcomeAnimation();
}

void loop() {
    sensors_event_t humidity, temp;
    aht.getEvent(&humidity, &temp);

    // Kontrola platnosti hodnot
    if (isnan(temp.temperature) || isnan(humidity.relative_humidity) || temp.temperature < -40 || temp.temperature > 80 || humidity.relative_humidity < 0 || humidity.relative_humidity > 100) {
        Serial.println("Chyba cteni ze senzoru AHT10!");
        return;
    }

    float teplota = round(temp.temperature * 10) / 10.0; // Zaokrouhlení na 1 desetinné místo
    float vlhkost = round(humidity.relative_humidity * 10) / 10.0;

    Serial.print("Teplota: ");
    Serial.print(teplota);
    Serial.println(" °C");
    Serial.print("Vlhkost: ");
    Serial.print(vlhkost);
    Serial.println(" %");

    // Aktualizuj displej pouze pokud se změnila hodnota
    if (teplota != lastTemp || vlhkost != lastHum) {
        display.clearDisplay();

        // Velký text pro teplotu
        display.setTextSize(3);
        display.setCursor(10, 1);
        display.print(teplota, 1);
        display.print(" C");

        // Menší text pro vlhkost
        display.setTextSize(1);
        display.setCursor(10,25);
        display.print("Vlhk: ");
        display.print(vlhkost, 1);
        display.print(" %");

        display.display();
        lastTemp = teplota;
        lastHum = vlhkost;
    }

    delay(10000);
}

Použité součástky:

Typově podobný teploměr:

Další podobné články

OVLÁDÁNÍ VÍCE RELÉ S NEOPIXEL RGB ARDUINEM

Kamarád mi poprosil o pomoc s tím že v současnosti potřebuje v jednom projektu ovládat čtyři reléové moduly, kdy jeden obsahuje šestnáct relátek které zakoupil v [1] a již má hotovou část zapojení přípravku, s tím že časem by chtěl ovládání z PC „po otestování“, ovládat diody pomocí tabletu nebo chytrého telefonu. Na tento počet ovládání relé je potřeba 64 ovládacích pinů, což ani ARDUINO MEGA 2560 s potřebou dalších vstupů které budou potřeba není možné použít. Po návrzích s posuvnými registry kterých by bylo potřeba osm kusů a složitosti zapojení mi napadlo použít pásek NEOPIXEL  s RGB led diodami kdy na ovládání stačí jeden výstup z ARDUINA. Tak že pro pokusy co a jak půjde použít, jsem použil modul relátek osazený dvěma relátky, modul s MOSFET tranzistorem, Neopixel pásek s osmi RGB led diodami WS2812B, fototranzistor GL5528 a bluetooth JDY-33 pro komunikaci s tabletem chytrým telefonem vše zakoupené v [1]. Napsané programy jsou celkem dva jeden pouze pro ovládání Neopixel s osmi RGB led diodami, druhý pak umožňuje ovládat maximálně 255 RGB led použitých v Neopixel pásku. Oba programy umožňují ovládat libovolnou RGB diodu nebo více RGB led diod na Neopixel pásku včetně barev a dají se upravit dle potřeby. Přípravek může posloužit při vlastních pokusech s RGB LED Neopixel pásky a zároveň doplňuje články v [2]. Ovládání RGB diod je zde řešeno s ARDUINO NANO je možné použít i ARDUINO UNO. Programové ovládání RGB led diod na Neopixel pásku je dle požadavků kamaráda.