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
}