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
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

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

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

Előre mondom, hogy nem tudom mitől van a késés, csak azt tudom neked leírni, hogy én merre keresném a megoldást.
Azt láthatod az lcd-k adatlapján, hogy a kezelésük időigényes. azt is tudjuk, hogy az arduino teszi a maga dolgát anélkül, hogy mi tudnánk róla pontosan mit is csinál. Mindezt azért, hogy nekünk kezdőknek, siker élményünk lehessen, mert működik a programunk. A háttérben meg az arduino gondoskodik róla, hogy például az idő múlását egyszerűen csak a millis() lekérdezésével kezelhessük. Nyilván a háttérben futó program biztosítja számunkra ezt a kényelmet.
A késés magyarázata ezek után nem csak a saját programod futásából, hanem a háttérben futó dolgok futásából is adódik. a loop futásidejének mérése során ezek a háttér idők is bele mérődnek, de arra nem számíthatsz, hogy egyforma lesz minden körben az idő, mert nem tudni, hogy a háttérben mikor mi avatkozik bele a programod futásába.
Van néhény dolog a programodban, ami számonra nem teljesen érthető.
Az első érdekesség, hogy az idő múlásának vizsgálata során az if feltételében == -re vizsgálsz. Ha abban az ezred másodpercben amikor az egyenőség igaz nem jut rá a vezérlés erre a sorra, akkor elment a hajó. Most szerintem nem ez okozza a késésedet, mert a legközelebbi egyenőség majd a millis() körbefordulása után létrejöhet, de az nagyon sokára van. Ezzel együtt érdemes olyan feltételt választani, ami minden körülmények között létre fog jönni. Jelen esetben a <= hozná ezt az eredményt. Ekkor persze foglalkozni kell azzal az esettel, amikor a körbefordulás van, tehát az összeadás eredménye már átfordul, a millis() meg még a saját számábrázolásának a tetejénél tart.
Gondolom ezt célozza a tulcsordulas változód, meg a startTimeCheck, de ezek kezelése számomra nem érthető. Erre kicsit rávilágíthatnál.
Azt viszont látom, hogy a startTimeCheck változódat minden feltétel nélkül egyenlővé teszed startTime-al, ha a másodperc eltettét vizsgáló legelső if-ed igazzá válik. Ennek sok hozadékát nem tátom.
Az elején egy kijelzonulla változót növelgetsz szintén minden feltétel nélkül, ha a másodperc eltelt. Amikor eléred a 10-et, akkor kiírod, hogy "pontos idő:". Ez gondolom azért van ott, hogy a setup végén kiírt bekapcsolás számlálód olvasható ideig látható legyen. De a kijelzonulla változód feltétel nélküli növelése azt fogja eredményezni, hogy ahányszor a byte méretűre definiált kijelzonulla változód átfordul, újra eléri a 10-et és igazzá válik a feltétel. Sok gondot nem okoz, hogy 256 másodpercenként az első sorban frissül az egyébként változatlan kiírásod, de nem vagyok abban biztos, hogy ezt így akartad.
Remélem segítettem.
KissGe
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2016. január 3. vasárnap, 20:06

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

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

Először is, nagyon szépen köszönöm, hogy válaszolsz, és próbálsz segíteni nekem, kezdőnek! :)

Igen, az LCD-re való időkiírásra én is gyanakodtam, így megnéztem egyenként, hogy mennyi időbe telik, míg kiírom az egyes karaktereket, igazából ez teljes mértékben megfelelt az adatlap szerinti értéknek, így nem hiszem, hogy ez befolyásolja a dolgokat.

Igazad van abban is, hogy a háttérben fut az "igazi" program, mi csak az egyszerűsített részét ismerjük.
A mérésre direkt olyan időszakot választottam, ahol az idő kijelzésben egy számjegyű számok szerepelnek, így a lefutás során többször újra kell pozicionálni a kurzort, illetve "0"-t kell kiírni, hogy az idő kijelzésének a hossza mindig egyenlő legyen.

Sokat gondolkodtam azon, amit írtál, és láttam, hogy mások program megoldásában a millis() figyelésénél a >= feltétel volt felhasználva. Mikor az én programomban ezt a feltételt alkalmazom, akkor az óra nem másodpercenként lépked, hanem őrületes gyorsasággal halad előre, a másodpercek elteltéhez inkább a percek múlása igazítható érdekes módon... Ha egyenlővé teszem, akkor másodpercenkénti mérés valósul meg, látszólagosan... Én is gondoltam arra, hogy ezzel a pont egyenlő feltétellel elképzelhető, hogy "elmegy a hajó" az egyik vizsgálat során a fent említett dolgok miatt, de mikor vizsgáltam a stopper mellett az órát, arra jutottam, hogy úgy viselkedik, mintha a millis() összességében lassabban számol, mint ahogy kéne... Fél percenként kb. 1 mp a késés.
Arra sajnos nem jöttem még rá, hogy ha a feltétel >= az egyenlő helyett, miért gyorsul fel az órám... Lehet, hogy ebben van a magyarázat.

A túlcsordulás változó a változó túlcsordulását figyeli, ami ugye 2^32 -en, tehát elviekben ez 49,7 nap után kell, hogy jelentkezzen. Értelmezésem szerint, eddig pontos óránknak kéne, hogy legyen, ideális esetben. Minden esetben vizsgálom a start_time változót, egyenlővé teszem a start_time_check-et vele a ciklus lefutása során. Amennyiben túlcsordulás történt, akkor a start_time a túlcsordulás után bizonyosan kisebb lesz, mint az előzőleg eltárolt start_time_check, tehát túlcsordulás történt, 1,296 mp késést eredményezett a túlcsordulás. Ezt szerettem volna korrigálni ebben az esetben.

A kijelzonulla változóval tényleg azt szerettem volna elérni, amit írtál, és működik is, de igazad van benne, hogy utána fölöslegesen növekszik, túlcsordul, majd a feltétel szerint újra teljesül, tehát újra kiírjuk a kijelzőre a Pontos idő: -t.

Még egy kis érdekesség, Édesapámnak is van egy Arduino panelje, igaz az "csak" egy nano ... Ezen a panelen az általam írt óra pontos... Esetleg elképzelhető, hogy máshogy számol a két panel időt? (kristály vs oszcillátor)
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

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

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

Kezdem a végén. Az arduino rendszerben ha nem jó panelt adsz meg akkor lehetséges idő probléma, mert az órajel panel felépítés (kvarc) függő.
De hogy a >= kontra == problémát a helyére tegyük, gondojuk át a feltételt. A programodban az elmentett idő +1000 a feltétel egyik fele, ami mindaddig nagyobb mint a pillanatnyi millis() amíg egy másodperc el nem tellt. A feltétel minden alkalommal teljesüt, ezért rohan az órád.
A túlcsordulást illetően amikor a startTimet frissíted, akkor rögtön nézd meg, hogy az a növeléssel át fog-e fordulni, és állítsd be a jelzőt ha igen. A feltétel vizsgálatot pedig ki kell bővítened, mert amíg a jelző áll, addig hamisan mutat feltétel. Aztán amikor a millis már átfordul akkor törölheted a jelzőt, mert helyre állt a rend.
Még valami. Az hogy túlcsordulás van nem jelenzi, hogy eltelt egy másodperc, vagyis a másodperc növelésed hibás elképzelés azon a helyen a programodban. Ettől persze sietnie kellett volna, csak a a feltétel soha nem vált igazzá.
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 »

Másutt látok még problémát:

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

loop {

eltelt 1000 msec a start_time-hez képest? {
   csinálok mindenfélét, ami időigényes. Akár 1-2 msec is lehet....
   sőt, megszakítás is beeshet ami szintén kitolja az időt....
   start_time_check = start_time;
.
.
.
}
Azaz itt beesik időnként 1-2 msec késleltetés.
Példa, csak 1 msecet csúszok 1000 mcsecenként (1 sec valójában 1.001 sec):
1 nap: 86400 sec. Ezalatt 86400x van 1 msec csúszás. Ez a nap végére: 86.4 sec-et (azaz >1 perc) hibát jelent. (1 óra alatt: 3600 msec (3.6 sec))
Még egy kis érdekesség, Édesapámnak is van egy Arduino panelje, igaz az "csak" egy nano ... Ezen a panelen az általam írt óra pontos... Esetleg elképzelhető, hogy máshogy számol a két panel időt? (kristály vs oszcillátor)
???? Kvarc pontossága ~30ppm; rezonátor: ~300...600ppm.
De a nano és az UNO is kvarcról működik (max SMD esetén a tokozásban ott a 2 kondenzátor is még).
KissGe
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2016. január 3. vasárnap, 20:06

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

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

Köszönöm szépen a hozzászólásokat!

Egyedül azt nem értem - elnézést, ha nehezebb a felfogásom a szokásosnál :) - , hogy miért okoz késést pár művelet, ha már beléptünk az IF ciklusba.
Megvizsgáljuk, hogy eltelt-e 1000 msec, ha igen, akkor végrehajtok pár utasítást, tehát léptetem a másodpercet, majd kijelzem az időt, és megint vizsgálódom. Tehát, ha jól értem, akkor 1000 msec -et "büntetlenül" eltölthetek az IF cikluson belül, mert ha az rövidebb mint 1000 msec, akkor a következő lépést is észre fogja venni a program.

A túlcsordulás tekintetében pedig rájöttem, hogy 256 msec veszik el a túlcsordulás alkalmával, így ha túlcsordulás történt, ezt kell "visszaadni" a start_time változónak. Ez jó elgondolás?

A kódom most így néz ki, amely egyébként továbbra is ugyan úgy késik, feltételezem azért, mert nem értelmezem jól Róbert által leírtakat, és nem úgy van a késleltetés, ahogy gondolom, és fenn leírtam.

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=0;

byte ora;
byte perc;
byte mp;

int ev;
int honap;
byte honaphossz;
int nap;
int napcheck;
byte bekapcsolas_check=1;

int EV=2016;
int HONAP=1;
int NAP=9;

byte ORA=15;
byte PERC=46;
byte MP=0;
unsigned long start_time;
unsigned long start_time_check=0;

byte tulcsordulas=0;

void setup() {
start_time = millis();
Serial.begin(9600);

ora = ORA;
perc = PERC;
mp = MP;

nap = NAP;
honap = HONAP;
ev = EV;

lcd.begin(16,2);
analogWrite(13, 60);

bekapcsolasH = EEPROM.read(2);
bekapcsolasL = EEPROM.read(1);
bekapcsolas = word(bekapcsolasH, bekapcsolasL);
lcd.print("Futas: ");
lcd.print(bekapcsolas);

bekapcsolas += 1;
bekapcsolasH = bekapcsolas / 256 ; 
bekapcsolasL = bekapcsolas % 256;
EEPROM.write(1, bekapcsolasL);
EEPROM.write(2, bekapcsolasH);
}

void loop() {
if (start_time + 1000 <= millis()) {
    start_time += 1000;
     
    if (start_time_check > start_time) {
       start_time = start_time + 296;
    }
     
    mp += 1;
    napcheck = nap;
      
    start_time_check = start_time;
    if (mp == 60) {
      mp = 0;
      perc +=1;
    }
    if (perc == 60) {
      perc = 0;
      ora +=1;
    }
    if (ora == 24) {
      ora = 0;
      nap++;
    }

    if (napcheck < nap || bekapcsolas_check == 1) {
        bekapcsolas_check = 0;
        switch (honap) {
        case 1:
        honaphossz = 31;
        break;

        case 2:
        honaphossz = 28;
          if( (ev%4==0) ) {
            if( (ev%100)!=0) {
             honaphossz = 29;
             } else {
              if( (ev%400)==0)  {
                honaphossz = 29;
              }
             }
           }
         break;
      
         case 3:
         honaphossz = 31;
         break;

         case 4:
         honaphossz = 30;
         break;

         case 5:
         honaphossz = 31;
         break;

         case 6:
         honaphossz = 30;
         break;

         case 7:
         honaphossz = 31;
         break;

         case 8:
         honaphossz = 31;
         break;

         case 9:
         honaphossz = 30;
         break;

         case 10:
         honaphossz = 31;
         break;
      
         case 11:
         honaphossz = 30;
         break;

         case 12:
         honaphossz = 31;
         break;
        }

        if(nap > honaphossz) {
        nap = 1;
        honap ++;
        }

        if(honap > 12) {
        honap = 1;
        ev++;
        }
  
        lcd.setCursor(0,0);
        lcd.print(ev);
        lcd.print("-");
        if (honap<10) {
          lcd.print("0");
        }
        lcd.print(honap);
        lcd.print("-");
        if (nap<10) {
          lcd.print("0");
        }
        lcd.print(nap);
  }      
   
  lcd.setCursor(0,1);
  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("   ");
 }
}
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

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

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

Azt mondom, amit már az elején. Mérd meg a loop futás idejét. Látni fogod,hogy amikor nem teljesül az if akkor mennyi és amikor teljesül akkor mennyi. Aztæn akær arra is hasznælhatod az eredményeket, hogy a növekményt korrigálod a futás idővel.
A túlcsordulást még mindíg nem jól kezeled. A túlcsordulást nem jól értelmezed. Amikor a startTime még befér, de a startTime+1000 már nem, akkor van a probléma, mer ehhez hasonlítod a millis() értékęt. Amíg a millis is át nem firdul addig minden körben igaz lesz a feltétel, ettől rohanni fog az óra. Aztán a következő secben átfordul a startTime, fent marad a startTimeCheck és erre korrigálsz egy értékkel.
Ha kiszámoltad, hogy 256msec lesz a hiba, akkor biztos csak elírás a 296 korrekció. De én nem az elveszett időt pótolnám, hanem az eseményt figyelném és védeném ki a hatásását.
Amúgy a késés okát valahol a háttérben futó dolgokban lehet megtalálni, és a Robi által említett kvarc pontatlanság is benne van. Meg az is, hogy a millis az a micros-ból van származtatva, ahogy arra Robi utalt.
KissGe
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2016. január 3. vasárnap, 20:06

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

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

Értem, köszönöm szépen!

Tehát, ha így vizsgálok, akkor magát a szaladó óra jelenséget kiküszöbölöm túlcsordulás esetén, viszont addig nem "mérem" az időt az alap feltételen belül, hiszen a túlcsordulás változóm 1.

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

void loop() {
if ((start_time + 1000) < start_time) {
  tulcsordulas = 1;
  start_time = millis();
  }else{
  tulcsordulas = 0;  
  }

if ((start_time + 1000) <= millis() && tulcsordulas == 0) {
    start_time += 1000;
...
}
Arra gondoltam, hogy mérhetném, hogy mennyi időt töltök el ezzel, viszont rájöttem, hogy ez a mérés nem lesz pontos, mert a millis() is át fog fordulni egyszer csak, így hiába gyűjtöm az adatot, mennyi időt töltöttem el benne, a forduló pillanatában "elrontom" a mérést.
Igazából annak tudatában, hogy soha nem lesz rendkívül pontos az órám, ezzel az 1,296 mp körüli késéssel azt hiszem, nem foglalkozom... :)
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 »

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

void loop() {
if ((start_time + 1000) < start_time) {
  tulcsordulas = 1;
  start_time = millis();
  }else{
  tulcsordulas = 0;  
  }
Eddig OK

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

if ((start_time + 1000) <= millis() && tulcsordulas == 0) {
    start_time += 1000;
...
}
e helyett azt írnám, hogy

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

if (tulcsodulas == 1) {
   ..... //itt van a kiirorutin
//ha debug kell, akkor az utolso sor:
kiirasvege = millis-start_time;
serial.print("Idoigeny=");
serial.println(kiirasvege);
}
Hencs Bence
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2016. november 19. szombat, 9:24

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

Hozzászólás Szerző: Hencs Bence »

mi a kapcsolási rajza
Hencs Bence
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2016. november 19. szombat, 9:24

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

Hozzászólás Szerző: Hencs Bence »

mi a kapcsolás
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 »

Sima LCD van bekotve 4bites modon. Ahogyan a 60 napos tanfolyamban is szerepel.
http://www.tavir.hu - a gazda :)
zeneger
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2017. november 23. csütörtök, 17:39

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

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

Sziasztok! Tisztelettel kerdezném, nekem a macsek óraja a soros monitorra indulást követően miert azt írja ki hogy a hónap nem jó : 255 nincs ilyen adat benne átnéztem! Esetleg valami változó rosszul van benne meghatározva ezert kapom a hónapra a 255-ös értéket???
Üdv: Gábor
rockerkrisz
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2018. január 14. vasárnap, 19:07

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

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

Sziasztok!

Elkészítettem a 16-os leckéhez tartozó házi feladatot:

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

#include <LiquidCrystal.h>  // A LiquidCrystal eljarast hasznaljuk  
#include <EEPROM.h>

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 ora=12;
int perc=0;
int sec=0;
unsigned long mil=0;

byte bekapcsolas=0;

void setup() {
    //Inicializalas
    lcd.begin(20, 4);
      //Az LCD 4 sor, 20 oszlopos
    lcd.print("Pontos ido:");
      //LCD-re kiirunk szoveget
    bekapcsolas = EEPROM.read(1);
    bekapcsolas = bekapcsolas + 1;
     // a szamlalas es visszairas
     EEPROM.write (1, bekapcsolas);
}
 
void loop() {           //Maga a foprogram

unsigned long mill=millis()/1000;

  if (mill>mil){
    mil=mill;
    sec++;
  }
  
  if (sec>59){
    perc++;
    sec=0;
    lcd.setCursor(0,1);    // sor törlése1
    lcd.print("        "); // sor törlése2
  } 
   
  if (perc>59){
    perc=0;
    ora++;
  }
    
  if (ora>23){
    ora=0;
  }
  
  lcd.setCursor(0, 1); //A kiiras helye: 0. oszlop, 1. sor
  lcd.print(ora);
  lcd.print(":");
  lcd.print(perc);
  lcd.print(":");
  lcd.print(sec);
  lcd.setCursor(0, 2);
  lcd.print("Bekapcsolasok szama:");
  lcd.setCursor(0, 3);
  lcd.print(bekapcsolas);  
} 
Most a 21. leckénél tartok, az előző programból készítettem egy ébresztőórát:

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

//Óra ébresztő funkcióval
 
#include <LiquidCrystal.h>  // A LiquidCrystal eljarast hasznaljuk  
#include <EEPROM.h>
#define Speaker 10

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 ora=12;
int perc=0;
int sec=0;
unsigned long mil=0;

//ébresztés
int eora=12;
int eperc=1;
int ebreszto=0;

int mil2=0;  //vált1
int mill2=0; //vált2
int esec=0; //másodperc ébresztéskor

//varakozas a jelvaltasnal
unsigned int var=2000;
//ennyi ideig szoljon
unsigned long tartam=100000;
//segedvaltozo
unsigned long temp1long;

byte bekapcsolas=0;

void setup() {
    //Inicializalas
    lcd.begin(20, 4);
    //Az LCD 4 sor, 20 oszlopos
    lcd.print("Pontos ido:");
    //LCD-re kiirunk szoveget
 
    bekapcsolas = EEPROM.read(1);
    bekapcsolas = bekapcsolas + 1;
    // a szamlalas es visszairas
    EEPROM.write (1, bekapcsolas);
     
    pinMode(13, OUTPUT); 
    pinMode(Speaker, OUTPUT);
    pinMode(2, INPUT);
    digitalWrite(2, HIGH);
}
 
void loop() {           //Maga a foprogram

unsigned long mill=millis()/1000;

  if (mill>mil){
    mil=mill;
    sec++;
  }
  
  if (sec>59){
    perc++;
    sec=0;
    lcd.setCursor(0,1);    // sor törlése1
    lcd.print("        "); // sor törlése2
  } 
   
  if (perc>59){
    perc=0;
    ora++;
  }
    
  if (ora>23){
    ora=0;
  }
  
  lcd.setCursor(0, 1); //A kiiras helye: 0. oszlop, 1. sor
  lcd.print(ora);
  lcd.print(":");
  lcd.print(perc);
  lcd.print(":");
  lcd.print(sec);
  lcd.setCursor(0, 2);
  lcd.print("Bekapcsolasok szama:");
  lcd.setCursor(0, 3);
  lcd.print(bekapcsolas);
  
  if (eora==ora && eperc==perc && ebreszto==0){  //mikor kell ébreszteni
  ebreszt();
  }
  if (eora!=ora && eperc!=perc && ebreszto==1){ //másnap is ébresszen
  ebreszto=0;
  }
}

void ebreszt(){
  pont();
  delay(50);             
  pont();
  delay(50);
  pont();
  delay(50);              
  vonas();
  delay(50);             
  vonas();
  delay(50);              
  vonas();
  delay(50);              
  pont();
  delay(50);             
  pont();
  delay(50);
  pont();
  delay(50);
}

void pont() {
    //LED be - var - LED ki
  digitalWrite(13, HIGH);
  hang();
  esecu();
  digitalWrite(13, LOW);
}
 
void vonas(){
   //LED be - var - LED ki
  digitalWrite(13, HIGH);
  for (int i=0; i<4; i++)
  {
  hang();
  esecu();
  }           
  digitalWrite(13, LOW); 
}

void hang(){
  if (digitalRead(2)==0){  //nyomógombbal az ébresztés leállítása
    ebreszto=1;
    lcd.print("        ");
    sec=esec;
    loop();
  }
  
//ennyi darab impulzust kell kiadni
temp1long=tartam/(var*2);
//ismeteld, amig a feltetel igaz
while (temp1long != 0) {
//hangszoro alacsonyra
digitalWrite(Speaker,LOW);
//varakozas valtas kozt
delayMicroseconds(var);
//hangszoro magasra
digitalWrite(Speaker,HIGH);
//varakozas valtas kozt
delayMicroseconds(var);
temp1long = temp1long-1;
} 
}

void esecu(){   //ébresztéskor számolt másodpercek programja
mill2=millis()/1000;
if (mill2>mil2){
    mil2=mill2;
    esec++;
  }
lcd.setCursor(0,1);
lcd.print(eora);
lcd.print(":");
lcd.print(eperc);
lcd.print(":");
lcd.print(esec);
}
A program jól működik, viszont a másodpercek számolását csak ilyen furcsán tudtam megoldani, amikor ébreszt az óra.
zoldfulurozi
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2018. június 13. szerda, 11:44

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

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

Sziasztok,
egyelőre sajnos nem tudok saját órát készíteni, mások programjaiból ollóztam össze pár darabot. Segítséget szeretnék kérni, mert nem értem "else" nélkül az if fügvény miért engedi tovább a loop futását. Kezdetben azt hittem rockerkrisz programrészlete csak amolyan szamárvezető:

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

 if (sec>59){
    perc++;
    sec=0;
    lcd.setCursor(0,1);    // sor törlése1
    lcd.print("        "); // sor törlése2
  } 
Aztán megnéztem a time library-t és a minta programban is hasonlót találtam:

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

}
void lcdprintDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  
  if(digits < 10)
    lcd.print('0');
  lcd.print(digits);
}
A kérdésem az lenne , hogy az alsó programsornál ha kétjegyű a karakter, akkor miért működik jól , és miért nem vár addig , amíg egyszámjegyű nem lesz a karakter ?

Köszönöm szépen a segítséget .

Üdv

Rozi.
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

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

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

Az if után hiányoznak a kapcsos zárójelek.
Válasz küldése