podmínky

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: podmínky

Příspěvek od gilhad » 11 črc 2019, 03:11

Myslím, že není důvod, proč bys to tam mít nemohl (pokud nemáš někde chybu v syntaxi)

Ale myslím, že ta druha část asi nebude dělat to, co jsi chtěl -
pokud není digitalRead(d_studna), tak se celý další if i else přeskočí
pokud je (a nemění se zběsile), tak

Kód: Vybrat vše

if((cerpadlo_studna1 || !digitalRead(h_studna)) && digitalRead(d_studna))
dělá to samé, co

Kód: Vybrat vše

if(cerpadlo_studna1 || !digitalRead(h_studna))
a pokud je

Kód: Vybrat vše

cerpadlo_studna1 == true
, tak to vždy půjde tou první větví, kde se nastaví

Kód: Vybrat vše

cerpadlo_studna1 = true
a nikdy tou druhou, kde se nastaví na false.

Číli pokud ho nenastavuješ ještě někde jinde, tak jakmile se jednou nastaví na true, tak na něm už navždy zůstane.


Že v loop máš víc bloků za sebou a v každém víc do sebe vnořených ifů a třeba zase několi za sebou je naprosto normální věc ( Koukni třeba na
http://micro-corner.gilhad.cz/blog/Adru ... ouse2.html a přiložený kód
http://micro-corner.gilhad.cz/listings/ ... 2.ino.html
)

Jediné, co my mohlo dělat problémy je ta funkce blikej(), kdyby blokovala (a blikala dlouho), tak že se studna ošetří teprve až když se dobliká.

Osobně bych to spíš udělal přez nějako stavovou proměnnou (bool nebo tak), nějak takto:

Kód: Vybrat vše

....
bool blikani;
unsigned long currentMillis, lastMillis;
....
void loop() {
.....

if ( "hladiny cerpadla" ) {
   if ( "rele cerpadla" ) {
      cerpadlo_dest1 = true;
      digitalWrite(cerpadlo_dest, LOW);
      blikani = true;
   } else {  
     cerpadlo_dest1 = false;
     digitalWrite(cerpadlo_dest, HIGH);
     blikani = false;
  };
};


if (blikani) {  // blikame
   currentMillis=millis();
   
   if ((currentMillis - lastMillis) >= blikaniDelay){ // cas zmenit stav ledky
        digitalWrite(LEDblikani, ! digitalRead(LEDblikani));
        lastMillis = currentMillis;
   };
} else { // neblikame
   digitalWrite(LEDblikani,LOW);  // neblikame, ledka nesviti
};
     
   ....
   

paclikc
Příspěvky: 9
Registrován: 14 dub 2019, 12:35
Reputation: 0

Re: podmínky

Příspěvek od paclikc » 14 črc 2019, 16:59

Ahoj Díky za rozsáhlou odpověd.

jen pro pochopení :

pokud :

Kód: Vybrat vše

 void loop(){
  if (digitalRead(s_dest_cerpadlo) && digitalRead(max_akumulace)) { // přečte minimální hladinu v jimce a maximalní hladinu v akumulaci
    if((cerpadlo_studna1 || !digitalRead(h_dest_cerpadlo)) && !digitalRead(d_dest_cerpadlo)){ //samodržné relé spinájící cerpadlo v jímce
  cerpadlo_dest1 = true;
  digitalWrite(cerpadlo_dest, LOW);
}
    else{
  cerpadlo_dest1 = false;
  digitalWrite(cerpadlo_dest, HIGH);
    }
  }
se splní tato podmínka

Kód: Vybrat vše

if((cerpadlo_studna1 || !digitalRead(h_dest_cerpadlo)) && !digitalRead(d_dest_cerpadlo)){
Do promenné boolean cerpadlo_dest1 se zapíše true

a pokud se nesplní tedy else
zapíše se do promenne boolean cerpadlo_dest1 false

je to tak? nebo tam mám špatně = a == :?: :roll:

Já potřebuju její poslední stav pro "samodržné relé"

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: podmínky

Příspěvek od gilhad » 14 črc 2019, 19:15

ano, je to tak, = je přiřazení hodnoty do proměnně, == je porovnání hodnot.
přičemž se ta podmínka (a tedy následné přiřazení) provádí pouze pokud platí ta vnější podmínka (digitalRead(s_dest_cerpadlo) && digitalRead(max_akumulace)), jinak se neděje nic.

Takže by bylo hezčí a čitelnější to mít správně odsazené:

Kód: Vybrat vše

 
void loop(){
  if (digitalRead(s_dest_cerpadlo) && digitalRead(max_akumulace)) { // přečte minimální hladinu v jimce a maximalní hladinu v akumulaci
       if ((cerpadlo_studna1 || !digitalRead(h_dest_cerpadlo)) && !digitalRead(d_dest_cerpadlo)){ //samodržné relé spinájící cerpadlo v jímce
            cerpadlo_dest1 = true;
            digitalWrite(cerpadlo_dest, LOW);
       } else {
            cerpadlo_dest1 = false;
            digitalWrite(cerpadlo_dest, HIGH);
       }
  }

paclikc
Příspěvky: 9
Registrován: 14 dub 2019, 12:35
Reputation: 0

Re: podmínky

Příspěvek od paclikc » 14 črc 2019, 19:58

A mě to nechce fungovat :? Jednou to proběhne tak jak potřebuju a pak už se to nevypne :( Mám trochu obavu jestli jsem se nezamotala v "!" Dá se negace vstupu nějak zapsat hned v setupu? Aby celý program pracoval s obrácenou hodnotou ?

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: podmínky

Příspěvek od gilhad » 14 črc 2019, 23:18

Neda se to zapsat v setupu.

Muzes to zapojit jinak (pokud jde o spínače tak místo INPUT_PULLUP a spínač proti zemi dát jen INPUT, spínač proti plusu a pulldown udělat odporem od pinu k zemi - nějakých 1-10 kOhm plně vyhoví) - pak ti stisknutí udělá HIGH a puštění LOW.

nebo to můžeš obalit funkcí, která prostě vrátí správný logický stav

Kód: Vybrat vše

// tady budou ty proměnné jako int d_dest_cerpadlo = 23;
bool cerpadlo_dole() {  // nebo co znamená ten prefix d_ 
   return ! digitalRead(d_dest_cerpadlo) ; // když je na pinu LOW, tak je to pravda, když HIGH, tak to pravda není
   }
bool cerpadlo_nahore() {
   return ! digitalRead(h_dest_cerpadlo) ; // když je na pinu LOW, tak je to pravda, když HIGH, tak to pravda není
   }
// tady bude setup() a začátek loop()


// if((cerpadlo_studna1 || !digitalRead(h_dest_cerpadlo)) && !digitalRead(d_dest_cerpadlo)){ 
// radeji takto:
   if ((cerpadlo_studna1 || cerpadlo_nahore()) && cerpadlo_dole()) {


// a tak dál až do konce
a máš to všechno v takové logice, která ti sedí - něco znegované, případně něco neznegované, ale název funkce si volíš podle potřeby, aby se s tím hezky pracovalo

paclikc
Příspěvky: 9
Registrován: 14 dub 2019, 12:35
Reputation: 0

Re: podmínky

Příspěvek od paclikc » 15 črc 2019, 22:33

Ahoj
Dnes jsem si na to konečně sedl a už vše funguje tak jak sem chtěl díky moc za rady. Dokonce jsem si chvilku připadal že opravdu "programuju" :D :D ;) díky. (nejsem si jistý v "odsazovaní tak jak to ma být"

Kód: Vybrat vše

/*jedná se systém závlahy kde je jedna centrální jímka do které přečerpávají čerpadla z drenáže domu a z části okapů tedy 2x čerpadlo které plní jímku a jedno čerpadlo které pouští
 * vodu do závlahy, v drenážní jímce jsou 2x plovák ; v "okapch" jsou 3 plováky a v centrální jímce jsou 4ks plováků které určují spínání jednotlivých čerpadel.
 * index  s,d,h,max určují umístění plováků s= spodní d=dolní h=horní max=plná nádrž.
 */int s_okapy = 26;   //horní poloha 1
int d_okapy = 27;   //0
int h_okapy = 28;   //0
int s_jimka = 22;   //1
int d_jimka = 23;   //1
int h_jimka = 24;   //0
int max_jimka = 25; //0
int d_drenaz = 29;  //1
int h_drenaz = 30;  //0
int cerpadlo_jimka = 50;
int cerpadlo_okapy = 53;
int cerpadlo_drenaz = 52;
bool cerpadlo_okapy1;
bool cerpadlo_drenaz1;
int led1 = 9;
int led2 = 10;
int led3 = 11;
int led4 = 12;


void setup(){ 
  pinMode(s_okapy, INPUT_PULLUP);//nastaví s_dest_cerpadlo jako vstup
  pinMode(d_okapy, INPUT_PULLUP);
  pinMode(h_okapy, INPUT_PULLUP);
  pinMode(s_jimka, INPUT_PULLUP);
  pinMode(d_jimka, INPUT_PULLUP);
  pinMode(h_jimka, INPUT_PULLUP);
  pinMode(max_jimka, INPUT_PULLUP);
  pinMode(d_drenaz, INPUT_PULLUP);
  pinMode(h_drenaz, INPUT_PULLUP);
  pinMode(cerpadlo_jimka, LOW);  //pin 50 čerpadlo v jímce 
  pinMode(cerpadlo_okapy, OUTPUT); //pin 53
  pinMode(cerpadlo_drenaz, OUTPUT); //pin 52
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  
//  Serial.begin(9600);

}


void loop(){
  if (digitalRead(s_okapy) && digitalRead(max_jimka)) { // přečte minimální hladinu v okapy a maximalní hladinu v jímce pokud není plná jímka a není min hladina podmínka splněna
        if((cerpadlo_okapy1 || !digitalRead(h_okapy)) && !digitalRead(d_okapy)){ //samodržné relé spinájící cerpadlo v jímce
          cerpadlo_okapy1 = true;//zapíše aktualní hodnotu do samodržného relé
          digitalWrite(cerpadlo_okapy, LOW);
            digitalWrite(led1, HIGH);
              digitalWrite(led2, LOW);
        } else{
          cerpadlo_okapy1 = false;
          digitalWrite(cerpadlo_okapy, HIGH);

        }
  }

    else{
  cerpadlo_okapy1 = false;
  digitalWrite(cerpadlo_okapy, HIGH);
              digitalWrite(led1, LOW);
              digitalWrite(led2, HIGH);
   }

                                  if((cerpadlo_drenaz1 || !digitalRead(h_drenaz)) && digitalRead(d_drenaz)){ //samodržné relé spinájící cerpadlo v drenáži
                                    cerpadlo_drenaz1 = true; //zapíše aktualní hodnotu do samodržného relé
                                    digitalWrite(cerpadlo_drenaz, LOW);
                                      digitalWrite(led3, HIGH);
                                         digitalWrite(led4, LOW);
                                } else{
                                    cerpadlo_drenaz1 = false;
                                    digitalWrite(cerpadlo_drenaz, HIGH);
                                      digitalWrite(led3, LOW);
                                        digitalWrite(led4, HIGH);
                                }

                        
                         


  //Serial.println(cerpadlo_drenaz1);


  
  delay(500); 
}

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: podmínky

Příspěvek od gilhad » 16 črc 2019, 12:28

"odsazovani, jak to ma byt" je pro ctenare, aby to dobre vypadalo a davalo smysl na prvni pohled, bez pocitani zavorek. Kompilatoru je to jedno.
Stylu je vic, ale v podstate jde o to, ze mas vetsi celky a v nich mensi celky a ty mensi celky by mely byt vic odsazene, aby na prvni pohled bylo zrejme, co je uvnitr ceho a na jake je to urovni.

Takze treba vsechny samostatne funkce by mely zacinat na zacatku radku. Vsechno v te funkci by melo byt odsazene.
Vsechny prikazy v ifu by mely byt vic odsazene, nez ten if (a pokud ma else, tak else samotne by melo byt odsazene stejne jako priskusny if a prikazy v nem by mely byt odsazene vic, nez to else a stejne jako obdobne prikazy u ifu.)
kdyz je v ifu dalsi if, tak ten if by mel byt odsazenuy stejne jako prikazy okolo, ale prikazy v nem by zase mely byt o kousek dal (a zase vsechny stejne)

Takze nejak takhle (vsimej si odsazeni a ze je krasne videt, co je casti ceho)

Kód: Vybrat vše

void setup() {
  a=1;
  b=2;
}

void loop() {
  a=2;
  b=3;
  if (c == 4) {
      d=5;
      e=6;
      if (f==7) {
          g=8;
          h=9;
      } else { // od if (f==7)
          i=10;
          j=11;
      };  // konec if(f==7)
      k=12;
      l=13;
  } else { // od if (c==4)
      m=14;
      n=15;
  }; // konec if (c==4)
  o=16;
  p=17;
} // konec od loop()


Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů