Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Arduino - více podmínek = VYŘEŠENO
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: čt červen 18 2015, 20:13    Předmět: Arduino - více podmínek = VYŘEŠENO Citovat

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:

          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 jiri255 dne so červen 20 2015, 20:56, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: čt červen 18 2015, 20:34    Předmět: Citovat

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[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Cowley



Založen: Feb 04, 2005
Příspěvky: 3304

PříspěvekZaslal: čt červen 18 2015, 20:37    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3304

PříspěvekZaslal: čt červen 18 2015, 20:44    Předmět: Citovat

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).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3330

PříspěvekZaslal: čt červen 18 2015, 20:49    Předmět: Citovat

Podmínky mají prioritu danou pořadím, poslední má největší, protože přepisuje výsledky těch předchozích.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3304

PříspěvekZaslal: čt červen 18 2015, 20:53    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3304

PříspěvekZaslal: čt červen 18 2015, 20:55    Předmět: Citovat

lesana87 napsal(a):
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).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
AB1



Založen: Nov 23, 2009
Příspěvky: 312

PříspěvekZaslal: čt červen 18 2015, 21:08    Předmět: Citovat

Podmínky můžeš uspořádat podle priority takto:
kód:
   if(podminka_nejvyssi_priority)
   {
      kód;
      goto end;
   }

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

   if(podminka_nejnizsi_priority)
   {
      kód;
   }

end:
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rnbw



Založen: Mar 21, 2006
Příspěvky: 34007
Bydliště: Bratislava

PříspěvekZaslal: čt červen 18 2015, 21:16    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
monterjirka



Založen: Jun 14, 2003
Příspěvky: 2794
Bydliště: Blížejov

PříspěvekZaslal: čt červen 18 2015, 21:33    Předmět: Citovat

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...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: čt červen 18 2015, 21:35    Předmět: Citovat

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:

          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 jiri255 dne čt červen 18 2015, 21:38, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
ZdenekHQ
Administrátor


Založen: Jul 21, 2006
Příspěvky: 25741
Bydliště: skoro Brno

PříspěvekZaslal: čt červen 18 2015, 21:36    Předmět: Citovat

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[?
]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: čt červen 18 2015, 21:48    Předmět: Citovat

a jak by se to řešilo pomocí té tabulky stavů?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: čt červen 18 2015, 22:13    Předmět: Citovat

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:

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
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
dreamer



Založen: Oct 22, 2014
Příspěvky: 384

PříspěvekZaslal: pá červen 19 2015, 5:30    Předmět: Citovat

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é.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

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.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.21 sekund