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: