![]() |
||
Projekt 11.Cyklické zobrazovanie čísel na LED displejiCieľ lekcie:
Zadanie:Vytvorte program ktorý v hlavnom cykle pomocou programu vypisIntCislo(cislo); zobrazí, na 7 segmentovom displeji s tromi digitmi, číselný údaj predtým vložený do premennej "val" typu integer. Analýza:Počiatok analýzy ktorá rieši funkciu LED zobrazovačov je rovnaký ako v Projekte1. Kto to pochopil môže priamo preskočiť ďalej na Analýzu taktiky programovania.
Vysvetlíme si ich význam:
pinMode(13, OUTPUT); // Nastav režim Vstupno/Výstupného pinu 13 na VÝSTUP
pinMode(13, INPUT); // Nastav režim Vstupno/Výstupného pinu 13 na VSTUP
Sú len dve možnosti použitia pinov ARDUINA: OUTPUT (VÝSTUP) a INPUT (VSTUP). Piny 0 až 13 označené DIGITAL na doske ARDUINA predstavujú digitálne Výstupy a Vstupy. Niektoré z nich umožňujú aj tzv. "Analógový" PWM výstup, ktorý je v podstate digitálny, ale periodický signál (pravidelne strieda log0 a log1 s periódou zvyčajne okolo 10kHz. Pomer plôch medzi log1 a log0 v takomto signáli môžeme programovo meniť, čím ovplyvňujeme množstvo tečúcej energie. Takýto signál nahradí analógový regulátor napätia). Ďalší konektor ARDUINA označený ANALOG IN používa piny 0 až 6 ako samostatné detektory analógových napätí v rozsahu 0 - 5 V. Pomocou týchto vstupov vie mikropočítač vzorkované hodnoty digitalizovať a spracovať do formy celého čísla v intervale hodnôt 0 až 1023. V prípade vyšších napätí sa tieto dajú prispôsobiť odporovým deličom ( presne kalibrovanom a presne určeným pomerom ) a ošetriť prepočtom v programe v priamej úmere medzi nameranou a skutočnou hodnotou. Nasledovné inštrukcie vám pomôže pochopiť animácia s doskou ARDUINA.
digitalWrite(13, HIGH); // Nastav na pine 13 logickú úroveň HIGH t.j. log1
digitalWrite(13, LOW); // Nastav na pine 13 logickú úroveň LOW t.j. log0
Poslednou inštrukciou vo vzorovom príklade je inštrukcia vyvolávajúca spomalenie programu:
delay(1000); // Počkaj sekundu t.j. 1000 milisekúnd
Ovládanie 7 segmentového displeja využíva 7 bitov pre každý segment samostatne. Nastavovať ich postupne samostatnými bitovými príkazmi sa dá, ale efektívnejší spôsob je zápis celého kódu do výstupného portu naraz viď. dokumentácia Arduina http://www.arduino.cc/en/Reference/PortManipulation.
PORTD = B10101000; // nastaví digitálne bity portu D piny 7,5,3 na HIGH (log1)
Analýza taktiky programovaniaHľadajte odpovede na tieto čiastkové úlohy:
byte kod7segZn[]={ // pole pre uloženie kódov číslic pre sedem segmentový displej
B01111111, //0
B00001101, //1
...
B11011111 //9
};
unsigned long timediff;
int cas=10;
void loop()
{
timediff=millis(); // nastav nové počítanie času
while(millis()-timediff<=cas) { AKCIA1 } // Akcia bude Tri krát zopakuj AKCIU
timediff=millis(); // nastav nové počítanie času
while(millis()-timediff<=cas) { AKCIA2 } // Akcia bude Tri krát zopakuj AKCIU
timediff=millis(); // nastav nové počítanie času
while(millis()-timediff<=cas) { AKCIA3 } // Akcia bude Tri krát zopakuj AKCIU
}
int cislo=1235; // v premennej cislo nastavíme hodnotu obsahujúci tis, stov, des a jed byte tis,stov,des,jed; // premenné na uloženie separovaných číslic int pom; // pomocná premenná int cis=cislo; // pracovná premenná pom=cis/10; // do premennej pom odseparovalo tisíce, stovky a desiatky jed=(byte)(cis % 10); // odseparovanie jednotiek pom=cis/10; // do premennej pom odseparovalo tisíce, stovky a desiatky des=(byte)(cis % 10); // odseparovanie desiatok // ... atď. Nasledovný príklad využíva premenné typu pointer (je určený pre chápavejších žiakov, takže sa rozhodnite sami) :
val=1253; // premenná obsahujúca originál hodnoty
// originál číslo val zmenší 10 násobne a vráti ASCII kód jednotky
byte separujJednotky(int* hodnota) // pôvodná premenná "val", na ktorú ukazuje pointer "hodnota"
{ // sa zmenší o jednotky
int pom=*hodnota;
*hodnota= *hodnota/10; // odseparovanie jednotiek - celočíselným podielom
pom=(*hodnota) % 10; // odseparovanie jednotiek - oper.modulo (zvyšok po delení)
return ((byte)pom);
}
void loop()
{...
jed=separujJednotky(&val); // &val predstavuje adresu premennej val
des=separujJednotky(&val); // po každom použití sa z premennej val odseparujú jednotky
stov=separujJednotky(&val); // a zvyšok sa zmenší na 1/10-tinu
tis=separujJednotky(&val);
...
}
Dostávame sa ku konečnému riešeniu. Cieľom je vytvoriť taký algoritmus funkcie (podprogramu), ktorý dokáže meniť svoju pracovnú činnosť podľa hodnôt parametrov uvádzaných v zátvorke za názvom funkcie (pri väčšom počte sú oddelené čiarkami). Parametre sú premenné, ktoré sa odovzdajú bloku podprogramu ako lokálne premenné nastavené pri volaní funkcie (t.j. podprogramu)(Poznámka: zavolať podprogram - znamená v jazyku programátorov spustiť podprogram z iného programu s tým, že po ukončení podprogramu sa postupnosť vykonávania inštrukcií vráti za inštrukciu, ktorá spustila podprogram). Pri štarte funkcie (podprogramu) sa skutočné parametre - hodnoty použité pri volaní funkcie- priradia tzv. formálnym parametrom funkcie t.j. externé údaje sa skopírujú do lokálnych premenných bloku funkcie. Ak vytvárame podprogramy schopné vykonávať rôzne činnosti na základe zmenených parametrov nazývame ich - programy riadené údajmi. Prevedenie:Vytvorte program s názvom zobrazNa3x7segmLed(int udaj). Upravte ho tak, aby pri hodnote prevyšujúcej 999 vypísal na displeji správu Err. Ak máte bredboard (prepojovaciu skúšobnú dosku) prepojte na nej LED displej aj s ochrannými odpormi a napojte ho na PORTD mikropočítača ARDUINA. Vyskúšajte vytvorený podprogram a naučte sa čiastkové algoritmy (t.j. vykonávajúce konkrétnu prácu ktorú viete pomenovať) zjednodušovať tak, aby ste pri programovaní vytvárali čo najviac podprogramov. Do programu skúste vpašovať snímanie analógovej hodnoty z potenciometra podľa vzoru (http://arduino.cc/en/Tutorial/AnalogReadSerial) v ktorom sa sníma analógová veličina na potenciometri a zobrazujú namerané hodnoty . Otázky:
Ak ste nezaváhali ani v jednej otázke a úlohu ste zvládli postupujete do projektu 12.
|
||
|
|
||