torstai 19. tammikuuta 2017

KEHITYSTÄ I

Oikea painike oikosuljettu
Tämän ohjelman tarkoitus on luoda LCD-aliohjelma, mitä voidaan yleiskäyttää pääohjelmakutsun kautta. Tämän aliohjelman nimi on: void Fun_LCD(int start, int rivi, int paikka, int data){ ja se voidaan myöhemmin kopioda tästä ohjelmasta viitteellä: LCD_Ali_v1.No3Tam17. Tässä siis aliohjeman nimi ja versio sekä tieto siitä, että se on kolmas blogipäivitys tammikuussa 2017. Toinen aliohjema, mikä pitää hakea edellisestä tämän kuun päivityksestä on: IO_Ali_v1.No2Tam17. Tästä jälkimmäisestä ei ole kokonaista koodia enää tässä ohjelmassa, vaan se on kopiotava edellisestä päivityksestäni.
Tuossa LCD-aliohjelmassa on useita tekstejä ja muita tulosteita. Ne joutuu luonnollisesti sovittamaan halutun toteutuksen mukaan. Tämä on siis vain runko.
Kutsuttaessa pääohjelmasta, pitää siinä olla seuraavat parametrit:
start = viittaus seklvenssin suoritusaskeleeseen
rivi = LCD-näytön rivi 0 = yläriv, 1 = alarivi
paikka = ensimmäisen merkin paikka rivillä ( 0 .. 19)
data = numerotieto (int tai muutettava tarpeen mukaan)

LCD-aliohjemaa varten pitää alun määrittelyosassa antaa kirjastomoduuli (#include <LiquidCrystal.h>) sekä määritellä LCD-näytön pinnit (LiquidCrystal lcd(3, 2, 7,6,5,4);. Olen tähän sovellukseen vaihtanut (yleensä esimerkeissä esiintyvät) Arduinon pinnit voidakseni käyttää yhtä liitintä näytön ja mikrokontrollerin välillä. Niiden paikka ei ole tärkeä, mutta järjestys on oleellinen.
Asetuksissa täytyy määritellä näytön ominaisuudet; montako riviä ja montako merkkipaikkaa. Tässä tapauksessa kaksi (2) riviä ja 20 paikkaa (lcd.begin(20,2);.
Pääohjelmaa varten on neljä (4) määrittelyä: IO-aliohjelmasta palautuva painikkeen tilatieto (Bol_Painike). Painikkeen ”nouseva reuna” (Diu_Painike), minkä avulla huolehditaan siitä, että ohjaustoimenpiteet (tässä painamisten lukumäärä) suoritetaan vain kerran, eikä jokaisella ohjelmakierroksella. Lisäksi molemmille painikkeille on laskurit ( Int_OikLkm ja Int_VasLkm).
     Tämä ohjelma toimii siten, että ylärivin keskellä on pysyvästi teksti YLÄOTSIKKO ja alariville ilmestyy Vasen / Oikea lkm kertaa! Jos mitään ei paineta, on alarivi tyhjä. Painettaessa, vastaava painike näkyy rivillä, sekä painikkeen painamisten lukumäärä, joka kasvaa yhdellä aina painettaessa.
     Tässä ohjemassa on se puute, että painikkeita ei voi painaa samanaikaisesti. Se olisi korjattavissa määrittelemällä molemmille painikkeille omat tilamuuttujat (Bol_ ja Diu_). Tuo ei ole kuitenkaan oleellista tässä yhteydessä. Toinen ”puute” on se, että painamiskertojen ollessa alle 10, numerot tulostuvat yhtä paikkaa liikaa vasemmalle. Tämä olisi korjattavissa testaamalla, onko luku alle 10, ja JOS on, niin lisätään paikkakutsuun yksi (+1).
Tuokaan ei ole tässä yhteydessä kovin oleellista. Merkittävämpää on se, että digitaali IO:t vähenevät kuudella (6) käytettäessä LCD-näyttöä. Onneksi moniin ongelmiin löytyy ratkaisu. Niin tähänkin tulevaisuuden sovelluksissa.

Painikkeiden testaus on toteutettu while-komennolla (while(Bol_Painike = Fun_IO(1,8,0)){). Kutsun parametrit: 1 = INPUT, 8 = I/O-pinni 8 ja 0 = ei tässä merkitse mitään. Se koskee ainoastaan OUTPUT- timintoa. Niin kauan kun painike on painettuna, suoritetaan käskyyn kuuluvat lauseet ja toiminnot. Kun painike päästetään, käskyryhmä ohitetaan. Tämä on siis ehtokäky, kuten if, if .. else, do .. while ja mikseipä myöskin switch .. case.

OHJELMA 34
/***************************************
* Ohjelma 34
* 17.01.2017
* LCD-näyttö ja painikeFunktio
**************************************/
// Kirjastomoduulit
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(3, 2, 7,6,5,4);
// MÄÄRITTELYT:
    boolean Bol_Painike = false;
    boolean Diu_Painike = false;
    int Int_OikLkm = 0;
    int Int_VasLkm = 0;

// ALIOHJELMAT
//IO_Ali_v1 - IO_Ali_v1.No2Tam17

// LCD_AliOhjelma_v1 LCD_Ali_v1.No3Tam17
/****************************************************
    * Kutsuparametrit:
    * 1. start = käynnistää valintasekvenssin
    *                halutulta riviltä
    * 2. rivi = LCD-näytön rivi, 0 = ylä, 1 = ala
    * 3. paikka = merkin paikka rivillä
    * 4. data = numeroiden näyttö ( tässä int,
    *                mutta tarvittaessa float
****************************************************/
// LCD aliohjelman määrittelyt
    void Fun_LCD(int start, int rivi, int paikka, int data){
        int i = 0; // Ä(0) ja Ö(1) kirjainten kirjastoviittaus
        const byte api = B11100001; // ä-kirjain
        const byte opi = B11101111; // ö-kirjain
        const byte ast = B11011111; // aste
        byte Api[8] = // Ä-kirjain
                            {B10001,B00100,B01010,B10001,
                            B11111,B10001,B10001,B00000};
        byte Opi[8] = // Ö-kirjain
                            {B10001,B01110,B10001,B10001,
                             B10001,B10001,B01110,B00000};
        lcd.createChar(0,Api); // Huom! int i yllä!!
        lcd.createChar(1,Opi);
// Näytön valintasekvenssi
        int Seq_LCD = start;
        switch (Seq_LCD){
        case 1:
            lcd.setCursor(paikka, rivi);
            lcd.print("YL");
            i = 0; lcd.write(i); // Ä - kirjain
            lcd.print("OTSIKKO");
            Seq_LCD = 0;
       break;
        case 2:
            lcd.setCursor(paikka, rivi);
            lcd.print("Vasen:");
            Seq_LCD = 0;
       break ;
        case 3:
            lcd.setCursor(paikka, rivi);
            lcd.print("Oikea:");
            Seq_LCD = 0;
       break ;
        case 4:
            lcd.setCursor(paikka, rivi);
            lcd.print("kertaa!");
            Seq_LCD = 0;
       break ;
        case 5:
            lcd.setCursor(paikka, rivi);
            lcd.print(" ");
            Seq_LCD = 0;
       break ;
        case 11:
            lcd.setCursor(paikka, rivi);
            lcd.print(data);
            Seq_LCD = 0;
       break ;
        case 12:
            lcd.setCursor(paikka, rivi);
            lcd.print("kpl");
            Seq_LCD = 0;
       break ;
        case 13: // Koko rivin tyhjennys
           lcd.setCursor(paikka, rivi);
            lcd.print("                    ");
            Seq_LCD = 0;
     break ;
}// Valintasekvenssin loppu
}// Funktion LCD loppu

// ASETUKSET:
void setup(){
    Serial.begin(9600);
    lcd.begin(20,2);
}// Asetuksen loppu

// PÄÄLOOPPI
void loop(){

// Tulostetaan yläteksti "YLÄOTSIKKO"
    Fun_LCD(1,0,5,0);

    while(Bol_Painike = Fun_IO(1,8,0)){
       if(Bol_Painike == true && Diu_Painike == false){
           Fun_LCD(2,1,0,0);
           Fun_LCD(4,1,10,0);
           Int_VasLkm++;
           Fun_LCD(11,1,7,Int_VasLkm);
           Diu_Painike = true ; }}

   while  (Bol_Painike = Fun_IO(1,9,0)){
       if(Bol_Painike == true && Diu_Painike == false){
            Fun_LCD(3,1,0,0);
            Fun_LCD(4,1,10,0);
            Int_OikLkm++;
            Fun_LCD(11,1,7,Int_OikLkm);
            Diu_Painike = true ; }}

// Alarivin tyhjennys, kun kumpaakaan ei paineta
   if(Bol_Painike == false){
        Fun_LCD(13,1,0,0);
        Diu_Painike = false;}

delay(1);
} // Pääohjelma LOPPU

Ei kommentteja:

Lähetä kommentti