Witam,
mam pomysł na stworzenie zegarka do mojego biurka, który będzie wyświetlał czas, datę, temperaturę, wilgotność, ciśnienie atmosferyczne, poziom CO2 w pokoju. Jestem na etapie wyświetlania czasu, daty i pomiaru temperatury.
Część odpowiedzialną za czas i datę oparłem o moduł DS3231. Mam problem z przeskakującymi sekundami ( niekiedy co 2 sekundy). Czytałem o przeskakiwaniu sekund w google ale nie rozumiem o co tam chodzi. Nie wiem gdzie robię błąd.
Oto kod:
mam pomysł na stworzenie zegarka do mojego biurka, który będzie wyświetlał czas, datę, temperaturę, wilgotność, ciśnienie atmosferyczne, poziom CO2 w pokoju. Jestem na etapie wyświetlania czasu, daty i pomiaru temperatury.
Część odpowiedzialną za czas i datę oparłem o moduł DS3231. Mam problem z przeskakującymi sekundami ( niekiedy co 2 sekundy). Czytałem o przeskakiwaniu sekund w google ale nie rozumiem o co tam chodzi. Nie wiem gdzie robię błąd.
Oto kod:
Kod:
#include &tTimerOne.h&t
#include &tWire.h&t
#include &tDS3231.h&t
#include &tLiquidCrystal_I2C.h&t
#include &tOneWire.h&t
#include &tDallasTemperature.h&t
//////////////////Do czujnika/////////////////////////////
int temperatura;
const byte oneWireBus = 11; // Tutaj jest określony port magistrali 1-wire.
OneWire oneWire(oneWireBus); // Tutaj definiuje się port magistrali dla biblioteki.
DallasTemperature sensors(&oneWire); // Teraz można już przekazać bibliotece obsługi termometru namiary na bibliotekę obsługi magistrali.
///////////////////////////////////////////////
//////////////////Do wyświetlacza/////////////////////////////
LiquidCrystal_I2C lcd(0x27, 20, 4);
////////////////////////////////////////////////////////
//////////////////Do Zegara/////////////////////////////
DS3231 clock;
RTCDateTime dt;
///////////////////////////////////////////////
void setup()
{
//////////////////Do czyjnika/////////////////////////////
sensors.begin();
///////////////////////////////////////////////
//////////////////Do wyświetlacza/////////////////////////////
lcd.begin();
lcd.backlight();
///////////////////////////////////////////////
//////////////////Do zegara/////////////////////////////
clock.begin();
clock.setDateTime(__DATE__, __TIME__);
//////////////////Do przerwania/////////////////////////////
Timer1.initialize(500000);
Timer1.attachInterrupt(Temperatura);
//////////////////////////////////////////////
}
void loop()
{
//////////////////////////////////Zegarek//////////////////////////////////////
dt = clock.getDateTime();
lcd.setCursor(0, 0);
if (dt.hour &t 10 )
{
lcd.print(F(" "));
}
lcd.print(dt.hour);
lcd.print(F(":"));
if (dt.minute &t 10 )
{
lcd.print(F("0"));
}
lcd.print(dt.minute);
lcd.print(F(":"));
if (dt.second &t 10 )
{
lcd.print(F("0"));
}
lcd.print(dt.second);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////Data do zegarka///////////////////////////////
lcd.setCursor(0, 1);
lcd.print(dt.day);
lcd.print(F("/"));
lcd.print(dt.month);
lcd.print(F("/"));
lcd.print(dt.year);
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////Do Temperatury//////////////////////////////////////////////////////
lcd.setCursor(0, 2);
lcd.print(F("Temp.:"));
lcd.setCursor(0, 3);
if (temperatura &t 0) // Gdy wartość jest ujemna...
{
temperatura--; // odejmij jeden ze względu na zaokrąglenia liczb ujemnych.
lcd.print(F("-")); // rysuj znak minusa.
}
else
{
lcd.print(F(" ")); // W przeciwnym razie rysuj spację.
}
temperatura = abs(temperatura); // Wyciągnij wartość bezwzględną.
if (temperatura &t 100) // Jeśli temperatura będzie większa od 9 bądź mniejsza od -9 stopni...
{
lcd.print(F(" ")); // rysuj dodatkową spację.
}
lcd.print(float(temperatura) / 10, 1);
lcd.print((char)223);
lcd.print(F("C"));
///////////////////////////////////////////////////////////////////////////////////////
delay(1000);
}
void Temperatura()
{
sensors.requestTemperatures(); // Wyślij rozkaz zmierzenia temperatury.
temperatura = 10 * (sensors.getTempCByIndex(0) + 0.05); // Przekształć wartość odczytaną w całkowitą (dokładność: jedno miejsce po przecinku)
return temperatura;
}