Kód: Vybrat vše
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// nastavena adresa 0x3F a poradi pinu displeje na prevodniku: en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
unsigned long pocatek, doba; // pomocne mereni casu
unsigned long form = 86400000; // doba formovani v ms
void setup() {
lcd.begin(16, 2); // zavedeni grafiky do RAM displeje
lcd.clear();
pocatek = millis();
}
void loop() {
doba = millis() - pocatek;
if ((doba % 1000) == 0) {
lcd.clear();
lcd.print("Hodiny");
long pom; // vypis casu
lcd.setCursor(0, 1);
if (pom < 10) {
lcd.print("0");}
pom = (long(doba / 3600000));
lcd.print(pom);
lcd.print(":");
pom = long(doba / 60000) % 60;
if (pom < 10) {
lcd.print("0");
}
lcd.print(pom);
lcd.print(":");
pom = long(doba / 1000) % 60;
if (pom < 10) {
lcd.print("0");
}
lcd.print(pom);
}
U tohoto kodu se mi moc líbí ta podmínka na kterou jsem se ptal v jiné části
a to ((doba % 1000) == 0). Hodiny v originále se nulovaly po dosažení unsigned long 3600000 taktu a to jsem změnil na 86400000 což by mělo nulovat po 24 hod. Problém je že vše je odvozeno od počátku který se nastavuje jednou v setupu a tedy když přeteče vnitřní počet po cca 50 dnech ta to může být uprostřed dne a tím dojde k totálnímu chaosu tedy hodiny po 50 dnech zkolabují.
Tak jsem to předělal do této verze kdy po cca 50 dnech zkolabuje jen milisekunda což je nic:
Kód: Vybrat vše
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// nastavena adresa 0x3F a poradi pinu displeje na prevodniku: en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
unsigned long pocatek, doba; // pomocne mereni casu
unsigned long form = 86400000; // doba formovani v ms
int hod;
int minut;
int sec;
void setup() {
lcd.begin(16, 2); // zavedeni grafiky do RAM displeje
lcd.clear();
pocatek = millis();
}
void loop() {
doba = millis() ;
if ((doba - pocatek) >= 1000) {
pocatek = millis();
sec = sec +1;}
if ( sec>59) {
sec = 0;
minut = minut + 1;}
if ( minut >59) {
minut = 0;
hod = hod + 1;
if (hod >23) {
hod = 0;
}
}
lcd.setCursor(0, 1);
if (hod < 10) {
lcd.print("0");}
lcd.print(hod);
lcd.print(":");
if (minut < 10) {
lcd.print("0");}
lcd.print(minut);
lcd.print(":");
if (sec < 10) {
lcd.print("0");}
lcd.print(sec);
}
No a otázkou je proč se to tak děje. Proč u prvního příkladu to jde naprosto perfektně a u druhého už program zjevně tak ladně nefunguje i když je funkční i po cca 50 dnech.