Zegar z czujnikiem temperatury i wilgotności
Projekt, który łączy w sobie zegar RTC na popularnym układzie SD1307 (pdf) oraz czujnik temperatury i wilgotności DHT-11 o zakresie pracy : 0 do 50 st. C (co kwalifikuje go raczej do mniej wymagających zastosowań wewnątrz pomieszczeń). Wyniki prezentowane są na wyświetlaczu OLED SSD1306 z magistralą I2C. Z uwagi na rozmiar zastosowanego wyświetlacza, jego praktyczne zastosowanie jest raczej ograniczone, ale publikuję jako przykład użycia w innych Waszych projektach…
Schemat układu (odręczny) :
Prototypowy układ z wykorzystaniem Arduino Nano I/O expantion Shield :
Kod :
// Odczyt wilgotnosci/temp na DHT11 // OLED I2C 128x64 + Arduino NANO V3 #include "DHT.h" // biblioteka DHT #include "U8glib.h" // bibioteka OLED I2C #include "RTClib.h" // uRTCLib U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // konstruktor OLED RTC_DS1307 rtc; #define DHTPIN 2 // definicja PIN dla DHT #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE, 6); // deklaracja DHT char str[10]; float WILG; // zmienna wilgotnosc float TEMP; // zmienna temperatura w stopniach C // adresy dla modułu RTC + EEPROM - w moim układzie : rtc 0x50, eeprom 0x56 // ewentualna zmiana adresów - wewnątrz RTClib.h void setup() { // kod nie przewiduje zewnetrznej zmiany/ustawienia RTC // uproszczony uklad nie został wyposazony w Switch`e do programowania // wpisanie wartosci startowych wykonuje ponizsza linia - odkomentowac przy zapisie do RTC //rtc.adjust(DateTime(2017, 02, 13, 8, 44, 0)); dht.begin(); // inicjalizacja DHT // poniższy fragment mozna pominac - INTRO u8g.firstPage(); do { u8g.setFont(u8g_font_unifont); u8g.drawStr( 6, 25, "DHT11 & DS1307"); u8g.setFont(u8g_font_profont29); u8g.drawStr( 6, 58, "ywd.pl"); } while( u8g.nextPage() ); delay(3000); // koniec INTRO } // glowna petla programu void loop() { delay(100); // odczekaj - pomiar trwa ok 250 mS WILG = dht.readHumidity(); // odczytaj wilgotnosc TEMP = dht.readTemperature(); // odczytaj temp DateTime now = rtc.now(); // zassaj aktualna wartosc data/time z RTC // petla obrazu u8g.firstPage(); do { u8g.setFont(u8g_font_profont29); // wieksza czcionka na uzytek wysw. godziny u8g.setPrintPos(0, 26); // pozycja w px - kolumna/linia if (now.hour() > 9) // jesli wartosc godzin > 9.00 wyswietl jak leci { u8g.print(now.hour(), DEC); } else // jesli mniejsza lub = 9.00 dopisz "0" z przodu { u8g.print("0"); u8g.print(now.hour(), DEC); } u8g.print(":"); // dopisz ":" if (now.minute() > 9) // to samo co powyzej tylko dla minut { u8g.print(now.minute(), DEC); } else { u8g.print("0"); u8g.print(now.minute(), DEC); } u8g.print(":"); if (now.second() > 9) // to samo co wyzej tylko dla sekund { u8g.print(now.second(), DEC); } else { u8g.print("0"); u8g.print(now.second(), DEC); } u8g.setFont(u8g_font_helvB08); // ustaw mniejsza czcionke u8g.drawStr( 2, 47, "Wilgotnosc :"); // w pozycji 2/47 wyswietl txt u8g.drawStr( 80, 47, dtostrf(WILG, 5, 2, str)); // w pozycji 80/47 wartosc wilgotnosci u8g.drawStr( 120, 47, "%"); // w pozycji 120/47 dopisz symbol % u8g.drawStr( 0, 62, "Temperatura :"); // analogicznie tylko w innej linii - temp u8g.drawStr( 80, 62, dtostrf(TEMP, 5, 2, str)); u8g.drawStr( 120, 62, "\260C"); } while( u8g.nextPage() ); // koniec petli obrazu }