sunnuntai 12. helmikuuta 2017

KEHITYSTÄ IV

Nyt uskoin tuolle joutilaalle Arduino MICROlle löytäväni käyttöä tässä hiukan laajemmassa näppäinprojektissa. Minulla oli tavoitteena liittää yhteen Arduino, 16 painikkeen näppäimistö ja LCD-näyttö. Tavoitteena oli tehdä kiinteämpi kytkentä ja toteutus, ajatuksena käyttää sitä myöhemmin ja monipuolisemmin.
     Ensimmäinen testikytkentähässäkkä oheisessa kuvassa.
     Sinisen valon oikealla puolella oleva pieni printti on Arduino Micro. Jonkin aikaa näytti hyvältä, mutta sitten tämä mikrokontrolleri sai kyllikseen. Mitä ilmeisimmin syynä oli tuon LCD-näyton liika kuormitus. (Kohta siitä lisää.)
  
Siirryin sitten Arduino LEONARDOon, ja sellaiseen malliin, missä ei liittimiä ole valmiina, vaan kaikki ulkoiset kytkennät tehdään juottamalla kontrollerin piirilevyyn. 
     Testeissä nousi esiin, että 5V regulaattori kävi varsin kuumana, joten tuo arvio Micron rikkoutumisesta lienee oikeaan osunut. LCD-näyttö imi noin 160mA virran 5 voltin jännitteestä. Toisessa kuvassa valmis toteutus näkyy vinosti takaa. Jouduin nimittäin lisäämään laitteen takaosaan alumiinilevyn juuri tuon 5V:n regulaattorin jäähdytystä varten.

Regulaattoripiirit (7809 9V ja 7805 5V) sekä niihin liittyvät suodatinelektrolyyttikondensaattorit ovat alimmalla Vero-levyllä. Samoin rinnan-/sarjapiirit (74HCT165), kuten myös liittimet ulkoisia kytkentöjä varten. Tämän levyn päälle liittyy liittimien välityksellä Arduino LEONARDO ja ylimpänä toinen koelevy, missä on 16 kpl painikkeita sekä kaksi 8 x 10kohm:in vastushybridipiiriä digitaalitulojen kuormitusta varten

Arduino on alaspäin olevilla piikeillä pohjalevyn liittimissä
Päällekkäisrakenne ilmenee oheisesta kuvasta. Noita pieniä liittimiä olen saanut tuhoamistani Arduinoista. Aina tulee sähellettyä! Onneksi kamaa voi kierrättää.
     Vasemmalla näkyvässä vihreän liittimen kautta on laitteen syöttö (12 VDC) ja kolmantena 5 V:n lähtö joitain muita (tulevaisuudessa) tuota syöttöä tarvitsevia laitteita varten. 
     Seuraavana kaksi urospiikkiä, jotka on liitetty Arduinon sarjaliikennepinneihin (D0 RX ja D1 TX). Tässä olen samalla tehnyt ristikytkennän, joten liitettäessä tämä laite toiseen  
     Arduinoon, voi käyttää suoraa parijohdinta. Sitten on kolme naaraspinniä, jotka on liitetty vapaana oleviin digitali I/O:n (D11, D12 ja D13). Viimeisenä neljä (4) naaraspinniä analogiatuloihin (A0 .. A3). Vain neljä on liitetty, koska sopivaa kuuden (6) pinnin liitintä ei ollut. Noilla neljälläkin pärjää aika pitkälle.

Lopputulos näyttää seuraavalta: ihan oikealta ITEprototyypiltä.

Näytön yläriville Arduino on ilmaissut asenteensa tätä minun blogiprojektiani kohtaan ja alarivilla vasemmalla painikkeen numero (1 .. 16) ja oikealla vastaava bittijono (bitin paikka). YouTube-videolla (antinarduvideo37.youtube.com) on pieni esittely näppäimistöstä. Siinä numerot vaihtuvat välillä1 .. 16, eli painikkeen numero näkyy vasemmalla ja vastaavasti paikka bittijonossa oikealla.



 
Painikeryhmän kaavio ohessa. Siihen on merkitty kunkin painikkeen numeerinen arvo (0 .. 15). Tässä toteutuksessa ne ovat ainoastaan painikkeita, jotka voidaan erottaa toisistaan. Myöhemmin ne saavat varsinaisia toimintoja. Seuraavassa koko hässähän kytkentä:
Ja lopuksi tämän kertaisen sovelluksen ohjelma. Tästä ohjelmasta olen jättänyt pois kaiken sellaisen, mikä ei liity juuri tähän toteutukseen.

OHJELMA 37
/***************************************
* Ohjelma 37
* 09.02.2017
* Bitit ja painikkeen numero
**************************************/

// MÄÄRITTELYT:
// LCD-näyttö
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 2, 7,6,5,4);
boolean Arr_DATA[16];
int Int_Numero = 0;

// ALIOHJELMAT
// LCD aliohjelman määrittelyt
void Fun_LCD(int start, int rivi, int paikka, int data){
// Näytön valintasekvenssi
    int Seq_LCD = start;
    switch (Seq_LCD){
case 2:
    lcd.setCursor(paikka, rivi);
    lcd.print("LAITAN TAAS HANTTIIN");
    Seq_LCD = 0;
break;
case 11:
    lcd.setCursor(paikka, rivi);
    lcd.print(data);
    Seq_LCD = 0;
break;
}// Valintasekvenssin loppu
}// Funktion LCD loppu

// Funktio Parallel IN serial OUT (Rinnan sisään, sarjassa ulos)
// SarjaIN_Ali_v1.No4Tam17
void Fun_LueRsSu(int PL, int CP, int Data){
    pinMode(PL, OUTPUT); // pinnin numero kutsussa
    pinMode    (CP, OUTPUT); // pinnin numero kutsussa
    pinMode    (Data, INPUT);// pinnin numero kutsussa
// Rinnakkaisdatan siirto
    digitalWrite(PL, LOW);
    digitalWrite    (PL, HIGH);
    for(int i = 0; i < 16; i ++){Arr_DATA[i] = 0;}// tyjennys
        for(int j = 0; j < 16; j++){ // luku
        Arr_DATA[j] = digitalRead(Data);
        digitalWrite(CP, HIGH);
        digitalWrite(CP, LOW);
    }// sarjaluennan loppu
}// Funtion loppu

// ASETUKSET:
void setup(){
    Serial.begin(9600);
    lcd.begin(20,2);
    lcd.clear();
// Tekstit näyttöön, suoritetaan kerran
    Fun_LCD(2,0,0,0);
}// Asetuksen loppu

// PÄÄLOOPPI
void loop(){
    Fun_LueRsSu(8, 9, 10);
    for(int No = 0; No < 16; No++){ // Numeron näyttö
        if(Arr_DATA[15-No] == 1){
        Int_Numero = No + 1;
            if(Int_Numero < 10){ // Numerot 0 .. 9
                Fun_LCD(11,1,1,Int_Numero);
                lcd.setCursor(0,1);
                lcd.print(" "); // Tyjennetään kymppien paikka
            }else{
                Fun_LCD(11,1,0,Int_Numero);
            } // else if loppu
            }// if loppu
    }// for loppu
    for(int No = 0; No < 16; No++){ // bittien näyttö
        lcd.setCursor(No + 4, 1);
        lcd.print(Arr_DATA[No]);
    }// for loppu

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

maanantai 23. tammikuuta 2017

KEHITYSTÄ III

Tämä jakso ei toteutunut aivan suunnitellusti. KEHITYS III piti olla huomattavasti laajempi, mutta se siirtyy KEHITYS IV:een. Eli jatkoa seuraa. Miksi tästä sitten tuli tällainen pieni ”välipala”. Syy on seuraava: Kun mukana on LCD-näyttö ja inputtien sarjaliikennettä (ja jos vielä lähdönkin sarjaliikennettä), niin digitaliset I/O:t käyvät huolestuttavan vähiin.

Tähän on olemassa helpotus. Myös analogiapuolta voi käyttää binääri-tuloina ja -lähtöinä. Paitsi Arduino MICRO:ssa, minkä alun perin valitsin tämän jakson mikrokontrolliseksi. Syy siihen oli, että sellainen lojui tarpeettomana. Siis se ensi kerralla jaksossa KEHITYS IV.

Pinnin määrittely tapahtuu normaaliin tapaan (pinMode(pin, INPUT / OUTPUT). Tässä tosin se suoritataan I/O-aliohjelmassa. Digitalikäytössä analogiatulon A0 digitaliosoite on 14 ja viimeisen tulon A5 osoite on 19. Koska tässä ei näy aliohjelmaa (pitää kopioda), niin ohjelma typistyy kahteen riviin. Ohjelma toimii siten, että painettaessa vasenta painiketta, palaa LEDi punaisena ja painettaessa oikeaa painiketta, palaa LEDi vihreänä.
Tässä oikeanpuoleinen painike on ohitettu.
OHJELMA 36
/***************************************
* Ohjelma 36
* 23.01.2017
* Analogiapuolen käyttö digitaalisessti
**************************************/

// ALIOHJELMAT
IO_AliOhjelma_v1 IO_Ali_v1.No2Tam17
/*************************************/
boolean Fun_IO(int mode, int pinni, boolean tila){

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

// PÄÄLOOPPI
void loop(){
Fun_IO(2, 18, Fun_IO(1,16,0));
Fun_IO(2, 19, Fun_IO(1,17,0));

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

sunnuntai 22. tammikuuta 2017

KEHITYSTÄ II

Tässä sovelluksessa käytän kahta CMOS-piiriä (74HCT-165N), joissa kummassakin on kahdeksan (8) tuloa rinnan. Siis yhteensä 16 tuloa. Piirit on kytketty sarjaan siten, että toisen piirin sarjalähtö on kytketty toisen sarjatuloon. Piirien ulkoiset liitynnät luetaan bitti kerrallaan peräkkäin. Piireissä on kolme (3) liityntää Arduinon digitalipinneihin. 
     Ensimäinen on PL, minkä laskeva reuna aktivoi rinnakkaisrekistereissä olevan tiedon siirtymisen sarjarekisteriin. Tämä liityntä on kytketty rinnan molempien IC-piirien välillä. Toinen liityntä on CP, kellotus, minkä nouseva reuna siirtää bitti kerrallaan sarjarekisterin dataa lähtöön Q7. Kellotuskin on kytketty rinnan molempien IC-piirien välillä. Kolmas liityntä on data (1. piirin Q7 → 2. piirin Ds → Arduino IN). Toisin sanoen ensimmäisen piirin (alimmat bitit 0 .. 7) sarjalähtö (Q7) kytketään toisen piirin (ylimmät bitit 8 .. 15) sarjatuloon (Ds) ja toisen piirin sarjalähtö (Q7) Arduinon tuloon.
Piirin 74HCT-165N sisäinen rakenne.

On pidettävä tässä yhteydessä mielessä, että eniten merkitsevä (bitti 15) luetaan ensimmäiseksi ja vähiten merkitsevä (bitti 0) viimeisenä. Luentalauseet olen koonnut aliohjelmaksi, minkä löytämiskoodi on: SarjaIN_Ali_v1.No4Tam17. Aliohjelmassa määritellään myös tulot/lähdöt, joten pääohjelmasta kutsuttaessa parametreinä on ainoastaan liityntäpinnien numerot. Yhteistä pääohjelmalle ja tälle aliohjelmalle on 16 bitin taulukko (boolean Arr_DATA[16];), mihin aliohjelma kirjoittaa tulojen tilatiedot ohjelman jatkotoimenpitetä varten.


LCD-näyttöön tulevat tekstit olen valinnut siten, että sekä pienet että isot ääkköset tulevat mukaan. Siltä osin, kun tuo (void Fun_LCD(int start, int rivi, int paikka, int data){) näytön koodi on muuttunut, on tässä esityksessä mukana muuttuneet akeleet. Olen myös jättänyt mukaan tulostuksen aliohjelman, sillä sen avulla on havainnollisempaa tarkastella bittejä tietokoneen ja Arduinon työkaluohjelman avulla. Toiminnallisesti sillä ei ole merkitystä.
     Kuvassa mikropiirejä reunustavat ”mustat liuskat” ovat 8*10kohm vastus-hybridipiirejä. Vastuksilla on yksi (1) yhteinen maa. Tässä jokaiselle vastukselle ei ole käyttöä, koska tuloja on 16 kappaletta. Yläosassa näkyväll ”piuhalla” voi tökkiä eri tuloja. 
Kuvassa olin tökkäissyt pinniä no. 12.

OHJELMA 35
/**************************************
* Ohjelma 35
* 21.01.2017
* Rinnan sisään, sarjassa ulos
* 16 digitaalitulon toteutus
* kahdella 74HCT-165N CMOS-piirillä
**************************************/

// MÄÄRITTELYT:
// Kirjastomoduulit
   #include <LiquidCrystal.h>
   LiquidCrystal lcd(3, 2, 7,6,5,4);

// Bittitaulukko ja järjestysnumero
   boolean Arr_DATA[16];
   int Int_Numero = 0;

// Tulostuksen tahdistus
   const int Con_PrintViive = 1000;
   int Int_PrintViive = Con_PrintViive;

// ALIOHJELMAT
void Fun_Tulostus(){
//Serial.print("Teksti :"); Serial.println(Muuttuja);
for(int i; i < 16; i++){
Serial.print(Arr_DATA[i]);
}
Serial.println();
Serial.print("Tokkasit :"); Serial.println(Int_Numero);
} // Tulostus loppu

// Funktio Parallel IN serial OUT (Rinnan sisään, sarjassa ulos)
// SarjaIN_Ali_v1.No4Tam17
/****************************************************
void Fun_LueRsSu(int PL, int CP, int Data){
   pinMode(PL, OUTPUT); // pinnin numero kutsussa
   pinMode(CP, OUTPUT); // pinnin numero kutsussa
   pinMode(Data, INPUT);// pinnin numero kutsussa
// Rinnakkaisdatan siirto
   digitalWrite(PL, LOW);
   digitalWrite(PL, HIGH);
   for(int i = 0; i < 16; i ++){Arr_DATA[i] = 0;}// tyjennys
   for(int j = 0; j < 16; j++){ // luku
      Arr_DATA[j] = digitalRead(Data);
      digitalWrite(CP, HIGH);
      digitalWrite(CP, LOW);
   }// sarjaluennan loppu
   }// Funtion loppu

// LCD_AliOhjelma_v1 LCD_Ali_v1.No3Tam17
/****************************************************
case 1:
lcd.setCursor(paikka, rivi);
lcd.print("T");
i = 1; lcd.write(i); // Ö - kirjain
lcd.print("KK");
i = 0; lcd.write(i); // Ä - kirjain
i = 0; lcd.write(i); // Ä - kirjain
lcd.print(" ");
lcd.print("PINNI");
i = 0; lcd.write(i); // Ä - kirjain
 
case 2:
lcd.setCursor(paikka, rivi);
lcd.print("t");
lcd.write(opi); // ö - kirjain
lcd.print("kk");
lcd.write(api); // ä - kirjain
lcd.print("sit:");
 
case 11:
lcd.setCursor(paikka, rivi);
lcd.print("    ");
lcd.setCursor(paikka, rivi);
lcd.print(data);*/

// ASETUKSET:
void setup(){
   Serial.begin(9600);
   lcd.begin(20,2);
   lcd.clear();
   lcd.setCursor(0, 0);
   Fun_LCD(1,0,3,0); // Ylärivin kiinteä teksti
   Fun_LCD(2,1,0,0); // Alarivin kiinteä teksti
}// Asetuksen loppu

// PÄÄLOOPPI
void loop(){
   Fun_LueRsSu(8, 9, 10);
   for(int No = 0; No < 16; No++){
      if(Arr_DATA[15-No] == 1){
         Int_Numero = No + 1;
     }// if loppu
   }// for loppu

   Fun_LCD(11,1,10,Int_Numero);

   Int_PrintViive--;
   if(Int_PrintViive == 0){
      Fun_Tulostus();
      Int_PrintViive = Con_PrintViive;
   } // Tulostuskutsu loppu
delay(1);
} // Pääohjelma LOPPU

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