LCD ébresztőóra

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Bazs87
Biztosítékgyilkos
Hozzászólások: 62
Csatlakozott: 2014. július 20. vasárnap, 20:27

Re: LCD ébresztőóra

HozzászólásSzerző: Bazs87 » 2014. július 26. szombat, 18:20

köszönöm válaszod!

újabb kérdésem lenne.
Ha van egy változóm, ami pl. float ertek = 24.13

a 0.13-at megkapom, ha pl. ertek%1-et írok.
Ha viszont az egész része érdekel egyrészt tudok a változó típusával játszani, hogy integer legyen vagy byte, tudok kerekíteni a Round(ertek)-kel (de az nem az egész részt adja, hanem kerekít, így kiesik)
Nincs erre speciális funkció?
Sajnos nem találtam meg a leckék közti kereséskor, valahol pedig benne kell lennie.

Épp a leckém farigcsálom és megakadtam ennél az apróságnál.
Köszönöm előre is!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: LCD ébresztőóra

HozzászólásSzerző: Robert » 2014. július 26. szombat, 18:53

byte=float;
adott típusú változóként.

Jazzkedvelo
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2014. december 8. hétfő, 20:03

Re: LCD ébresztőóra

HozzászólásSzerző: Jazzkedvelo » 2015. január 11. vasárnap, 21:34

Üdvözlet!

Lehet jó lenne átírni a fórum címét a #21 lecke ébresztőóra megoldásának címére, mert végülis ott kaptuk eme nemes feladatot, mármint az ébresztőóra megvalósítását.

Beraknám az általam megírt kódot a korábban az LCD óra megvalósításával továbbfejlesztve.

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

#include <pitches.h>
#include "LiquidCrystal.h"

LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

byte ora, perc, mp; //aktuális ido
byte EORA=22, EPERC=30, EMP=30; //ébresztési idő megadása
unsigned long ORA=22, PERC=30, MP=25; //pontos idő megadása induláskor
unsigned long ido; //milisec alapu idő a bekapcsolas óta

int melody[] = {
  NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
 
int noteDurations[] = {
  4, 8, 8, 4,4,4,4,4 };
 
void alapkepernyo()
    {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Ido:      :  :");
    lcd.setCursor(0, 1);
    lcd.print("Vekker:");
    lcd.setCursor(8, 1);
    lcd.print(EORA);
    lcd.print(":");
    lcd.print(EPERC);
    lcd.print(":");
    lcd.print(EMP);
    }
   
void idomeghatarozas()
    {
    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);
    }
   
void ebresztes()
    {
        lcd.setCursor(0, 1);
        lcd.print("    Ebreszto!    ");
       
        // zenelejatszas
        for (int thisNote = 0; thisNote < 9; thisNote++)
                {
                int noteDuration = 1000/noteDurations[thisNote];
                tone(10, melody[thisNote],noteDuration);
                int pauseBetweenNotes = noteDuration * 1.30;
                delay(pauseBetweenNotes);
                if (thisNote==8) {delay (1000); thisNote=-1;}
                if (digitalRead(3)==0)
                    {
                      noTone(10);
                      lcd.setCursor(0, 1);
                      lcd.print("    Epp ideje!");
                      delay(2000);
                      thisNote=9; 
                      alapkepernyo();
                    }
                }
     }

   
void idokiiras()
    {
    lcd.setCursor(14, 0);
    if (mp<10)
        {
         lcd.print("0");
         lcd.print(mp);
         }
         else
         {
         lcd.print(mp);           
         }
                     
    lcd.setCursor(11, 0);
      if (perc<10)
        {
         lcd.print("0");
         lcd.print(perc);
         }
         else
         {
         lcd.print(perc);           
         }
   
    lcd.setCursor(8, 0);
      if (ora<10)
        {
         lcd.print("0");
         lcd.print(ora);
         }
         else
         {
         lcd.print(ora);           
         }
    }
   
void setup() {
    pinMode(3, INPUT); //ebresztogomb
    pinMode(13, OUTPUT); //háttérvilágítás
    digitalWrite(13, HIGH);
    lcd.begin(16,2);
    alapkepernyo(); 
}
 
void loop() {
 
    idomeghatarozas();
    idokiiras();
   
    if (EORA==ora && EPERC==perc && EMP==mp) //ébresztő és óra egyezik
       {
       ebresztes();   
       } 
}


Pár gondolatot hozzáfűznék:
1. A pitch.h fájl beincludolásával volt nem kevés gond. Azért is, mert az Arduino legújabb 1.5.8 verziót futtatom, és ez nem ugyanúgy kezeli a függvénykönyvtárakat, mint a korábbi 1.0 körüli verziók (tudom, BETA verziók használata tilos). Más a felépítése is más, így addig szórakoztattam vele, míg csináltam magamnak - talán hasznos lesz később - egy külön saját könyvtárat, amiben ez is benne foglaltaik, sőt egyelőre csak ez.Legalább ezt is gyakorolgattam, később jól jöhet. Kell hozzá mindenképpen egy library.properties fájlt írni, és egy meghatározott könyvtárszerkezetet felépíteni, mert máshogy nekem ez a verzió nem volt hajlandó kezelni a pitc.h fájlt. Az 1.0.6 körüli verzióval minden gond nélkül működött.
2. Gyakorolgattam az eljárásokat is, ami már ebbe belekerült. Kicsit így talán átláthatóbb is. Volt ahol értelme is volt, pl. az alapkepernyo() függvénynél, mivel azt többször használjuk a program során (indításnál és ébresztés után is).
3. Lehetne még optimalizálni, de volt már ennél nagyobb is :-).

Az még nem teljesen tiszta, pontosabban kicsit ellentmondásos számomra, hogy az #include utasítás után mikor kell "" illetve <> közé tenni a függvényt/függvénykönyvtárat.

További kellemes estét,
Jazzkedvelo

Jazzkedvelo
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2014. december 8. hétfő, 20:03

Re: LCD ébresztőóra

HozzászólásSzerző: Jazzkedvelo » 2015. január 11. vasárnap, 23:19

Még egy nagyon kicsit belehúztam: állíthatóvá tettem az ébresztés időpontját.

Ehhez két gombot definiáltam, az egyikkel(S1) tudok lépkedni, a másikkal(S2) meg állítani. Persze mindegyikhez van saját megjelenítés is.

Azaz megnyomom az S1 gombot, bejön a beállító képernyő, és az S2-vel tudom léptetni az órát.
Utána ismét S1 átlép perc üzembe és a percet tudom léptetni. Mégegyszer lenyomom az S1-et és kilép vissza az alapállapotba. Persze itt a prell-et is le kellett kezelni rendesen. és persze csörög is az új beállításkor.

A kódot inkább nem rakom be, mert már kezd hosszú lenni, és nem akarok lefárasztani mindenkit.

Ahhoz viszont hogy az órát is állíthatóvá tegyem igencsak át kell formálnom a programot, azon belül is a void idomeghatarozas() reszt. Ez már nem is annyira triviális ha a milis alapjaira helyezzük az óra járását. legalábbis fel kell rúgni az eddigi (működési)elvet.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: LCD ébresztőóra

HozzászólásSzerző: Robert » 2015. január 12. hétfő, 0:09

Arduino Include különbségek:

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

#include <iostream>
#include "otherfile.h"


A fenti két sor a nevezett fájlokat egyszerűen bemásolja az #include helyére. Az első esetben a forrásfájl nevét a kisebb-nagyobb (<, >) jelek közé írtuk, ezért a fordító a fejállományok szabványos helyén fogja keresni azt. A második példában idézőjelek közé helyeztük el a fájlnevet, így a program saját könyvtárából relatíve keresi azt a fordító.

Referencia: http://hu.wikipedia.org/wiki/C_el%C5%91 ... %ADt%C3%B3


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég