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
}