Kód: Egész kijelölése
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
unsigned long marad=0;
int nap=0;
int ora=0;
int perc=0;
int mp=0;
int tmp=0;
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
void setup()
{
lcd.init();
lcd.backlight();
}
void loop()
{
marad=millis();
lcd.setCursor(0,1);
nap= marad / 86400000; marad = marad-nap*86400000;
ora= marad / 3600000; marad = marad-ora*3600000;
perc= marad / 60000; marad = marad-perc*60000;
mp= marad / 1000; marad = marad-mp*1000;
tmp= marad / 100;
lcd.setCursor(0,0);
if(nap<10) lcd.print('0');
lcd.print(nap);
lcd.print(" nap ");
if(ora<10) lcd.print('0');
lcd.print(ora);
lcd.print(":");
if(perc<10) lcd.print('0');
lcd.print(perc) ;
lcd.print(":");
if(mp<10) lcd.print('0');
lcd.print(mp);
lcd.print('.');
lcd.print(tmp);
delay(100);
}
Namost az óra működik, de van 1 problémám vele, amit nem értek.
Látható probléma: ha a mp értéke 33 és 59 közötti, akkor a tizedmásodperc túlcsordul, és marhaságot mutat.
A "marad = marad-mp*1000;" sor használta során túlcsordulás következik be. Azt tapasztaltam hogy hiába lett a marad változó unsigned long -nek definiálva, úgy tűnik, hogy az mp*1000 számítása során a kiszámított értéke túlcsordul, mintha az eredmény mező integet lenne, nem pedig unsigned long.
A problémát megoldja ha a mp változót unsigned int -nek definiálom, de a kérdésem, hogy mi okozza a tulcsordulást ???