Zkusíme si ukázat, jak netradičně využít LED matrix, který je většinou používán jako posuvný displej. Na toto využití určitě naleznete na internetu spoustu tutoriálů, a proto si zkusíme udělat něco jiného.
Co budeme potřebovat?
- Wemos D1 mini
- DHT 11
- Displej modul MAX7219 8x32
Jako desku jsem zvolil Wemos D1 mini, a to z důvodů, že projekt budu chtít následně využívat trochu jinak a bude potřeba připojení do LAN sítě. Další důvod jsou rozměry desky, které jsou proti Arduino UNO znatelně menší. Poslední důvod byl, že těchto desek mám nadbytek.
Použil jsem červenou LED matici MAX7219 v rozměru 8x32. Vlastně jsou to za sebou zapojené 4 matice 8x8, ale hodilo se mi, že je to na jedné PCB desce.
Poslední komponenta je DHT 11. Jedná se snad o nejznámější čidlo na světě. Kromě teploty měří taky vlhkost v ovzduší. Zvolil jsem 11ku z důvodů, že teploměr hodlám využívat v domácím prostředí a tam mi teplotní DHT 11 rozsah stačí.
Schéma zapojení:
Jdeme programovat
V první části si připojíme knihovny v mém případě DHT.h a LedControl.h. Následně zadeklaruji pár konstant:
- teplota_min, teplota_max - tyto konstanty nám udávají hranice, při kterých se bude teplota zobrazovat
- numDevices = počet zapojených LED modulů.
- DHT_PIN = Pin pro komunikaci DHT11
- DHTTYPE = Určuje typ čidla (11/22)
Následně jsou zadeklarovány objekty:
V setupu toho moc není. Nastavení sériové komunikace a displeje (zde se musí každý nastavit zvlášť, proto byl použit cyklus.
Poslední část kódu je samotný loop. Princip je postaven na několika do sebe vložených cyklů. První, co se stane, že si zjistíme aktuální teplotu z čidla, poté se hodnota převede na celé číslo. Protože máme na displeji omezený prostor, nemůžeme zobrazit všechny hodnoty, ale pouze jen úsek (maximálně 32 řádků – 32 stupňů). Kvůli čitelnosti z dálky jsem si zvolil, že jeden stupeň jsou 2 řádky. Odečteme tedy z aktuální teploty minimální teplotu. Například 25- 17 = 8 -> budeme tedy zobrazovat na displeji 8 stupňů (16 řad). Na konci vymažeme všechny displeje.
Nyní máme hotovo. Je zde spoustu věcí, které by šly editovat/vylepšit. Například ukazovat desetinná čísla, adaptace na světlo venku, nebo zobrazení vločky/slunka při nedosažení či překročení hraničních teplot.
Celý použitý kód:
#include <DHT.h> #include "LedControl.h" const int teplota_min = 17; const int teplota_max = 32; const int numDevices = 4; const int DHT_PIN = 4; #define DHTTYPE DHT11 ; // DHT 11 DHT dht(DHT_PIN, DHT11); /*D7,D5,D6,4*/ LedControl lc=LedControl(13,14,12,numDevices); void setup() { Serial.begin(115200); for (int x=0; x<numDevices; x++) { lc.shutdown(x,false); // Zapnutí lc.setIntensity(x,4); // Nastavení svítivosti lc.clearDisplay(x); // pročistění displeje } } void loop() { int i = 1; float tx = dht.readTemperature(); //ziskaní teploty Serial.print("Teplota: "); int teplota =(int)tx; // převod floatu na Int Serial.println(String(teplota)); //výpis do Seriové konzole. int t = 0; // pomocná promenna int pocet_rad = 0; if (teplota > teplota_min && teplota< teplota_max) { t = teplota - teplota_min; // ziskaní rozdlů pocet_rad = t *2; // aby byl teploměr čitelný i z dálky, zvolil jsem že jeden stupeň budou dva řádky for (int d = 3; d>=0; d--) { for (int row=0; row<8; row++) { if (i<=pocet_rad) { for (int col=0; col<8; col++) //cyklus rada { lc.setLed(d,col,row,true); //zapnutí diody } } i++; } } } delay(5000); lc.clearDisplay(3); lc.clearDisplay(2); lc.clearDisplay(1); lc.clearDisplay(0); }
V budoucnu doplním o 3D model, aby nezůstal teploměr v šuplíku.