Stránka 1 z 2

Arduino - více podmínek = VYŘEŠENO

Napsal: 18 čer 2015, 21:13
od jiri255
Zdravím,
chtěl bych někoho požádat o kontrolu podmínek níže, protože si nejsem úplně jistý jestli, tak jak jsem to napsal to bude fungovat správně?

Jde mi o to, že mám tři teplotní čidla pojmenovaná jako teplota1, teplota2 a teplota 3 a ty mají ovládat 3 relé rele1(1), rele2(2) a rele3(3).

Podmínky jsou:
pokud teplota1 je menší jak 28, tak jsou všechna relé vypnuta tedy HIGH,
když je teplota mezi 28 až 50, tak rele1 běží (LOW) a rele2, rele3 neběží (HIGH) a pokud je teplota nad 50, tak běží všechna relé (LOW) což funguje perfektně.
Dál bych k tomu, ale potřeboval přidat podmínku, že pokud teplota2 je menší jak 25, tak neběží žádné relé a pokud je větší, jak 25 tak rele2 běží (LOW).
U třetí podmínky bych potřeboval, že pokud je teplota3 menší, jak 45 tak rele2 běží (LOW) a pokud je teplota3 větší, jak 45 rele2 neběží(HIGH).
Důležité je, aby prioritu měla ta první podmínka = teplota1 hlavně to, že když je teplota1 nad 50 běží všechna relé.
Nebudou se ty podmínky mezi sebou hádat a lze případně nějak podmínkám nastavit prioritu?

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);                 
          }
         
          if(teplota2 < 25) {       
          digitalWrite(1,HIGH);
          digitalWrite(2,HIGH);
          digitalWrite(3,HIGH);
          } else if(teplota2 > 25){
          digitalWrite(2,LOW);
          }
                   
          if(teplota3 < 45) {       
          digitalWrite(2,HIGH); 
          } else if(teplota3 > 45){
          digitalWrite(2,LOW);         
          }

Předem děkuji za případné rady a kontrolu

Napsal: 18 čer 2015, 21:34
od ZdenekHQ
Máš tam i teplota4, za else se už (navíc špatně) negovaná podmínka nedává a hádat se to může.

Napsal: 18 čer 2015, 21:37
od Cowley
Kouknu na to, ale v prvni rade nedavej zadna rele na vystup 1. Beha tam RS232.

A je tam i teplota8

U 25 a 45 st nemas mensi a rovno.

Napsal: 18 čer 2015, 21:44
od Cowley
Napis si ty hranicni podminky teplot a za to dej co se ma dit a vykasli se na ELSE.
Podminku a prioritu podle teploty1 nastavis prave tak, ze budes v radku IF podminovat (teplota1...)&&(teplota2).

Napsal: 18 čer 2015, 21:49
od lesana87
Podmínky mají prioritu danou pořadím, poslední má největší, protože přepisuje výsledky těch předchozích.

Napsal: 18 čer 2015, 21:53
od Cowley
Nebo si proritu zadej jako dalsi promennou.
Pokud bude teplota1 jakou ji potrebujes bude priorita=1 (jako ze je aktivni).
V dalsich IF podminkach das dotaz na teplotu napr. (teplota2...)&&(priorita==1) a pokud to bude platit, stane se co potrebujes

Napsal: 18 čer 2015, 21:55
od Cowley
lesana87 píše:Podmínky mají prioritu danou pořadím, poslední má největší, protože přepisuje výsledky těch předchozích.

To je sice pravda,ale pokud bude mezitim hned ovladat relatka,budou mu "drncet" (kdyz to stihnou).

Napsal: 18 čer 2015, 22:08
od AB1
Podmínky můžeš uspořádat podle priority takto:

Kód: Vybrat vše

   if(podminka_nejvyssi_priority)
   {
      kód;
      goto end;
   }

   if(podminka_nizsi_priority)
   {
      kód;
      goto end;
   }

   if(podminka_nejnizsi_priority)
   {
      kód;
   }

end:

Napsal: 18 čer 2015, 22:16
od rnbw
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.

Napsal: 18 čer 2015, 22:33
od monterjirka
Asi jsem příliš konzervativní, ale já si rád "základní myšlenku" namaluji jako vývojový diagram, nedržím se přesně toho, co jsme se kdysi učili ve škole, ale mám některé "svoje představy a zvyky".
Ale když se někdy k něčemu musím vrátit, podle takového "obrázku" a přiměřeně komentovaného programu se dá něco upravit, zodpovědně změnit...

Napsal: 18 čer 2015, 22:35
od jiri255
v tom kódu jsem se dvakrát uklep opraveno... AB1 chtěl bych se zeptat, jak ten zápis bude přesně fungovat?
Když to udělám nějak takto bude vždy přednostní teplota1 a vše ostatní se vykoná, jen když nebude platit teplota1 nebude to pak fungovat, tak že bude pořád aktivní jen teplota1 a ty ostatní to nebude brát v úvahu, protože vždycky bude minimálně jedna část s podmínky teplota1 platit?

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: 18 čer 2015, 22:36
od ZdenekHQ
Mám dojem, že v těch podmínkách v zadání jsou "díry", kde není přesně definovaný výsledek.

Dá se to řešit i tabulkou stavů, logikou and/or atd., ale on si to každej programátor stejně napíše po svým...

Napsal: 18 čer 2015, 22:48
od jiri255
a jak by se to řešilo pomocí té tabulky stavů?

Napsal: 18 čer 2015, 23:13
od frpr666
Pan Cowley má pravdu. Hrozí drnčení relátek.
Já bych doporučil jeden if rozdělit na dva menší, plus pomocná proměnná.
Potom budeš mít jistotu, že např. v jedné otočce cyklu loop() budeš nastavovat výstupy jen jednou.

Kód: Vybrat vše

uint8_t stav;

// "if" první, nahazování pomocné proměnné stav
stav=0;
if (teplota1<PRESET1)
{
  stav=1;
}
if (teplota2<PRESET2)
{
  stav=2;
}
if (teplota3<PRESET3)
{
  stav=3;
}

// "if" druhý, nahazování výstupů
if (stav==1)
{
  // zapis do vystupu 1
}
else if (stav==2)
{
  // zapis do vystupu 2
}
else if (stav==3)
{
  // zapis do vystupu 3
}
else
{
  // zapis do vystupu 4
}

Napsal: 19 čer 2015, 06:30
od dreamer
A co histereze? Pokud ti bude teplota oscilovat třeba kolem těch 28 stupňů, budou relátka cvakat stejně. Já bych pro relátka zavedl pomocnou proměnnou typu boolean, nastavoval ji postupně dle podmínek a první podmínka bude mít automaticky nejnižší prioritu, poslední nejvyšší. Teprve v závěru smyčky nastavit dle stavu proměnné výstup. A samozřejmě nebrat konkrétní teplotu jako hraniční ale nastavovat třeba:
If (teplota1 < 27) rele1=0
If (teplota1 > 28 ) rele1=1

A ve smyčce setup nastavit nějaké počáteční stavy relé.