maanantai 11. huhtikuuta 2016

LED-patsas ja for-lause

Tämän sivun tehtävänä on selventää for-lauseen rakennetta. Se on yleensä muotoa:

for (int i = alkuarvo; i <= loppuarvo; i++){ mitä tehdään }. Käsky on siis for ja sen jälkeen sulkeissa määritellään muuttuja int i. Muuttuja voidaan määritellä muuallakin, mutta on kätevää määritellä se tässä paikalliseksi. Myöskään nimen ei tarvitse olla tuota selkeämpi. Seuraavaksi muuttujalle annetaan alkuarvo esim. i = 0, Tämä on kokonainen käskyrivi, sillä se päättyy puolipisteeseen ( ; ). Seuraavaksi muuttujaa verrataan loppuarvoon. for-lausetta suoritettaan niin monta kierrosta, kun tämä ehto on voimassa. Lopuksi kasvatetaan muuttujaa i++;. Jos tämä unohtuu tai siinä on jokin virhe, saattaa for-lause jäädä pyörimään ”ikuiseksi”. Muuttujan ei tarvitse kasvaa. Se voi myös pienetä. Se ei tarvitse myöskään muuttua yhden välein, vaan esim. pienetä i = i – 3, jolloin muutos tapahtuu kolmen välein. Tämä on kontrolliosa ja tämän jälkeen kaarisulkujen sisällä on varsinainen toiminta, mikä suoritetaan ehtojen määrittämä lukumäärä. Tässä tapauksessa potentiometrin asennosta riippuva muuttuva määrä, yhteensä10 kertaa.
Tässä on käytössä pieni 10 LEDin patsas. Tällaisia voi nähdä mittareissa, vahvistimissa ja monissa paikoissa, missä informaatioksi riittää karkeahko suuruusluokka. Äänen voimakkuuden näyttö on yksi tyypillinen esimerkki. Tässä on vain 10 LEDiä. Jos tarvitaan enemmän, on myös analogiatulot mahdollista määritellä digitaalilähdöksi (myös tuloksi). Aika pian tämäkin raja tulee kuitenkin vastaan. Silloin on mahdollista käyttää sarja-/rinnanmuunninta, esim. 74HC595 - siirtorekisteriä, mihin data syötetään sarjana (bitit peräkkäin) ja sen jälkeen kellotetaan rinnakkaislähtöihin. Kussakin piirissä on kahdeksan lähtöä ja piirejä voidaan useita kytkeä sarjaan. Tällä on mahdollista syöttää kymmeniä LEDejä.

Aikamoisen piuhahässäkän nämä kymmenenkin vaativat. Kahdeksan etuvastusta on yhdessä piirissä ja kahdelle alimmalle on omat erilliset vastuks set. Onnistuin jopa lataamaan jonkinlaisen You Tube söhellyksen osoitteeseen antinarduvideo8. youtube.com

Ohjelmassa on hyvä kiinnittää huomiota asetusosaan, missä yhdellä for-lauseella määritellään kaikki 10 digitaalilähtöä OUTPUTiksi. Tuo millis() ominaisuus ja lauseet ovat vain sen vuoksi, että niillä voi halutessa monitoroida laskentaa mikroprosessorissa.

Ohjelma 8
/***************************************
 *  Ohjelma 8
 *  11.04.2016
 *  10 kpl LED-patsaan ohjaus
 **************************************/

// MÄÄRITTELYT:
// Kellon määrittely
unsigned long Ulo_MilliSek = 0;
unsigned long Ulo_UusiMilliSek = 0;
const long CoL_EroSekunti = 999;
int Int_Sekunti = 0;
boolean Bol_Tulosta = true; // Tulostusta ohjataan kellolla

const int Con_AnaTulo = 0;
int Int_Ana_Arvo = 0;
int Int_OhjausArvo = 0;
const int Con_MinPinni = 2;
const int Con_MaxPinni = 11;

// ASETUKSET:
void setup(){                 
 Serial.begin(9600);         
for (int i = Con_MinPinni; i <= Con_MaxPinni; i++){
  pinMode(i, OUTPUT);}
} // Asetuksen loppu

// PÄÄLOOPPI Varsinainen suoritusosa. Jatkuva suoritus
void loop(){
// Sisäisen kellon käyttö
Ulo_MilliSek = millis();
  if(Ulo_MilliSek - Ulo_UusiMilliSek > CoL_EroSekunti){
    Ulo_UusiMilliSek = Ulo_MilliSek;
    Int_Sekunti++;
    if (Bol_Tulosta == true){Fun_Tulostus();}
  }
Int_Ana_Arvo = analogRead(Con_AnaTulo); // Luetaan tulo
Int_OhjausArvo = map(Int_Ana_Arvo, 0, 1023, Con_MinPinni, Con_MaxPinni+1); 

// LEDien ohjaukset
  for (int i = Con_MinPinni; i <= Int_OhjausArvo; i++){
   digitalWrite(i, HIGH); // LEDit syttyvät
  }
 for (int i = Int_OhjausArvo; i <= Con_MaxPinni; i++){
   digitalWrite(i, LOW); // LEDit sammuvat
  }
 
delay(1);
} // Pääohjelma LOPPU

// FUNKTIOT
void Fun_Tulostus(){
//Serial.print("Teksti :");  Serial.println(Muuttuja);
Serial.print("Analogiatulo :");  Serial.println(Int_Ana_Arvo);
Serial.print("Ohjausarvo :");  Serial.println(Int_OhjausArvo);
}


Ei kommentteja:

Lähetä kommentti