Vy už jste se dopracoval k něčemu funkčnímu, ale třeba se chcete Vy (nebo jiný čtenář) něco naučit, tak si to dovolím okomentovat:
V tom původním programu byl problém, že podmínka na konci
do {} while ()
cyklu byla obráceně, mělo tam být spíš
while( i != 12 )
nebo
while( i < 12 )
když proměnná i jde odspodu. Tenhle typ cyklu totiž
běží, dokud je podmínka je splněná, odpovídá to významu anglického slova "while" (na rozdíl třeba od Pascalu, kde je repeat ... until cyklus, který
skončí, až když je podmínka splněná, neboli
běží, dokud není podmínka splněná, což odpovídá zase významu "until". V češtině má while význam "zatímco", until "až", pro programování výstižněji while=dokud je, until=dokud není)
Ten kód je trochu hůř čitelný. V tomto případě bych raději psal cykly for, které jsou nakonec v těchhle běžných iteracích čitelnější, protože to důležité mají napsané na jednom místě. U
do{}while()
(anebo
while(){}
) cyklu musí někde být napsaná inicializace (třeba
i=0
), někde krok (
i++
) a někde podmínka (
i<7
), ale jazyk si nechá líbit, i když to bude po zdrojáku rozházené, jako třeba v tom Vašem.
Proměnné, které se používají jen jako pomocné (třeba pro řízení cyklů) v jedné funkci, by měly být v té funkci lokální (přesunout deklaraci A,i,j dovnitř loop). Dokonce je možné je deklarovat i jen pro ten cyklus takhle:
for(byte i=0;i<12;i++)
, a pak použít jen uvnitř něj. Může to pomoct překladači pro snazší překládání a taky člověku, kdyby tu proměnnou omylem použil vně cyklu (kde to nedává smysl), tak překladač pozná, že to je chyba. Nicméně tady v tomhle prográmku to je skoro jedno.
Když se pin používá jako analogový, tak není potřeba ho nastavovat jako OUTPUT.
Pokud proměnná nabývá jen malých hodnot (0 až 255), stačí pro ní na malých Arduinech typ byte místo int, vykonávání je pak rychlejší a kód zabírá míň místa (malá Arduina mají základní datovou jednotku jednobytovou, ale int je dvoubytový, takže výpočty s ním se musejí dělat trochu složitěji; to sice člověk při psaní programu nevidí, zařídí to překladač, ale v principu je vhodné tomu zařízení trochu pomoct anebo aspoň nedělat mu špatně). Akorát je potřeba mít jistotu, že s každou proměnnou budu pracovat v rozsahu jejích možných hodnot, tj. do proměnné typu byte nikdy program nebude chtít dát záporná čísla nebo čísla větší než 255 (nebo je s takovými porovnávat), to by sice procesor přežil, ale výsledek by byl špatně. No a cykly v tomhle prográmku pracují s čísly od 0 do něco přes 10, to je pro byte OK. Úspora (paměť i čas) je možná nicotná, ale myslím, že je lepší dělat to pořádně než "tak nějak, ono to nevadí".
Co se týče významu kódu, pak bych se zeptal, jestli to přidávání "světla" ve 12 a následné ubírání "tmy" ve 13 krocích s vnitřním cyklem po 7 a 6 krocích s pevnou délkou čekání 15 a 13 ms plus variabilní 0 až 11 ms resp. 14 až 2 ms tak bylo myšleno, nebo jestli to byly tak nějak postupně naštelované konstanty. Já bych to asi psal tak, že dvojice čísel jsou stejné (12+12, 7+7, 15+15) a navíc jako nadefinované konstanty někde na začátku kódu, abych při změně nemusel procházet celý kód a měnit třeba 14 na 13 a pak na 12 kdyby to ještě bylo moc, přičemž bych si určitě (znám se) změnil 13 na 12 i v příkazu pro zapínání LED
digitalWrite(13,HIGH)
na
digitalWrite(12,HIGH)
a pak bych se divil, že to přestalo fungovat. Proto i pin, kam je zapojená LED, bych si udělal jako konstantu na začátku programu.
Ještě přidám trochu přepsaný kód, mělo by to dělat úplně to samé, ale snad trochu čitelněji:
Kód: Vybrat vše
#define LED 13
#define SPINAC A7
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
int A;
byte i;
byte j;
A = analogRead(SPINAC);
if (A > 400) {
for (i = 0; i < 12; i++)
{
for (j = 0; j < 7; j++)
{
digitalWrite(LED, HIGH);
delay(i);
digitalWrite(LED, LOW);
delay(15);
}
}
for(i=14;i>1;i--){
for(j=0;j<6;j++){
digitalWrite(LED,HIGH);
delay(13);
digitalWrite(LED,LOW);
delay(i);
}
}
digitalWrite(LED,HIGH);
delay(2000);
digitalWrite(LED,LOW);
}
}
Tady ještě formátovací poznámka, v první části jsem to proložil víc mezerama, v druhé to je kompaktnější. Překladači to je jedno, záleží na tom, co je pro koho čitelnější, tady to dávám jen pro ukázku různých stylů.