Stmívač LED pásku - Software v. 1.1

Zápisník experimentátora

Hierarchy: Stmievač LED pásika pomocou ATtiny85

V tomto článku vysvětlím princip činnosti stmívače LED pásků. Je to druhý ze série článků, na kterých vám ukážu, jak postupně probíhá vývoj programů a jak diametrálně se může lišit výsledný program. Postupně projdeme zdrojové kódy programu od verze 1.0 po verzi 1.3.

Tento text popisuje zastaralou verzi kódu. V době psaní článku byla aktuální verze kódu 1.3. Tato verze je zde analyzována proto, abyste si mohli podívat, jak probíhá vývoj programů metodou postupného přibližování.

V ideálním světě napíšete ideální program hned napoprvé a nebudou v něm žádné chyby a bude dělat přesně to, co jste si představovali. A teď vítejte v reálném světě, ve kterém jsem se pokusil naprogramovat logiku stmívání tak, aby vyhovovala práci v kuchyni.

Arduino IDE

Kód byl vyvíjen ještě pro verzi 1.0.6, ale bez problémů jej lze zkompilovat iv 1.6.13 nebo 1.8.1. Zabírá po zkompilovaný 2206 (2440 se zapnutým debuggování) bajtů. Je nutné mít nainstalovanou podporu pro programování ATtiny85.

Programování

V tomto programu jsem se soustředil na vylepšení základní činnosti programu. Celý vývoj probíhal na vývojové desce pro ATtiny85, kterou jsem již popisoval v předchozím článku.

  • Debuggování - Doplnil jsem jednoduché debuggování pomocí podmíněného překladu a blikání pomocnou LED diodou.
  • Vylepšení reakce na signály ze senzoru - Nyní program trvale svítí, pokud zaznamenává signál ze senzoru a čas rozsvícení není součástí intervalu svícení, čili světlo svítí o trochu déle. Teprve když signály ustanou (což je znamením, že člověk opustil místnost), světlo se po čase zhasne.

Debuggování

Nejprve si popíšeme debuggování pomocí pomocné LED diody. Debuggování je založeno na existenci nebo neexistenci makra RDEBUG. Pokud neexistuje (finální verze kódu), potom nejsou vůbec použity piny 2 a 3 a všechny makrofunkcie jsou definovány jako prázdné, což znamená, že překladač všechen ten kód ze zdrojáků jednoduše odstraní.

Pokud je makro definováno (ladící verze kódu), makrofunkcie SIGNAL a SHOWIN mají v sobě funkční kód. První jen krátce blikne a druhá signlizuje stav senzoru. Používám je v kódu na to, abych pomocí bliknutí nebo stavu LED diody viděl, co se v programu děje. Ještě stojí za zmínku, že během ladění mám zkrácen interval hold_value na 15 sekund. Je to z praktických důvodů, protože během ladění není důvod čekat desítky sekund na zhasnutí osvětlení.

#define RDEBUG

// pin definitions
const int led = 0;
const int dig = 1;
// base ON period
const unsigned long pot_value = 2000;
unsigned long dig_last;
int value = 0;
// base hold period
#if defined RDEBUG
const int dig_signal = 2;
const int dig_in = 3;
#define SIGNAL digitalWrite(dig_signal, HIGH); \
  delay(200); \
  digitalWrite(dig_signal, LOW); \
  delay(20);
#define SHOWIN(a) digitalWrite(dig_in, a);
const unsigned long hold_value = 15*1000L;
#else
#define SIGNAL
#define SHOWIN(a)
const unsigned long hold_value = 45*1000L;
#endif

Lépe to bude vidět na konkrétním příkladu. Například během startu programu ve funkci setup. Vidíte, že během ladění se používají jiné příkazy, než během finální verze.

void setup() {               
  pinMode(led, OUTPUT);
  pinMode(dig, INPUT);
#if defined RDEBUG
  pinMode(dig_signal, OUTPUT);
  pinMode(dig_in, OUTPUT);
  SIGNAL
  digitalWrite(dig_in, HIGH);
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
  delay(200);
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
  delay(200);
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
  digitalWrite(dig_in, LOW);
  SIGNAL
#else
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
  delay(200);
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
#endif
}

Vylepšení reakce na senzor

Jak je vylepšená reakce na senzor? Po rozsvícení se nastaví plná délka intervalu. Dříve se rozsvícení započteno do délky intervalu a díky tomu to svítilo o něco kratší dobu.

void loop() {
  int p=digitalRead(dig);
  SHOWIN(p)
  if(p) {
    LightOn();
    SIGNAL
    dig_last=millis()+hold_value;
    LightHold();
    SIGNAL
    LightOff();
  }
}

Zbytek změn jsou jen drobné vylepšení, které upravují konkrétní délky jednotlivých stavů programu.

Zdrojový kód

Zdrojový kód se nachází na GitHub.


25.01.2018


Menu