V tomto díle si ukážeme řešení úkolu z minulého dílu, poté se vrátíme k pásu LED diod, na němž si ukážeme funkci 4-bitového dekodéru
BCD kódu na 1 z 16 a funkci Map. Také si ukážeme logickou funkci If.
12.1.2012 00:00 | Zbyšek Voda | read 21684×
DISCUSSION
V minulém díle jsme si řekli něco o proměnných a cyklech. Ukázali sme si, jak funguje sériová komunikace
a naučili jsme se číst analogová a digitální data. Nakonec jsme vyzkoušeli, jak funguje PWM.
Řešení úkolů
Úkol 1.
int cekej = 10; //kolik milisekund bude program čekat mezi jednotlivými kroky
void setup() {
pinMode(12, OUTPUT); //pin 12 nastaven jako výstupní
Serial.begin(9600); //začátek sériové komunikace
}
void loop() {
//tento cyklus rozsvěcuje LED
for(int jas=0; jas < 255; jas++){
analogWrite(12, jas);
Serial.println(jas);
delay(cekej);
}
//tento ji zhasíná
for(int jas=255; jas > 0; jas--){
analogWrite(12, jas);
Serial.println(jas);
delay(cekej);
}
//oba dva cykly posílají data o jasu led diody přes sériovou linku
}
Úkol 2.
void setup() {
pinMode(12, OUTPUT); //pin 12 nastaven jako výstupní
Serial.begin(9600); //začátek sériové komunikace
}
void loop() {
int jas = analogRead(A0) / 4; //čte hodnotu na potenciometru
/*důvod,proč je hodnota vydělena 4 je jednoduchý
funkce analogRead pracuje s 1024 hodnotami (0 - 1023),
kdežto analogWrite pouze s 256 hodnotami (0 - 255)
1024 je čtyřnásobek čísla 256, proto pro úpravu na správnou hodnotu dělíme čtyřmi*/
analogWrite(12, jas);
}
Pás z 10 LED
Vytvoříme si hada, jako v minulém díle, ale z 10 LED. Na něm si ukážeme užitečné funkce.
Takto může vypadat kód, který postupně rozsvětsuje a zhasíná diody. Je to upravený kód z minulého dílu.
int cekej= 250;
int LED[10] = {12,11,10,9,8,7,6,5,4,3};
void setup() {
for (int x=0; x< 10; x++) {
pinMode(LED[x], OUTPUT);
}
}
void loop() {
for (int y=0; y< 10; y++) {
digitalWrite(LED[y], LOW);
delay(cekej);
}
for (int z=0; z< 10; z++) {
digitalWrite(LED[z], HIGH);
delay(cekej);
}
}
Funkce Map
Tato funkce se používá, když chceme převést data nabývající rozsahu například 0-1023 na data 0-255 tak,
aby procentuální podíl zůstal zachován. Následujícím příkladem můžeme nahradit dělení čtyřmi v úkolu 2.
Pokud váháte, zda použít raději dělení, nebo funkci map, je to jen na vás. Při použití map je výsledek "elegantnějsí a čistčí".
Na funkčnosti projektu se ale nic nemění. Při použití dělení by problém nastal, kdyby vstupní a výstupní rozsah byli nesoudělná čísla.
Syntaxe je následovná:
int jas1 = analogRead(A0);
int jas2 = map(jas1, 0, 1023, 0, 255);
//z rozsahu 0-1023 jsme přemapovali proměnnou jas1 na 0-255
analogWrite(12, jas);
Podmínka IF
Do češtiny překládáme jako KDYŽ. Je to běžná funkce ve většině "vyšších" programovacích jazyků.
Než se pustíme do podmínek, ukážeme si porovnávací operátory, které se v podmínkách vyskytují.
== - rovná se
!= - nerovná se
< - menší než
> - větší než
<= - menší nebo rovno
>= - větší nebo rovno
&& - logické a (AND) - výsledek je logická 1, když jsou oba výroky pravdivé
|| - logické nebo (OR) - výsledek je logická 1, když je alespoň jeden výrok pravdivý
! - logická negace (NOT) - když je výrok pravdivý, po znegování je nepravdivý a naopak
Zápis podmínky vypadá takto.
if(podmínka 1){
//co se stane, když je splněna podmínka
}
else if(podmínka 2) {
//co se stane když je splněna 2 podmínka
//tato část je nepovinná, může zde být libovolně mnohokrát
}
else {
//co se stane, když není splněna ani jedna podmínka
//tato část je také nepovinná
}
příklad:
if(abc < 0){
//když je proměnná abc menší než nula proběhne kód zde
}
else if(abc == 0){
//když je proměnná abc rovna kód zde
}
else if((abc > 10) && (abc < 20)){
//když je proměnná abc mezi 10 a 20 proběhne kód zde
}
else{
//když je proměnná abc větší než nula proběhne kód zde
}
4-bitový dekodér BCD kódu 1 z 16
Co to vlastně je? 4 bitový znamená, že dekodér pracuje se 4 bitovou vstupní informací. Jednoduše řečeno, má čtyři vstupní piny.
Kombinací jedniček a nul na těchto vstupech se dá docílit nastavení logické 1 na jednom z 16 výstupů. BCD kód znamená binary coded decimal,
neboli binárně zakódovaná číslice v desítkové soustavě. Převodní tabulky z BCD na desítkovou soustavu můžete najít ve spoustě zdrojů na internetu.
Zapojení je pak jednoduché. Na internetu si najděte datasheet (popis) vašeho dekodéru a připojte napájení podle popisu v něm.
Propojte vstupy dekodéru s Arduinem a na každý každý z výstupů dekodéru připojte LED diodu. Vše následující popíšu v kódu.
int piny[4]={12,11,10,9}; //na těcto pinech je dekodér připojen
//nastavíme, jaká kombinace je potřebná k rozsvícení každé LED
int led[16][4]={{0,0,0,0}, //pod indexem 0 je uložena
{1,0,0,0}, //kombinace 0,0,0,0 - bude svítit 1. LED
{0,1,0,0},
{1,1,0,0},
{0,0,1,0},
{1,0,1,0},
{0,1,1,0},
{1,1,1,0},
{0,0,0,1},
{1,0,0,1},
{0,1,0,1},
{1,1,0,1},
{0,0,1,1},
{1,0,1,1},
{0,1,1,1},
{1,1,1,1}};
int cislo = 10; //jakou led chceme zobrazit
void setup() {
for(int x=0; x<4 ; x++){
pinMode(piny[x],OUTPUT);
}
}
void loop() {
for(int x=0; x<4 ; x++){
digitalWrite(piny[x],led[cislo][x]);
}
}
Úkoly
Pro procvičení mám pro Vás dva úkoly.
- Pomocí potenciometru vyberte 1 z 16 LED (nápověda - 1. možnost: funkce Map 2. možnost: IF + For)
- Přidejte k prvnímu úkolu jeden potenciometr, kterým regulujte jas LED.