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

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 02:00

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

#1 Příspěvek 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
Naposledy upravil(a) jiri255 dne 20 čer 2015, 21:56, celkem upraveno 2 x.

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#2 Příspěvek 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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#3 Příspěvek 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.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#4 Příspěvek 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).

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#5 Příspěvek 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.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#6 Příspěvek 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

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#7 Příspěvek 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).

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#8 Příspěvek 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:

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#9 Příspěvek 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.

Uživatelský avatar
monterjirka
Příspěvky: 2761
Registrován: 14 čer 2003, 02:00
Bydliště: Blížejov

#10 Příspěvek 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...

Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 02:00

#11 Příspěvek 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:
Naposledy upravil(a) jiri255 dne 18 čer 2015, 22:38, celkem upraveno 1 x.

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#12 Příspěvek 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...
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
jiri255
Příspěvky: 168
Registrován: 18 dub 2013, 02:00

#13 Příspěvek od jiri255 »

a jak by se to řešilo pomocí té tabulky stavů?

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#14 Příspěvek 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
}

Uživatelský avatar
dreamer
Příspěvky: 380
Registrován: 22 říj 2014, 02:00

#15 Příspěvek 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é.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“