No, konečně nějakej kód... Jako, nejlepší ověření je zkusit si ten program nahrát do Arduina. Když máš HW, tak to můžeš rovnou odzkoušet. Ale jak to vypadá, tak sis nezkusil program ani přeložit! Tak do psích náušnic, trošku se do toho taky zapoj...
Kde jsou definovaný proměnný "btn1", atd.? Nemá tam spíš být btnPatro, nebo tak něco?
Kód: Vybrat vše
pinMode(btn1,INPUT);
pinMode(btn2,INPUT);
pinMode(btn3,INPUT);
buttonState = digitalRead(btn1);
buttonState2 = digitalRead(btn2);
buttonState3 = digitalRead(btn3);
V Setupu bude lepší, když si
pinMode dáš všechny pod sebe. Program pak bude přehlednější. Takhle nastavuješ výstupy, pak něco mezi tím, pak zas vstupy... Chyba to není, ale je to přehlednější.
Do proměnné
buttonState ukládáš digitální stav vstupu. Je to proměnná jenom true/false. Nemusíš tedy používat typ proměnné
int, ale
bool. Sice to s
int taky funguje, ale je to špatný přístup. Ušetří se tím taky paměť -
bool zabírá polovinu paměti
int.
Pokud použijet bool proměnnou v konstrukci if..., můžeš to napsat takhle:
if(proměnná){. Pokud je proměnná true, tak se automaticky podmínka provede, pokud false, tak se neprovede. Je to takovej čistší způsob. Pokud by si chtěl nahradit
if(proměnná == false){, můžeš to napsat takto:
if(!proměnná){. Vykřičník neguje proměnnou.
LOW == false; HIGH == true. Je to jenom jiné pojmenování. Doporučuji používat true/false.
Co má podle tebe dělat tento řádek?
zobrazuje(cislo(i)); a řádek
show(numbers(i));?
Funkci
zobrazuje a
shownemáš nikde definovanou. Proměnnou
cislo taky ne. Navíc, když to napíšeš takhle, tak proměnná
cislo musí být pole. To mi vůbec nedává smysl...
Ve funkci
nahoru() a
dolu() máš použitou konstrukci
for(int b=0; b<700; b++){. Proměnná
b (případně
a) je v tomto případě deklarovaná jenom uvnitř smyčky. Můžeš tedy pokaždé použít stejný název proměnné. Pokud je smyčka pouze jedna, je taková zvyklost jako název proměnné použít název
i. To sice nemá na funkčnost vliv, ale líp to vypadá
Uvnitř máš čekání pomocí delay 12ms. Pokud spustíš jednu z těchto funkcí, tak program "zamrzne" na 8,4s. Sice to možná přejede mezi patry, ale když máš čidla, tak tohle kurva vůbec nemusíš použít. Stačí hlídat, jestli je výtah v požadovaném patře a pokud ne, tak sepnout motor na jeden směr. Koukni se, co jsem psal předtím. Tam jsou ty podmínky udělaný. Úplně ten cyklus smaž a hlídej to snímačem!
To je co, jsem zahlídl jen tak letmým pohledem... K samotnému programu.
Představ si, že budeš mít výtah s 30, nebo 60 patry. To budeš do nekonečna pro každé patro a každou pozici výtahu definovat část kódu? Celou tvoji logiku programu můžeš nahradit tím, co jsem ti předtím psal. Doporučuju ti se vyvarovat zejména konstrukci
while. Jednat v tomhle případě je zbytečná a to tě tak zacyklí, že pokud nevíš, jak program jede, tak se do toho pěkně zamotáš. Teď není nic, co by nešlo udělat bez IF...
Představ si, že je výtah třeba v 1. patře (podle proměnné, kterou sis definoval hned na začátku programu tam i je). Stiskneš tlačítko pro jízdu do 3. patra. proměnná i (mimochodem zcela nelogicky pojmenovaná) je menší než 3, takže se provede podmínka. Pak se provede podmínka while. Odečte (!) se proměnná i (nyní 0) a výtah jede dolu. Má vůbec kam? Bacha, aby se neproboural do sklepa! Tam jede už zmíněných 8,4s. Pak to na displej vypíše text (toto by šlo vypíchnout do sólo funkce) a vrátí se to zpět na řádek while... Podmínka je stále splněna, protože odečítáš, takže se ti program zacyklí a výtah dojede tak leda do Číny.
Kód: Vybrat vše
if(buttonState3==HIGH){
if(i<3){
while(i<3) {
i--;
dolu();
Serial.print("jsi na");
Serial.print(i);
Serial.println("patro");
//zobrazuje(cislo[i]);
}
}
i=3; //hodnota vytahu 3
//zobrazuje(cislo[i]);
}
Jasný, u jiných tlačítek se to chová trochu jinak, protože podmínky nejsou zcela totožný.Ale to budeš pro každý patro vymejšlet samostatnou konstrukci? vzpomeň si na těch 30 pater... Z tohohle pohledu ANO, program lze tak napsat (po pár úpravách by to i jakštakš fungovalo), ale v žádném případě tohle NENÍ dobrá cesta.
Ještě jednou se koukni na můj předchozí kód. Připoj do Arduina ty 3 snímače pater co jsi zde psal na začátku. Ty budou říkat
ve kterým poschodí se reálně výtah nachází. Pak si pomocí tlačítek do nějaké proměnné nastavíš
do jakého patra chceš jet. A pak jednoduchou podmínkou (viz ten kód) rozhodneš, jestli má jet výtah nahoru, nebo dolu, nebo stát. Nemusíš hlídat žádný počet cyklů, žádný čas. Jednom porovnáváš reálné proměnné. Sám HW výtahu ti řekne, kdy přesně je ve správném patře. Toto lze pak naaplikovat třeba na 100 pater a program se ti zvětší jenom o přiřazení aktuálního patra do proměnné. Logika bude stále na pár řádků.