Problem z funkcją warunkową (IF... ELSE)

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
walgrad
Młodszy majsterkowicz
Posty: 1
Rejestracja: 22 lis 2014, 23:34

Problem z funkcją warunkową (IF... ELSE)

Post autor: walgrad » 23 lis 2014, 00:04

Witam Serdecznie
Na samym początku zaznaczam że dopiero zaczynam swoja przygodę z Arduino (Leonardo) i do tej pory nie miałem styczności z programowaniem C czy też innym językiem.

Wykonuje prozaiczny programik który będzie załączać urządzenia zależnie od stanu wejść :

int euroster = A2;
int bojler = A3;
int insbud = A4;
int termik = A5;
int pomp_boj = 1;
int pomp_grzej = 2;
int pomp_podl = 3;
int pomp_bufor = 4;
int pomp_cyrk = 5;
int zaw_grzej = 6;
int elekzaw_A = 7;
int elekzaw_B = 8;
int a;
int b;
int c;
int d;
int g;


 
void setup() {
  //ustawienia dla wejsc
  pinMode(euroster, INPUT); //pracuje jako wejscie
  digitalWrite(euroster, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
  pinMode(bojler, INPUT); //pracuje jako wejscie
  digitalWrite(bojler, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
  pinMode(insbud, INPUT); //pracuje jako wejscie
  digitalWrite(insbud, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
  pinMode(termik, INPUT); //pracuje jako wejscie
  digitalWrite(termik, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
 
  //pin zapalajacy diode musi pracowac jako wyjscie
  pinMode(pomp_boj, OUTPUT);
  pinMode(pomp_grzej, OUTPUT);
  pinMode(pomp_podl, OUTPUT);
  pinMode(pomp_bufor, OUTPUT);
  pinMode(pomp_cyrk, OUTPUT);
  pinMode(zaw_grzej, OUTPUT);
  pinMode(elekzaw_A, OUTPUT);
  pinMode(elekzaw_B, OUTPUT);
  
}
 
void loop() {



  int przycisk1 = digitalRead(termik); //odczytujemy stan przycisku
  if(przycisk1 == HIGH) { //jesli przycisk nie jest wcisniety
    digitalWrite(elekzaw_A, HIGH); //dioda ma byc swiecic
    digitalWrite(elekzaw_B, LOW); //dioda ma byc swiecic
    digitalWrite(pomp_cyrk, HIGH); //dioda ma byc swiecic
    digitalWrite(pomp_bufor, HIGH); //dioda ma byc swiecic
    d=1;
  }
  else //w przeciwnym wypadku
  {
    digitalWrite(elekzaw_A, LOW); //dioda ma sie zgaszona
    digitalWrite(elekzaw_B, HIGH); //dioda ma sie zgaszona
    digitalWrite(pomp_cyrk, LOW); //dioda ma sie zgaszona
    digitalWrite(pomp_bufor, LOW); //dioda ma sie zgaszona
    d=0;
   }
   
   
   
   
  int przycisk2 = digitalRead(bojler); //odczytujemy stan przycisku
  if(przycisk2 == HIGH) { //jesli przycisk nie jest wcisniety
    digitalWrite(pomp_boj, HIGH); //dioda ma byc swiecic
  }
  else //w przeciwnym wypadku
  {
    digitalWrite(pomp_boj, LOW); //dioda ma sie zgaszona
  }
  
  

  
   
    int przycisk3 = digitalRead(euroster); //odczytujemy stan przycisku
  if(przycisk3 == HIGH) { //jesli przycisk nie jest wcisniety
    
    digitalWrite(zaw_grzej, HIGH); //dioda ma byc swiecic
   b=1;
   
    }
  else //w przeciwnym wypadku
  {
    digitalWrite(zaw_grzej, LOW); //dioda ma sie zgaszona
  b=0;
  
    }
  
  
    
      int przycisk4 = digitalRead(insbud); //odczytujemy stan przycisku
  if(przycisk4 == HIGH) { //jesli przycisk nie jest wcisniety
    
   
   a=1;
   
    }
  else //w przeciwnym wypadku
  {

  a=0;
  
    }

  
  
c=a+b;
g=c+d;

  
   if(c>1) { //jesli przycisk nie jest wcisniety
    digitalWrite(pomp_grzej, HIGH); //dioda ma byc swiecic
    }  
  else //w przeciwnym wypadku
  {
    digitalWrite(pomp_grzej, LOW); //dioda ma sie zgaszona
  }

 

if(g>1) { //jesli przycisk nie jest wcisniety
    digitalWrite(pomp_podl, HIGH); //dioda ma byc swiecic
    }  
  else //w przeciwnym wypadku
  {
    digitalWrite(pomp_podl, LOW); //dioda ma sie zgaszona
  }
  
  
  
}
Problem jest z ostatnimi linijkami programu tj:
if(c>1) program działa poprawnie a wg mnie nie powinien
poprawnie warunek powinien wyglądać if(c>0) (pomp_grzej ma być włączona dla c=1 lub c=2)
To samo się tyczy if(g>1) warunek nie działa poprawnie(uruchamia pompę gdy są przyciśnięte 2 przyciski) a wg mnie powinien wyglądać if(g>0) (zupełnie nie działa) pompa ma być wyłączona dla 0 a dla wartości 1 lub więcej powinna być włączona.
Czyli: -czemu działa poprawnie warunek if(c>1) skoro nie powinien chcę wiedzieć o co chodzi
- czemu nie działa warunek if(g>0) i co zrobić żeby działał
-wydaje mi się że z tymi dwoma warunkami robię sam sobie pod górkę i jest prostsze rozwiązanie proszę o wskazanie kierunku jak to uprościć jeśli można ale ważne jest abym wiedział czemu moje rozwiązanie nie działa.
Ostatnio zmieniony 23 lis 2014, 22:37 przez walgrad, łącznie zmieniany 2 razy.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Problem z funkcją warunkową (IF... ELSE)

Post autor: kazzik87 » 23 lis 2014, 13:42

Proszę umieścić kod w znaczniki "[ code ][ /code ]"!

A może:

Kod: Zaznacz cały

if (c>=1)
---
Jeżeli pomogłem to kliknij "Pomógł".
zgred125
Majsterkowicz
Posty: 88
Rejestracja: 23 gru 2013, 22:39

Re: Problem z funkcją warunkową (IF... ELSE)

Post autor: zgred125 » 24 lis 2014, 12:33

Masz błędy w void setup().
W komentarzu piszesz, że rezystory podciągające są włączone a nie są w twoim przypadku (zakładając, że nie podciągnełeś masy przez rezystor) to przy nie wciśniętym przycisku masz stan nieokreślony a przy wciśniętym HIGH. Aby podciągnąć rezystor powinno być pinMode(insbud, INPUT_PULLUP); a za to zupełnie nie rozumiem skąd coś takiego:

Kod: Zaznacz cały

pinMode(insbud, INPUT);
digitalWrite(insbud, HIGH);
Jak definiujesz coś jako wejście (INPUT) to nie możesz w programie ustawiać stanu wysokiego HIGH ponieważ stan zależy od tego co się aktualnie dzieje na pinie.

Dalej komentarz nie zgadza się z tym co jest w programie:

Kod: Zaznacz cały

if(przycisk1 == HIGH) { //jesli przycisk nie jest wcisniety
Stan jest HIGH kiedy jest wciśnięty a nie kiedy jest zwolniony.
ODPOWIEDZ

Strony partnerskie: