60 nap alatt Arduino #16 - LCD-ből óra

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: kapu48 »

Légy szíves javítsd ki ezt a hozzászólásod! (Szerkeszt gomb!)
Mikor Programot akarsz beszúrni, van fent Code gomb.
És a megjelenő [ code ] Közé szúrd a programodat [ /code ]
Meglátod jobb lesz!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: Robert »

Hetnapja nevű változót fixen hagyod. A programban sehol nem változtatod.

Ébresztő: if óra=ébresztőóra and perc=ébresztőperc.....




Hozzászólás szerkesztve (code)
pic-ur
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2014. január 23. csütörtök, 16:43

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: pic-ur »

sziasztok
Van egy pont ahol elakadtam az órakészítésnél és szeretném a segítségeteket kérni.
De mielőtt felteszem a kérdésem szeretném ha tudnátok,hogy a szakmám üvegfúvóbol lett szakács.Igazából az elektronikához olyannyira nem értek,hogy még az alkatrészek neveit is most tanulgatom.Az meg,hogy mire való az meg teljes homály számomra.December végén véletlenül keveredtem ide az oldalra.Megtetszett a tanfolyam szövege semmit nem igért,hogy megtanulok de azt ingyen.Viszont néhány lecke után rájöttem,hogy némi melléolvasás után még én is értem.
Na most az órával kapcsolatos problémám az lenne,hogy ahogy olvasgattam a fórumon elég nehéz pontosra készíteni.
főleg az adatfeldolgozás miatti eltérések ,szinkronizálás meg miagymás miatt.Namost kitaláltam,hogy megpróbálom kettéválastrani a dolgokat.Kiindulva abbol,hogy ideális esetben a belsőóra pontos kapjak egy pontos időt,majd ezt írja ki valamikor a kijelzőze.Namost kit érdekel hány milisekundum kell,hogy kiírja a lényeg a pontosság. :lol:
Nos az órám egy hete jár és a raferencia órához viszonyitva másodperc pontos.
íme a program

Kód: Egész kijelölése

#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int mp=1;
int mpx=0;
int mpy=0;
int px=45;
int ox=20;


void setup() {
  lcd.begin(16, 2);

       
}
void loop() {

  if (mp>9){
   lcd.setCursor(11, 1);
     lcd.print(mp);
  }
  else
{
   lcd.setCursor(11, 1);
     lcd.print('0');
     lcd.setCursor(12, 1);
     lcd.print(mp);
}
      mpx=(millis()/1000);   // itt számolo a bekapcsolás ota eltelt másodpercet

      mp=mpx-mpy;         //itt számoltatom ki az aktuális 60 másodpercet
             if (mp>59) { 
             mpy=mpy+60;   //itt léptetem a számolást a következő 60 másodpercre
             px=px+1;
               if (px==60){px=0;
               ox=ox+1;
                  if (ox==24){ox=0;}
             }
           }
      if (px>9){
   lcd.setCursor(8, 1);
     lcd.print(px);
  }
  else
{
   lcd.setCursor(8, 1);
     lcd.print('0');
     lcd.setCursor(9, 1);
     lcd.print(px);
}
     if (ox>9){
   lcd.setCursor(5, 1);
     lcd.print(ox);
  }
  else
{
   lcd.setCursor(5, 1);
     lcd.print('0');
     lcd.setCursor(6, 1);
     lcd.print(ox);
}
  
}


Na most örülök mint a kisgyerek jár az óra ,pontos is.
Erre kapom Robert következő leckéje és közli,hi hi neörülj mert van egy kis probléma
És most utólagos engedelmével idézek tőle
" millis()

Az utasítás a kontrollerben lévő program indulása óta eltelt ezred-másodperceket számolja. A tárolt adat 0...2^32-1 értéket vehet fel (unsigned long), azaz kb. 50 napig lehet vele mérni."
Namost a tényleges kérdésem akkor mi is lessz 50 nap mulva.
Merthogy a számolésom az felborul az biztos.Lefagy a mikrokontroller és resetelni kell,vagy mint minden más tulcsordul a számláló és nekem is kezdenikell előről a számolást de ahhoz,hogy ezt megtudjam tenni letudná nekem irni valaki pontosan ,hogy ez mennyi "0...2^32-1 értéket vehet fel "?
Hú ez egy kicsit hosszú lett de remélem valaki megérti.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: Robert »

millis()
El kezd számolni: 0 .. 1 .. 2 .. .... 2^32-2 .. 2^32-1 .. 2^32 (????)

2^32: 2 a harminckettediken: 4.294.967.296 (10-es számrendszerben)

Ez viszont nem fér bele a long típusú számba (lásd kb. 7. lecke, számtípusok). 2-es számrendszerben az utolsó 3 érték:

Kód: Egész kijelölése

11111111.11111111.11111111.11111101
11111111.11111111.11111111.11111110
11111111.11111111.11111111.11111111

És +1 hozzáadva:
  11111111.11111111.11111111.11111111
                                   +1
-------------------------------------
1.00000000.00000000.00000000.00000000
Azaz túlcsordul. A 32 bit helyiértékbe a legfelső 1-es nem ér bele, így 0 lesz.
pic-ur
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2014. január 23. csütörtök, 16:43

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: pic-ur »

köszi a gyors választ és segítséget
Ez a 4.294.967.296 szám sokat segített.bár felvet némi problámát.
Elsö gondolatom az volt ,hogy nemfoglalkozom a 296 ezred másodpercel egyszerűen figyelem a tulcsordulást mikor megtörténik
nullázom az mpy változómat és kész. :D Na kifoglalkozik évi 1.5 mp késéssel.
Na persze mert az élet ilyen egyszerű.Csakhogy mi is lessz az mp változóban levő 47-tel nullázódik.
hopp ez 50 naponta 47 mp késés évi kb. 8 perc.
Na nemmondom volt már ilyen órám de nemigazán szeretném ilyenre. :lol:
Következő gondolat problem egyszerű jön tulcsordulás mpy változó nullázva mp változóhoz +47 és kész.
Kétperc öröm majd paff.Eszembe jutott nézzem már meg a második tulcsordulásnál mennyi lesz az mp változóban naná hogy nem 47.
Na most mire ezt leírtam szerintem rájöttem a megoldásra.
Lessz még egy változó mondjuk mmp.Jön tulcsordulás, mmp=mp ,mpy nullázom ,mpx magátol nullázódik.
képlet változik mp=mpx-mpy+mmp .

Nos a programot holnap megírom .Hogy jólessz-e megtudom 50,100,150,stb nap mulva.
Ja marad még az eldobott 296 ezredmásodperc.
Vagy megálmodom holnapig a megoldást ,vagy kit érdekel? :D
suzuimy
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2014. február 3. hétfő, 17:55

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: suzuimy »

Itt mi lehet a gond?
A működése, ami hibás:
Kiindulás: 0:0:0
Elindul, számol, 60 másodpercnél az óra ezt jelzi ki 4:16:61, és a másodperc számláló nem áll meg 60-nál, és számol akár több ezerig.

Kód: Egész kijelölése

#include "LiquidCrystal.h"
  // A LiquidCrystal eljarast hasznaljuk
 
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
  // Az LCD bekotese labak szerint:
  // RS(D4), E(D5), D4(D6) ,D5(D7), D6(D8), D7(D9)

int Hour;
int Min;
int Sec;

 
void setup() {
    //Inicializalas
    pinMode(13, OUTPUT);
      //Az LCD hattervilagitas a D13
      //Csak az EXT1 lapon!
    digitalWrite(13, HIGH);
      // Hatter bekapcsol 
    lcd.begin(16, 2);
      //Az LCD 2 sor, 16 oszlopos
    lcd.print("Clock");
    
}
 
void loop() {

Sec=(millis()/1000); 

Sec=Sec+1;

   if (Sec==60){
   Sec=0;
   Min=Min+1;}
  
  lcd.setCursor(8, 1);
  lcd.print(Sec);
  
  lcd.setCursor(7, 1);
  lcd.print(":");
  
   if (Min==60){
   Min=0;
   Hour=Hour+1;}
  
  lcd.setCursor(5, 1);
  lcd.print(Min);
  
  lcd.setCursor(4, 1);
  lcd.print(":");
  
   if (Hour==24){
   Hour=0;}
   
  lcd.setCursor(2, 1);
  lcd.print(Hour);
  

} 
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: Robert »

Karakterpozícionálás, 1 v. 2 karakteres a kiírás...
A túlcsordulást nem veszed figyelembe, állandóan írsz a LCD-re nem nézed, hogy eltelt-e 1 sec...
Ha a millis 61000, akkor mi történik? Modellezd végig a programban...
suzuimy
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2014. február 3. hétfő, 17:55

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: suzuimy »

Robert írta:Karakterpozícionálás, 1 v. 2 karakteres a kiírás...
A túlcsordulást nem veszed figyelembe, állandóan írsz a LCD-re nem nézed, hogy eltelt-e 1 sec...
Ha a millis 61000, akkor mi történik? Modellezd végig a programban...
Túlcsordulást hogyan tudom figyelembe venni?

Hogyan lehet modellezni?

Köszönöm segítségedet!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: Robert »

2-3 lecke múlva érkezik...
Illetve a time függvénykönyvtár ezt lekezeli.
Számolod a másodperceket, mint óra:
milis-milisold>1000 1 sec eltelt;milisold=millis (egészmásodpercrész)
Avatar
varttina
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2010. január 28. csütörtök, 7:00

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: varttina »

Sziasztok!
Hasonló megoldású óraprogramot írtam, mint Pic-ur. Az "ertek" és az "ofszet" unsigned long int típusúak. Előbbiből számolom ki az órát, percet, másodpercet, utóbbit pedig gombok segítségével tudom léptetni 60-asával, valamint 3600-asával. Túlcsordulás esetén úgy módosítom az "ofszet"-et, hogy az "érték" ne változzon. Ez ugyan pár tized másodpercnyi késést eredményez, viszont szerintem ennyi még belefér.

Kód: Egész kijelölése

mostani=millis();
if (mostani>elozo)
  ertek=(mostani/1000)+ofszet;
else
  ofszet=ertek-(mostani/1000);
elozo=mostani;
Jazzkedvelo
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2014. december 8. hétfő, 20:03

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: Jazzkedvelo »

Üdvözlet,

Most jutottam a 16-os leckéhez, így gondoltam beraknám a megoldásomat, mert ilyen elvet megvalósítva nem láttam. Aztán majd jöhet a vélemény - negatív is!

1. Alapvetően csak azokat a dolgokat használtam fel, ami eddig a leckéig adott volt és benne volt a tananyagban, semmi mást.
2. Az időmérést teljes egészében a millis() függvény értékére alapoztam és az alapértékeket ebből történő maradékos osztással hoztam létre. Alapból abból indulok ki, hogy ez egy pontos órajel(tudom, nem teljesen, de tekintsük annak), és teljesen függetlenül megvan az értéke mindig, akármit csinál is éppen a proci, hány utasítást végez mennyi idő alatt, stb. Egy dolog nincs lekezelve a progiban, a millis() változó túlcsordulása (de ilyen még nem szerepelt a tanagyagban ;-) ) Meg remélem addig egyszer csak kikapcsolódik/lemerül az elem :-).
3. Az alapfeladatot megspékeltem azzal, hogy beállítható az idő kezdési értéke. Ezt a 10. sorba beírva lehet megadni. Ennek az az előnye, hogy ezen értékek átírása bárhol és bármikor bármilyen forrásból maga után vonja az óra átállítását is egyben. Azaz ha egyszer majd ezt az értéket változtatjuk akár külső módon - sorosport, külső precíziós óra) akár belsőleg nagyon egyszerű lesz a feladat megoldása.
4. A kódot lehetne bőven optimalizálni (meg is tettem), de szándékosan ezt a verziót rakom fel, mert így jobban át lehet látni, mint egy adott esetekben összevont matematikai formulát. Így jobban lekövethető

Kód: Egész kijelölése

#include "LiquidCrystal.h"
#include "EEPROM.h";
 
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

byte bekapcsolasH;
byte bekapcsolasL;
word bekapcsolas;
byte ora, perc, mp;
unsigned long ORA=22, PERC=22, MP=22;
unsigned long ido;

void setup() {
  
    bekapcsolasH = EEPROM.read(2);
    bekapcsolasL = EEPROM.read(1);
    bekapcsolas = word(bekapcsolasH,bekapcsolasL);
    bekapcsolas = bekapcsolas + 1;
    bekapcsolasH = bekapcsolas/256;  
    bekapcsolasL = bekapcsolas % 256;
    EEPROM.write (1, bekapcsolasL);
    EEPROM.write (2, bekapcsolasH);
  
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Ido:   ");
    lcd.setCursor(0, 1);
    lcd.print("Bekapcsolas: ");
    lcd.print(bekapcsolas);
    
    lcd.setCursor(12, 0);
    lcd.print(":");
    lcd.setCursor(9, 0);
    lcd.print(":");
}
 
void loop() {
    
    ido = millis();
    //alapértékek kiszamolasa a millis() ertekebol
    mp= ((ido+1000*MP) % 60000)/1000;
    perc=((ido+mp+1000*MP+60000*PERC) % (60*60000))/60000;
    ora= ((ido+mp+perc+1000*MP+60000*PERC+(60000*60*ORA)) % (24*60*60000))/(60000*60); 
    
        //kiiratas
    lcd.setCursor(13, 0);
    if (mp<10)
        {
         lcd.print("0");
         lcd.print(mp);
         }
         else
         {
         lcd.print(mp);           
         }
         
             
    lcd.setCursor(10, 0);
      if (perc<10)
        {
         lcd.print("0");
         lcd.print(perc);
         }
         else
         {
         lcd.print(perc);           
         }
   
    lcd.setCursor(7, 0);
      if (ora<10)
        {
         lcd.print("0");
         lcd.print(ora);
         }
         else
         {
         lcd.print(ora);           
         }
     }
Nagy szívfájdalmam, hogy csak úgy működött helyesen a számolás minden értéknél, ha az ORA, PERC, MP; változókat unsigned long formában használtam. A képletet jópárszor átalakítottam, átformáltam, mert pl elvben a byte is elég lenne és konvertálódna egy nagyobb hosszúságú változóval, de valahogy mégse akarta. A matematikai műveletnél nem tudtam más típusú változóval használni, hogy ne legyen benne hiba. Egyszerűen hiába próbáltam betartani akár az "konverziós szabályokat" és előírásokat, rendszeresen rossz eredmények jöttek ki, nem volt megfelelő a konverzió egyik típusról a másikra. Majd két órát játszottam vele, sokszor átrendeztem a képleteket, de nem jött össze. Talán még szórakozok vele. Biztos megvan a nyitja, de még nekem nem egyértelmű a dolog.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: Robert »

Szép kód!

Túlcsordulásra tipp:
Ha a "ido" változó előzőleg kiolvasott értéke _nagyobb_ mint most, akkor túlcsordulás után vagyunk.
Ha nem számoltam el, ez 49.7 nap.

C alatt (ill. főleg az Arduino alatt) a változók Integer típusúak (word, 2 byte). És a típuskonverzió esetén a műveleti sorban elől álló határozza meg hogy mekkora memóriaterületet foglal le. Itt a fordítótól ill a tényleges generált ASM kódtól függően lehetnek szép eltévelyedések.,..
Jazzkedvelo
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2014. december 8. hétfő, 20:03

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: Jazzkedvelo »

Igen, túlcsordulásra jómagam is erre gondoltam, ez egy IF szerkezetvizsgálat, és ha valós az átbillenés, akkor az MP, PERC, ORA változókat egyenlővé kell tenni az mp, perc ora változókkal - amit eddig még nem írt át a progi. És megy tovább, ha jól gondolom.

Ez az adatkonverzió sajnos itt nekem tényleg nem egyértelmű. Próbáltam ugyanezt a képletet sokféleképpen összerakni (belülről indítva byte-ról, majd mindig egyre nagyobb hosszú változókat használva. Gyakorlatilag azt tapasztaltam, hogy ha eljutok az integer maximális érték fölé, akkor az annál kisebb változóként definiált értékek(byte, integer is) túlcsordulnak, legalábbis ezt az értéket mutatta. Hiába egy unsinged longgal végeztem a számítást - és még elől is volt, hogy "ide konvergáljon" - akkor is túlcsordult integer lett az eredmény. megnéztem három korábbi verziójú keretrendszerrel is, ugyanezt csinálta.

Na ugyebár itt lenne jó a lépésenkénti végrehajtás meg debug, meg regiszterek kiiratása, hogy lássuk pontosan mi történik, de arra marad egy magasabb szintű fejlesztőrendszer.

Csak kicsit bánt, mert pazarlásnak érzem három kétjegyű számot ekkora változóban használni. Persze ennél a programnál végülis mindegy, csak mondjuk úgy "nem elegáns"

Egy kérdésem lenne mondjuk legyen a fenti kódból veszem, de nem szorosan ide kapcsolódik. Adott két sor, amivel írok az LCD-re:
lcd.print("Bekapcsolas: ");
lcd.print(bekapcsolas);

Az ilyet nem lehet valahogy felsorolásszerűen összevonni?
Mert pl a

lcd.print("Bekapcsolas: ", bekapcsolas);

(a bekapcsolas az egy változó) nem létező dolog.

Azaz mindent külön utasításban kell kiírni? Vagy esetleg helyőrzőkkel?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: kapu48 »

De lehetséges:
lcd.print(data, BASE)
http://arduino.cc/en/Reference/LiquidCrystalPrint
Jazzkedvelo
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2014. december 8. hétfő, 20:03

Re: 60 nap alatt Arduino #16 - LCD-ből óra

Hozzászólás Szerző: Jazzkedvelo »

kapu48 írta:De lehetséges:
lcd.print(data, BASE)
http://arduino.cc/en/Reference/LiquidCrystalPrint
szia!

Te másról írsz, itt az adat formátumát adhatod meg, hogy milyen formátumban történjen, binárisan decimálisan, oktálisan, stb. Ezek opcionálisan de nem kötelezően választhatóak, ha valakinek erre van igénye.

A kérdésem nem erre vonatkozott.
Válasz küldése