Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: pá leden 15 2016, 13:01 Předmět: Arduino menu -k čemu flagy a jak zkrátit čekání pro přepnutí
Ahoj,jsem začátečník... mám tu program na menu s LCD , trochu sem ho přibarvil tlačítky a teploměrem.... nechápu : 1, k čemu je tady ten flag t_tlUp (to je flag pro tlačítko nahoru )
tl_up je pak samotné tlačítko-???myslím si dobře že to brání ke startu if hned od začátku co je tlačítko zmáčknuto...
kód:
void changeMenu() {
if (!digitalRead(tlUp)) t_tlUp = 1;
if (!digitalRead(tlDown)) t_tlDown = 1;
if (digitalRead(tlUp) && t_tlUp) {
t_tlUp = 0;
lcd.clear();
menu++;
if (menu > pocetmenumax) menu = 1;
}
if (digitalRead(tlDown) && t_tlDown) {
t_tlDown = 0;
lcd.clear();
menu--;
if (menu < pocetmenumin)menu = 4;
}
}
a další věc za 2,
čekám na zmáčknutí tlačítka pro přepnutí menu ,ale když ho trefím v nésprávný čas ,než se mi zmeří teplota tak se nic neděje....
jednoduše mi přepíná menu zase funkce jiná a tady čekám na dokončení čtení teplota a prodlevu při velké prodlevě to nejde přepnout...nějaký nápad jak to přepnout v průběhu čtení teploty.kdykoliv?
kód:
void loop() {
changeMenu();
dispMenu();
}
//fce meni menu,flagy asi brani o5tovnemu spustenivcyklu
void changeMenu() {
if (!digitalRead(tlUp)) t_tlUp = 1;
if (!digitalRead(tlDown)) t_tlDown = 1;
if (digitalRead(tlUp) && t_tlUp) {
t_tlUp = 0;
lcd.clear();
menu++;
if (menu > pocetmenumax) menu = 1;
}
if (digitalRead(tlDown) && t_tlDown) {
t_tlDown = 0;
lcd.clear();
menu--;
if (menu < pocetmenumin)menu = 4;
}
}
//tady probiha prepinani
void dispMenu() {
switch (menu) {
case 1:
menu1();
break;
case 2:
menu2();
break;
case 3:
menu3();
break;
case 4:
menu4();
break;
}
Založen: Jun 30, 2005 Příspěvky: 1576 Bydliště: Pardubický kraj
Zaslal: pá leden 15 2016, 17:17 Předmět:
1) Hodnota menu se mění jen při náběžné hraně, pokud by se měnila při jedné úrovní, tak by se menu při držení tlačítka měnilo rychlostí odpovídající rychlosti volání changeMenu().
2) Tady jsou vpodstatě tři možnosti, buď zrychlit měření, tak aby reakční doba byla v pořádku, nebo použít odložené zpracování, nebo multitasking (nějaký rtos) což je v tomto případě zbytečně složité.
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: pá leden 15 2016, 17:38 Předmět:
Díky Zmije.
1,Myslel jsem ,že je to k tomuhle aby se to nevykonávalo dokola.
2,proboha říkám sem začátečník jak se dělají ty dvě poslední možnosti nevím,
ale měření sem zpomalil kvůli LCD ,nešlo to ani číst ,jak to bylo rychlé.
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: so leden 16 2016, 9:03 Předmět:
Z vámi uvedeného odkazu nechápu to použití millis.
Podle mě se vždy spustí první if .
kód:
void loop(){
aktualniMillis = millis(); //podivam se na hodinky
if(led_svetlo){ //potrebuju LED zhasnout nebo rosvitit?
if(aktualniMillis - predchoziMillis > 500) { //pokud zhasnout ubehlu uz 500ms od posledni akce?
predchoziMillis = aktualniMillis; //v tento cas jsem provedl posledni akci
led_svetlo=LOW; //zhasni led
}
}else if(aktualniMillis - predchoziMillis > 1000) { //pokud zhasnout ubehlu uz 1000ms od posledni akce?
predchoziMillis = aktualniMillis; //v tento cas jsem provedl posledni akci
led_svetlo=HIGH; //rozsvit led
}
digitalWrite(led, led_svetlo); //aktualizace stavu LED
if (Serial.available()) {
int inByte = Serial.read();
Serial.write(inByte);
}
}
začne to - (aktualniMillis - predchoziMillis) = 501 pak predchoziMillis = 501
pak třeba - ( 1002 - 501)=501 pak predchoziMillis 1002
pak -(1503 - 1002) = 501 zase první if ......predchoziMillis =1503
---vždy bude asi splněna první podmínka if
Nechápu kdy by mělo dojít k else if...vždy se spustí první if-což určuje pdomínka v závorce,nebo se pletu?
Koukas spatne.
Else if se vztahuje k prvni podmince (svetlo jiz sviti), pokud ta nebude splnena, provede se podminka za else if.
Pokud bude splnena, udela se vnorena podminka IF pokud bude svetlo svitit dele jak 500.
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: so leden 16 2016, 10:49 Předmět:
Chápu ,že else if se provede když není splněna podmínka if a je splněna podmínka else if ,ale proměná poslednimillis bude třeba v jednom za splnění if cyklu rovna 501 v prvním případě ,pak časovač millis doteče na 1002 a máme tady proměnou poslednimillis která se rovná aktuální millis tzn. že v cyklu kdy bude millis časovač na 1002 je podmínka prvního if splněna tj větší než 500,např 1002 -501 je 501 a zase mi nabíhá první if tohle nemohu z tohohle pohledu pochopit musím se přece dívat na hodnotu poslednimillis do které se mi ukládá aktuální millis.
ještě jednou
1 cyklus
poslednimillis 0
aktuální millis 501
---tzn. if je větší než 500
X cyklus
poslednimillis 501
aktualnimillis 1002
1002-501 je 500-první if zase ukládám hodnotu posledni millis na 1002.
z cyklus
poslednimillis 1002
aktualnimillis 1503
1503-1002 je 501 zase jede první if
....atd.prosím o vyluštění záhady vždy to nejdřív dojde k hodnotě větší než 500 a ne hodnotě větší než 1000 protože ukládám do globální proměnné poslední hodnotu času.
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: so leden 16 2016, 11:19 Předmět:
Tak přátelé myslim že sem sem dal špatný kus písma ,Zapoměl jsem na první if které konrtoluje zhasnutí světla v IDE jsem dal autoformat a bylo to jasné .
celé to je takle.
kód:
unsigned long aktualniMillis; //aktualni cas
unsigned long predchoziMillis; //cas poseldni akce
boolean led_svetlo; // promenna pro stav LED
int led = 13; //port pro LED
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
aktualniMillis = millis(); //podivam se na hodinky
if (led_svetlo) { //potrebuju LED zhasnout nebo rosvitit?
if (aktualniMillis - predchoziMillis > 500) { //pokud zhasnout ubehlu uz 500ms od posledni akce?
predchoziMillis = aktualniMillis; //v tento cas jsem provedl posledni akci
led_svetlo = LOW; //zhasni led
}
} else if (aktualniMillis - predchoziMillis > 1000) { //pokud zhasnout ubehlu uz 1000ms od posledni akce?
predchoziMillis = aktualniMillis; //v tento cas jsem provedl posledni akci
led_svetlo = HIGH; //rozsvit led
}
digitalWrite(led, led_svetlo); //aktualizace stavu LED
}
Nezkopíroval jsem tady If led světlo které je jinak uzavřené k tomu patří ten else if a né k if co je nad else if. Tady to slouží jako taková výhybka pomocí světlo svítí a nebo ne....
Naposledy upravil saitt dne so leden 16 2016, 11:20, celkově upraveno 1 krát.
void loop(){
aktualniMillis = millis(); //nakopiruju aktualni cas
if(led_svetlo){ //dotaz: sviti svetlo?
// ted se bude delat to, pokud sviti a budeme se prubezne ptat...
if(aktualniMillis - predchoziMillis > 500) { //dotaz: sviti jiz dele jak 500 od posledniho nakopirovani?
predchoziMillis = aktualniMillis; //pokud ANO: nastav si cas posledni zmeny
led_svetlo=LOW; //zhasni led
}
}else if(aktualniMillis - predchoziMillis > 1000) { //a pokud nesviti svetlo a od posledni akce Ubehlo vice jak 1000
predchoziMillis = aktualniMillis; //pokud ANO: nastav si cas posledni zmeny
led_svetlo=HIGH; //rozsvit led
}
digitalWrite(led, led_svetlo); //aktualizace stavu LED
if (Serial.available()) {
int inByte = Serial.read();
Serial.write(inByte);
}
}
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: so leden 16 2016, 11:22 Předmět:
Tohle je rozhodující if (led_svetlo) ,přehlédl jsem to.... omlouvám se
pro vysvětlení uvažoval jsem jenom
kód:
if (aktualniMillis - predchoziMillis > 500) { //pokud zhasnout ubehlu uz 500ms od posledni akce?
predchoziMillis = aktualniMillis; //v tento cas jsem provedl posledni akci
led_svetlo = LOW; //zhasni led
}
else if (aktualniMillis - predchoziMillis > 1000) { //pokud zhasnout ubehlu uz 1000ms od posledni akce?
predchoziMillis = aktualniMillis; //v tento cas jsem provedl posledni akci
led_svetlo = HIGH; //rozsvit led
}
Tohle je rozhodující if (led_svetlo) ,přehlédl jsem to.... omlouvám se
Spis pocty, umisteni a vyznam zavorek, ktere ukazuji co k cemu patri... a pred else if jsou 2.
A i v prvnim prispevku jsou a byly dve, zadne kopirovani na to nemelo vliv...
Uz v 9:25 jsem na to upozornoval...
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: so leden 16 2016, 13:35 Předmět:
Tak už jsem něco zkoušel...problém je ,že v menu 3 pokud odkomentuju lcd.clear() tak mi displey začne blikat chtěl bych dosáhnout vymazání LCD pokud by se tam objevila např hodnota 100 stupnu a pak třeba 99 zustalo by tam 990 stupňů což je trošku hodně...
}
}
//zde je problem
else if (aktualnicas- cas > 500 ) {
cas =aktualnicas;
//lcd.setCursor(14, 1);
// lcd.print("t");
//delay(1000);
//lcd.clear();
merim=HIGH;
}
Mozna nerozumim presne problemu, ale co ti brani prepisovat pred vlastnim zobrazenim jen danou pozici na displeji treba tremi mezerami, ktere zajisti odmazani nepotrebnych drive zobrazenych znaku a nepouzivat cely Clear.
A aby to nepoblikavalo, tak sledovat zmeny v dane promenne a zobrazit danou hodnotu jen jednou (nebo alespon jen jednou za cas) a ne vzdy kdyz jde program ve smycce "okolo".
Založen: Nov 11, 2015 Příspěvky: 107 Bydliště: Ostrava
Zaslal: so leden 16 2016, 15:45 Předmět:
Tohle by přece mělo jednou za čas zobrazovat hodnotu teploty jednou za čas ... používal jsem předtím výpis hodnoty a delay a vymazat LCD a celé od začátku...
Takle se to zobrazuje celkem dobře ale lcd.clear nelze použít v různých variantách ....takže by to mělo třeba zobrazit 100 stupnu a výmaz ,nová hodnata 99 stupnu a výmaz.
Takže se to bude muset řešit asi přes ty prázdný místa,každopádně Díky za rady ani sem nedoufal,že se tady najde někdo přes Arduino.
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2Další
Strana 1 z 2
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.