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
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

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

Naposledy upravil(a) AB1 dne 19 čer 2015, 09:22, celkem upraveno 4 x.

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

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

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

#18 Příspěvek od Cowley »

AB1: u prvni podminky chybi mensi a je rovno.

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

#19 Příspěvek od AB1 »

Dík za upozornění.
Opraveno.

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

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

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

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

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

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

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

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

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

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

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:

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

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

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

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

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

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

Odpovědět

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