LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Arduino IV.

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 | Články autora | přečteno 16280×

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.

  1. Pomocí potenciometru vyberte 1 z 16 LED (nápověda - 1. možnost: funkce Map 2. možnost: IF + For)
  2. Přidejte k prvnímu úkolu jeden potenciometr, kterým regulujte jas LED.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

28.7.2016 15:51 / pepan
Re: NetBeans vs Eclipse

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

7.5.2016 14:58 / Teodor Komárek
Soubory

20.4.2016 0:07 / Jakub Cleing
Sázkový panel PHP FUSION

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze