Stránka 2 z 2
Napsal: 19 čer 2015, 06:46
od AB1
AB1 chtěl bych se zeptat, jak ten zápis bude přesně fungovat?
Protože zadání není jednoznačné, můžu uvést jenom jednu možnou variantu programu:
Kód: Vybrat vše
unsigned char rele1, rele2, rele3;
//----------------------------------------
if((teplota1 <= 28)
{
rele1 = HIGH;
rele2 = HIGH;
rele3 = HIGH;
}
if((teplota1 > 28) && (teplota1 <= 50))
{
rele1 = LOW;
rele2 = HIGH;
rele3 = HIGH;
}
if((teplota1 > 50) // priorita1
{
rele1 = LOW;
rele2 = LOW;
rele3 = LOW;
goto end;
}
//----------------------------------------
if(teplota2 <= 25)
{
rele1 = HIGH;
rele2 = HIGH;
rele3 = HIGH;
}
else // priorita 2
{ rele2 = LOW;
goto end;
}
//----------------------------------------
if(teplota3 <= 45)
rele2 = HIGH;
else // priorita3
rele2 = LOW;
end:
digitalWrite(1,rele1);
digitalWrite(2,rele2);
digitalWrite(3,rele3);
Napsal: 19 čer 2015, 06:58
od Cowley
rnbw píše:Radsej ako vymyslat nejake priority do programu, by som sa zamyslel nad tym, co vlastne chcem. Nakresli si na papier tie hranicne teploty (na os), medzi ne stav rele a podla toho tie podmienky jednoducho napises.
Souhlasim, taky jsem mu to predtim psal. Sam musi vedet co chce. Arduino mu to samo nevymysli.

Napsal: 19 čer 2015, 07:03
od Cowley
AB1: u prvni podminky chybi mensi a je rovno.
Napsal: 19 čer 2015, 07:14
od AB1
Dík za upozornění.
Opraveno.
Napsal: 19 čer 2015, 09:47
od jiri255
AB1 píše:AB1 chtěl bych se zeptat, jak ten zápis bude přesně fungovat?
Protože zadání není jednoznačné, můžu uvést jenom jednu možnou variantu programu:
Kód: Vybrat vše
unsigned char rele1, rele2, rele3;
//----------------------------------------
if((teplota1 <= 28)
{
rele1 = HIGH;
rele2 = HIGH;
rele3 = HIGH;
}
if((teplota1 > 28) && (teplota1 <= 50))
{
rele1 = LOW;
rele2 = HIGH;
rele3 = HIGH;
}
if((teplota1 > 50) // priorita1
{
rele1 = LOW;
rele2 = LOW;
rele3 = LOW;
goto end;
}
//----------------------------------------
if(teplota2 <= 25)
{
rele1 = HIGH;
rele2 = HIGH;
rele3 = HIGH;
}
else // priorita 2
{ rele2 = LOW;
goto end;
}
//----------------------------------------
if(teplota3 <= 45)
rele2 = HIGH;
else // priorita3
rele2 = LOW;
end:
digitalWrite(1,rele1);
digitalWrite(2,rele2);
digitalWrite(3,rele3);
jen pro upřesnění, abych správně pochopil, jak to přesně bude fungovat.
Program dojde ke smyčce loop (v setup mám nastavena všechna relé, jako vypnutá) a pokud bude teplota1 větší jak 50 skočí to na konec a pojede to odznovu,takže ostatní podmínky to bude přeskakovat.
Pokud bude teplota1 menší jak 50, tak to zároveň vykoná podmínku teplota2 (tu za else) a opět to skočí na konec a pojedou dokola jen ty dvě podmínky.
Teplota3 (za else) bude splněna jen pokud nebudou platit ty dvě předchozí?
to unsigned char rele1, rele2, rele3;
digitalWrite(1,rele1);
digitalWrite(2,rele2);
digitalWrite(3,rele3);
tam mít nemusím ne, když mám stavy relé definované jako HIGH nebo LOW?
Napsal: 19 čer 2015, 10:06
od AB1
Můžeš si to dát do simulátoru a měnit teploty.
Uvidíš jak se to chová.
tam mít nemusím ne, když mám stavy relé definované jako HIGH nebo LOW?
Omyl, rele1,2,3 jsou pomocné proměnné, ty žádné výstupy nenastavují.
Až na konec zapíšeš výstupy podle stavu těchto proměnných.
Napsal: 19 čer 2015, 10:48
od jiri255
aha teď sem si toho všiml, takže když vyhodím rele1, 2 a 3 a nahradím to přímo digitalWrite(1,HIGH); a tak dále, tak by mi to taky mělo šlapat...
Já to odzkouším a dám vědět, jak jsem dopadl

zatím moc díky za pomoc
Napsal: 19 čer 2015, 11:40
od Cowley
jiri255 píše:aha teď sem si toho všiml, takže když vyhodím rele1, 2 a 3 a nahradím to přímo digitalWrite(1,HIGH); a tak dále, tak by mi to taky mělo šlapat...
Já to odzkouším a dám vědět, jak jsem dopadl

zatím moc díky za pomoc
Takhle ne. Do promennych rele1 az rele3 se uklada jejich prubezna hodnota, tzn.bud HIGH nebo LOW a pak se to na KONCI zrealizuje. Na konci proto, ze cestou to projde jeste sitem dalsich mereni a porovnavani a kdyby se hned melo hybat s relatkama, tak by cvakaly.
Promennou si muzes nazvat jakkoliv, treba stavrele1 apod.
Napsal: 19 čer 2015, 14:23
od jiri255
tak to mi nedošlo já myslel, že pokud to v loop projde první podmínku a ta bude platit a za ní to hned skočí na END: ,tak nebude vadit to okamžité nastavení relátek, protože by to s nimi nemělo znovu hýbat... budu to muset odzkoušet, abych viděl jak to pracuje a co se na těch relátkách děje.
Díky za doplňující info
Napsal: 19 čer 2015, 15:53
od ZdenekHQ
jiri255 píše:a jak by se to řešilo pomocí té tabulky stavů?
To je pro mě trošku složitější na vysvětlování, protože nejsem programátor.
Pokud má prioritu teplota1 a 3 stavy, uděláš tabulku se třema sloupcema.
Další podmínky jsou teplota2 a 3, takže bude mít tabulka dva x dva řádky pro dvě mezní teploty2,3 (t.j. jednu mezní pro 2 a jednu mezní pro 3). Pak pro t2<x°C a t3<y°C platí řádek 1 atd.
Každé políčko obsahuje 3bity = 3 stavy výstupů (relátek).
Podle t1 nastavíš sloupec.
Podle t2 x t3 nastavíš řádek.
Až to začneš vyplňovat, tak zjistíš, kde máš prázdná místa nebo kolize.
Pak podle teplot1,2,3 nastavíš "ukazatel" na správné místo v tabulce a přečteš hodnotu.
Hysterezi to neřeší - to vyřešíš porovnáním aktuálního stavu teploty s předchozí hodnotou + vloženou pauzou ve smyčce.
Napsal: 19 čer 2015, 19:34
od jiri255
to nevím jestli bych dal dohromady, asi by to nebylo špatné řešení jen bych musel přijít na to jak to udělat... zkusím se nad tím zamyslet a něco dát dohromady, ale prvně chci otestovat tu variantu s tím END: ta mi přijde hodně zajímavá na můj problém
Napsal: 20 čer 2015, 21:55
od jiri255
otestoval jsem to goto END; a funguje to přímo s digitalWrite(2,LOW nebo HIGH);
a relátka necvakají myslím, že to můj problém vyřešilo, protože si můžu priority u podmínek nastavit přesně, jak potřebuju

Díky moc
Kód: Vybrat vše
if (teplota1 <= 28) {
digitalWrite(1,HIGH);
digitalWrite(2, HIGH);
digitalWrite(3,HIGH);
} else if((teplota1 > 28) && (teplota1 <= 50)){
digitalWrite(1,LOW);
digitalWrite(2, HIGH);
digitalWrite(3,HIGH);
} else if(teplota1 > 50){
digitalWrite(1,LOW);
digitalWrite(2, LOW);
digitalWrite(3,LOW);
goto END;
}
if(teplota2 <= 25) {
digitalWrite(1,HIGH);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
} else if(teplota2 > 25){
digitalWrite(2,LOW);
goto END;
}
if(teplota3 <= 45) {
digitalWrite(2,HIGH);
} else if(teplota3 > 45){
digitalWrite(2,LOW);
goto END;
}
END:
Napsal: 20 čer 2015, 21:59
od Cowley
Relatka necvakaji, protoze to nestihnou. Bude-li ale teplota1 napr. 30st, nastavi se to nejak a dal v programu to teplota 2 30st zmeni.
A tak pujde pozadovana priorita podle teploty1 do kopru.