Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Arduino - analogovy pin jako digital pin.

Zdravím.
Tady.
https://www.arduino.cc/en/Tutorial/AnalogInputPins
Co jsem na tom špatně pochopil?
Nastavil jsem tyto piny na vstup a na každý pověsil odpor.
Odpor by měl byt připojen na + takže bych měl mit na těch pinech HIGH, ne?


void setup() {
Serial.begin(9600);
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
pinMode(A2,INPUT_PULLUP);
pinMode(A3,INPUT_PULLUP);
pinMode(A4,INPUT_PULLUP);
pinMode(A5,INPUT_PULLUP);
}

void loop() {
if (digitalRead(A0 == LOW))
    {
    Serial.println("A0 == LOW");
    }

if (digitalRead(A1 == LOW))
    {
    Serial.println("A1 == LOW");
    }

if (digitalRead(A2 == LOW))
    {
    Serial.println("A2 == LOW");
    }

if (digitalRead(A3 == LOW))
    {
    Serial.println("A3 == LOW");
    }

if (digitalRead(A4 == LOW))
    {
    Serial.println("A4 == LOW");
    }

if (digitalRead(A5 == LOW))
    {
    Serial.println("A5 == LOW");
    }

}
Předmět Autor Datum
Ten zápis je nějaký podivný. Nemělo by to spíš být nějak jako: if (digitalRead(A0) == LOW) ?
Wikan 15.05.2019 20:57
Wikan
Aha, dik ;-) Že to arduino ID sežralo a s digital piny to funguje.
P1 15.05.2019 21:12
P1
No podle mýho to chybu nevyhodilo proto, že prostě v podmínce if je volání funkce digitalRead() a to…
Pavel 15.05.2019 21:25
Pavel
digitalRead vraci bool (true/false), coz je presne to, co if () ocekava. A0 == LOW se prelozi na po…
gilhad 16.05.2019 13:26
gilhad
If právě nevyžabuje striktně true/false. Tohle je právě to, na co je potřeba si v céčku dávat pozor.…
ml1 17.05.2019 14:43
ml1
Ono v céčku je false nula a true cokoli jiného, protože takhle to je i ve strojáku. A hojně se toho… poslední
gilhad 17.05.2019 20:23
gilhad

digitalRead vraci bool (true/false), coz je presne to, co if () ocekava.

A0 == LOW se prelozi na porovnani konstanty v A0 (ktera odpovida internimu cislu pinu) a konstanty LOW (ktera se rovna nule) a vysledek je true/false pokud jsou stejne/ruzne. Ale true je 1 a false je 0, takze se digitalRead() vola s parametrem 0 nebo 1, coz jsou obe validni hodnoty.

Ze si autor predstavoval neco jinehjho nema prekladac sanci zjistit - jemu vsechno perfektne sedi (a dokonce by sel vymyslet priklad, kde by to davalo i spravny smysl).

Jak pise Wikan, spravne to chces ve tvaru
if (digitalRead(A0) == LOW)

kdy nactes hodnotu z pinu A0 a tuto hodnotu porovnas LOW a podle toho se rozhodnes.

If právě nevyžabuje striktně true/false. Tohle je právě to, na co je potřeba si v céčku dávat pozor. Ono by to sežralo i kdyby výsledek nebyl bool. Takže klidně

if (A=123)...

by taky prošlo, protože bool v céčku ani pořádně neexistuje, je to normální celé číslo, pokud je nula, je to false, pokud něco jiného, je to true. A tím, že i přiřazení má výstupní hodnotu, tak to projde a možná ještě optimalizátor tu podmínku vypustí (nechá jen přiřazení a akce pro splněnou podmínku), protože je mu jasné, že bude vždy splněná. Tohle je potřeba si ohlídat, hlavně pro ty, co jsou zvyklí na pacsal, kde = je porovnání (přiřazení je :=). Obecně v céčku tím, že tam není tak přísná typová kontrola (bool je totéž co int/uint, char je totéž co int, ukazatel je taky kompatibilní s int), překladač sežere různé sémantické nesmysly a programátor se pak nestačí divit.
Na druhou stranu to dává určité možnosti, prostě dá se najít smysluplné využití, kde to usnadní zápis a zpřehlední zdrojový kód (pokud to kód zatemní, tak není dobré se k tomu uchylovat, já třeba mám problémy s konstrukcemi typu ++c*=něco, to mi vždy dá práci rozklíčovat, kam se přiřazuje a přitom při rozepsání na dva řádky c*=něco a c++ nebo opačně je to na první pohled zřejmé).

Dokonce to true ani nemusí být nastavené na 1, když jsem se někdy prodíral programem, zjistil jsem, že je nastavený obvykle jeden bit, ale pokaždé jiný, asi jak se to hodí a jakou instrukci překladač použije. Myslím že jsem tehdy zápasil s podmínkama a rozdílem mezi & a && a podobně, kdyby to byl pořád ten stejný bit, je to jedno, jestli se dělá logická nebo aritmetická operace, ale právě kvůli tomu to jedno nebylo.

Ono v céčku je false nula a true cokoli jiného, protože takhle to je i ve strojáku. A hojně se toho využívá, zvláště když vymaskováváš bity z nějakých statusů a podobných legrací.
Na druhou stranu překladače už taky dokážou dělat psí kusy s optimalizací, takže pokud si nejsi jist výsledkem, tak to nakonec porovnat s nulou je celkem jistota, že víš, co vyjde a překladač si to stejně upraví po svém, takže to ani nemusí být pomalejší a delší, než kondenzovaný zápis.

A mnohdy je přehlednější mít v ifu jen hodnotu a neporovnávat ji s nulou, false, NIL, NULL, LOW a podobně, jde o zvyk ...

Zpět do poradny Odpovědět na původní otázku Nahoru