Arduino IDE, setup/loop, LEDky

NSWI170, 2025, Labs 02

Jáchym Bártík

Kletba #2 - konstanty

  • Pojmenovávají konstantní hodnoty
    • Především číselné a textové literály, ale i pole a objekty
    • Jména jsou unikátní, na rozdíl od hodnot
  • DRY - definice jen na jednom místě
    • Snadnější změny
    • Méně závislostí
  • Čemu se vyhnout:
    • Matematické konstanty - 0, 1, true, false, "", ...

Arduino

  • Open-source hardwarový a softwarový projekt
  • Základová deska
    • V tomto případě Arduino UNO
  • Možnost přidávat další shieldy
    • V tomto případě FunShield (je s ním spousta srandy)
  • Existuje mnoho neoficiálních klonů

 

Arduino UNO

  • CPU ATmega328P
  • 14 digitálních I/O pinů
    • 6 z nich lze použít jako Pulse With Modulation výstupy
  • 6 analogových vstupních pinů
  • Frekvence 16 MHz
  • FLASH paměť 32 KB
  • SRAM (Static RAM) 2KB
  • EEPROM (další paměť) 1 KB
  • USB-B
  • DC napájení
  • Tlačítko pro reset

FunShield

  • 3 tlačítka
  • 4 LEDky
  • 4 číselný sedmisegmentový display
  • 1 bzučák (bohužel nebudeme používat na cvičeních)
    • Ukázka #1
  • 1 potenciometr (také nevyužijme)
  • Nějaké další vstupy a výstupy
  • Tlačítko pro reset

Arduino IDE

  • Deska se připojí přes USB
    • Pokud ji IDE nedetekuje automaticky, je nutné ji vybrat manuálně
  • Sketch - program
    • Verify - kompilace
    • Upload - nahrání kódu na desku
  • Po nahrání se deska resetuje a začne rovnou vykonávat nový program
  • Knihovny - Sketch > Include Library
    • Add .ZIP library... (jednou)
    • Funshield (u dalších projektů)

Základy

  • Dvě hlavní funkce
    • setup - volá se právě jednou na začátku programu
    • loop - volá se stále dokola (řádově 1000 krát za sekundu)
  • Veškerou logiku týkající se přímo hardwaru je nutné volat až z těchto dvou funkcí.

Cvičení #1

  • Rozsviťte diodu
#include <funshield.h>

void setup() {
    pinMode(led1_pin, OUTPUT); // Declare given pin as output
    
    digitalWrite(led1_pin, ON); // Set voltage on the pin
}

void loop() {
    
}
  • Všechny konstanty jsou v uvedené knihovně
    • ON a OFF mohou být prohozeny, kdyžtak si to opravte

Cvičení #2

  • Rozblikejte diodu
    • Funkce delay(int milliseconds) umožňuje aktivní (blokující) čekání
constexpr int PERIOD = 100;   // In milliseconds

void loop() {
    // Do something
    
    delay(PERIOD);        // Wait
    
    // Do something else ...
}

Cvičení #3

  • Rozblikejte diodu bez delay
    • Vždy je lepší vyhnout se blokujícímu čekání
    • Funkce unsigned long millis() vrací počet milisekund od něčeho (zapnutí napájení? restart?)
    • Přeteče za ~50 dní
unsigned long lastTime;
unsigned long timer;

void setup() {
    lastTime = millis();
    timer = 0;
}

void loop() {
    unsigned long currentTime = millis();               // Time since start
    unsigned long deltaTime = currentTime - lastTime;   // Time since last loop
    
    lastTime = currentTime;
    timer += deltaTime;                                 // Resetable timer
}

Ukázka #2

  • Více nezávislých časovačů s různými periodami
    • Pomocí delay by to prakticky nebylo možné
  • Většinu logiky schováme do OOP

Odevzdávání do ReCodExu

  • Moccarduino - emulátor Arduina a FunShieldu
    • Funguje na úrovni API funkcí, neemuluje fyzickou desku
    • V některých detailech se může lišit
  • Některé testy jsou tricky
    • Důsledně dodržujte specifikaci
      • Pozor na rozdíly v řádu milisekund, na fyzické desce nejsou vidět, ale testy je odhalí
    • Pokud si přesto myslíte, že chyba není na vaší straně, kontaktujte nás co nejdřív

Domácí úkol #2

  • Zobrazte složitější vzor
    • Jeden krok trvá 300 ms
    • V každém kroku svítí právě jedna dioda
    • Vzor je: 1, 2, 3, 4, 3, 2, 1, 2, ...

Cvičení #4 (bonus)

  • Zobrazte libovolný vzor
    • Nemusí být nijak pravidelný
    • Vymyslete vhodné kódování pro uložení fází
    • Periodicky přepínejte z jedné fáze do druhé

Ukázka #3

  • PWM (Pulse With Modulation)
    • Dioda má dvě možné intenzity - 0 a 1
    • Rychlým střídáním těchto stavů můžeme docílit libovolné průměrné intenzity
  • Předpokládejme spojitou funkci I = I(t)
  • Obecně náhodná časová řada
  • Dva přístupy:
    • Přesný - numericky integrujeme I
    • Náhodný - porovnáváme I s náhodnou hodnotou
      • Stačí nám znát I jen v diskrétních časech
      • V dlouhodobém průměru je přesný