• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Prośba o pomoc
#1
Witam, wszystkich. 
Zbudowałem sterownik do wyciągu kuchennego, ponieważ stary uległ uszkodzeniu. 
Niestety wygląda na to, że moja wiedza z zakresu programowania jest niewystarczająca i potrzebuję pomocy fachowców.


Może na początek budowa i zasada działania sterownika:
Sterownik posiada 5 przekaźników, które sterują oświetleniem oraz poszczególnymi biegami wentylatora.
Przekaźnik 1 - włącza i wyłącza oświetlenie,
Przekaźnik 2 - pierwszy bieg wentylatora,
Przekaźnik 3 - drugi bieg wentylatora,
Przekaźnik 4 - trzeci bieg wentylatora,
Przekaźnik 5 - czwarty bieg wentylatora.
Przekaźnik 1 działa niezależnie od pozostałych, natomiast przekaźniki od 2 do 5 działają w taki sposób, że w jednym momencie załączony jest tylko jeden z nich.
Przakaźniki sterowane są za pomocą przycisków monostabilnych:
Przycisk 1 - sygnał do włączenia lub wyłączenia oświetlenia,
Przycisk 2 - sygnał do włączenia lub wyłączenia zasilania wentylatora - od razu załącza pierwszy bieg wentylatora
Przycisk 3 - zmniejszenie biegu wentylatora,
Przycisk 4 - zwiększenie biegu wentylatora.
Wciśnięcie przycisku 2 włącza wentylator w przypadku kiedy był wyłączony i wyłącza wentylator niezależnie od tego na którym biegu pracuje.
Wciśnięcie przycisku 3 zmniejsza biegi wentylatora aż do całkowitego wyłączenia zasilania wentylatora.
Wciśnięcie przycisku 4 zwiększa biegi wentylatora pod warunkiem, że załączone jest zasilanie wentylatora (przyciskiem 2).

Całość sterowana jest przez Arduino Pro Mini.

Napisałem już kilka wersji programu ale żadna nie działa tak jak trzeba. 
Może ktoś mógłby pomóc.

Przy okazji pytanie dodatkowe: czy zna ktoś niezawodny sposób na zaprogramowanie przycisku tak, żeby wciśnięcie danego przycisku spowodowało przesłanie jednego i tylko jednego sygnału do Arduino? U mnie zawsze prędzej czy później pojawiają się błędy. Np. wciśnięcie przycisku ma zwiększać licznik impulsów o jeden a czasem zwiększa o 2 lub więcej.
 Z góry dziekuję za odpowiedź.

Kod:
#define Relay1 2
#define Relay2 3
#define Relay3 4
#define Relay4 5
#define Relay5 6

#define Guzik1 A3
#define Guzik2 A2
#define Guzik3 A1
#define Guzik4 A0

#define Led1 13
#define Led2 12
#define Led3 11
#define Led4 10
#define Led5 7
#define Led6 8
#define wolne 9

int stanGuzika1;
int stanGuzika2;
int stanGuzika3;
int stanGuzika4;

int poprzedniStanGuzika1 = 1;
int poprzedniStanGuzika2 = 1;
int poprzedniStanGuzika3 = 1;
int poprzedniStanGuzika4 = 1;

int timeGuzik1 = 0;
int timeGuzik2 = 0;
int timeGuzik3 = 0;
int timeGuzik4 = 0;

int stanLed1 = 0;
int zasilanieWentylatora = 0;
int licznik = 0;

void setup() {

Serial.begin(9600); // Serial uruchomiony w celach testowych
 
 pinMode(Relay1, OUTPUT); // Przekaźnik do sterowania oświetleniem
 pinMode(Relay2, OUTPUT); // Prędkość 1
 pinMode(Relay3, OUTPUT); // Prędkość 2
 pinMode(Relay4, OUTPUT); // Prędkość 3
 pinMode(Relay5, OUTPUT); // Prędkość 4
 pinMode(Led1, OUTPUT); // Dioda pokazująca stan przekaźnika oświetlenia
 pinMode(Led2, OUTPUT); // Dioda pokazująca stan zasilania wentylatora (bieg pierwszy - załączone diody 2, 3)
 pinMode(Led3, OUTPUT); // Dioda pokazująca stan przekaźnika 2 (bieg pierwszy diody j.w.)
 pinMode(Led4, OUTPUT); // Dioda pokazująca stan przekaźnika 3 (bieg drugi - załączone diody 2, 3, 4)
 pinMode(Led5, OUTPUT); // Dioda pokazująca stan przekaźnika 4 (bieg trzeci - załączone diody 2, 3, 4, 5)
 pinMode(Led6, OUTPUT); // Dioda pokazująca stan przekaźnika 5 (bieg czwarty - załączone diody 2, 3, 4, 5, 6)

 pinMode(wolne, OUTPUT); // Wyjście zapasowe

 pinMode(Guzik1, INPUT_PULLUP); // Przycisk przełączający stan oświetlenia  
 pinMode(Guzik2, INPUT_PULLUP); // Przycisk włączający zasilanie wentylatora + pierwszy bieg
 pinMode(Guzik3, INPUT_PULLUP); // Przycisk zmniejszający biegi wentylatora
 pinMode(Guzik4, INPUT_PULLUP); // Przycisk zwiększający biegi wentylatora

 digitalWrite(Relay1, LOW);
 digitalWrite(Relay2, LOW);
 digitalWrite(Relay3, LOW);
 digitalWrite(Relay4, LOW);
 digitalWrite(Relay5, LOW);
 digitalWrite(Led1, stanLed1);
 digitalWrite(Led2, LOW);
 digitalWrite(Led3, LOW);
 digitalWrite(Led4, LOW);
 digitalWrite(Led5, LOW);
 digitalWrite(Led6, LOW);

 digitalWrite(wolne, LOW);

 digitalWrite(Guzik1, HIGH);
 digitalWrite(Guzik2, HIGH);
 digitalWrite(Guzik3, HIGH);
 digitalWrite(Guzik4, HIGH);

}

void loop() {
 oswietlenie();
 zasilanie_wentylatora();
 bieg_wentylatora_plus();
 bieg_wentylatora_minus();
 biegi_wentylatora();
}

void oswietlenie() {
 
 // Załączanie/wyłączanie światła
int odczytGuzika1 = digitalRead(Guzik1);
 if(odczytGuzika1 != poprzedniStanGuzika1) {
   timeGuzik1 = millis();
 }
 if(millis() - timeGuzik1 > 100UL) {
   if(odczytGuzika1 != stanGuzika1) {
     stanGuzika1 = odczytGuzika1;

     if(stanGuzika1 == LOW) {
       stanLed1 = !stanLed1;
     }
   }
 }
 digitalWrite(Relay1, stanLed1);
 digitalWrite(Led1, stanLed1);
 poprzedniStanGuzika1 = odczytGuzika1;
}

void zasilanie_wentylatora() {
// główny przycisk załączenie wentylatora - pierwszy bieg
 int odczytGuzika2 = digitalRead(Guzik2);
 if(odczytGuzika2 != poprzedniStanGuzika2) {
   timeGuzik2 = millis();
 }
 if(millis() - timeGuzik2 > 100UL) {
   if(odczytGuzika2 != stanGuzika2) {
     stanGuzika2 = odczytGuzika2;

     if(stanGuzika2 == LOW) {
        if (licznik < 1){
           licznik++;
         }
        else if(licznik > 0) {
         licznik--;
         }
       
        Serial.println("licznik:");
        Serial.println(licznik);
     }
   }
 }
 poprzedniStanGuzika2 = odczytGuzika2;
}

void bieg_wentylatora_plus() {

 int odczytGuzika4 = digitalRead(Guzik4);
  if(licznik > 0){
   if(odczytGuzika4 != poprzedniStanGuzika4) {
     timeGuzik4 = millis();
   }
   if(millis() - timeGuzik4 > 100UL) {
     if(odczytGuzika4 != stanGuzika4) {
       stanGuzika4 = odczytGuzika4;

       if(stanGuzika4 == LOW) {
         if(licznik >= 0 && licznik < 4) {
           licznik++;
           Serial.println("licznik:");
           Serial.println(licznik);
         }      
       }
     }
   }
   poprzedniStanGuzika4 = odczytGuzika4;
}
}
void bieg_wentylatora_minus(){
   int odczytGuzika3 = digitalRead(Guzik3);
   if(odczytGuzika3 != poprzedniStanGuzika3) {
     timeGuzik3 = millis();
   }
   if(millis() - timeGuzik3 > 100UL) {
     if(odczytGuzika3 != stanGuzika3) {
       stanGuzika3 = odczytGuzika3;

       if(stanGuzika3 == LOW) {
         if(licznik > 0 && licznik <= 4) {
           licznik--;
           Serial.println("licznik:");
           Serial.println(licznik);
         }      
       }
     }
   }
   poprzedniStanGuzika3 = odczytGuzika3;
}
void biegi_wentylatora() {
   switch(licznik) {
   
   case 0:  // wentylator wyłączony
        digitalWrite(Relay2, LOW);
        digitalWrite(Relay3, LOW);
        digitalWrite(Relay4, LOW);
        digitalWrite(Relay5, LOW);
        digitalWrite(Led2, LOW);
        digitalWrite(Led3, LOW);
        digitalWrite(Led4, LOW);
        digitalWrite(Led5, LOW);
        digitalWrite(Led6, LOW);
        break;
    case 1:  // pierwszy bieg
        digitalWrite(Relay2, HIGH);
        digitalWrite(Relay3, LOW);
        digitalWrite(Relay4, LOW);
        digitalWrite(Relay5, LOW);
        digitalWrite(Led2, HIGH);
        digitalWrite(Led3, HIGH);
        digitalWrite(Led4, LOW);
        digitalWrite(Led5, LOW);
        digitalWrite(Led6, LOW);
        break;  
    case 2:  // drugi bieg
        digitalWrite(Relay2, LOW);
        digitalWrite(Relay3, HIGH);
        digitalWrite(Relay4, LOW);
        digitalWrite(Relay5, LOW);
        digitalWrite(Led2, HIGH);
        digitalWrite(Led3, HIGH);
        digitalWrite(Led4, HIGH);
        digitalWrite(Led5, LOW);
        digitalWrite(Led6, LOW);
        break;  
    case 3:  // trzeci bieg
        digitalWrite(Relay2, LOW);
        digitalWrite(Relay3, LOW);
        digitalWrite(Relay4, HIGH);
        digitalWrite(Relay5, LOW);
        digitalWrite(Led2, HIGH);
        digitalWrite(Led3, HIGH);
        digitalWrite(Led4, HIGH);
        digitalWrite(Led5, HIGH);
        digitalWrite(Led6, LOW);
        break;  
    case 4:  //czwarty bieg
        digitalWrite(Relay2, LOW);
        digitalWrite(Relay3, LOW);
        digitalWrite(Relay4, LOW);
        digitalWrite(Relay5, HIGH);
        digitalWrite(Led2, HIGH);
        digitalWrite(Led3, HIGH);
        digitalWrite(Led4, HIGH);
        digitalWrite(Led5, HIGH);
        digitalWrite(Led6, HIGH);
        break;  
  }                
}

Edit. Trochę poprawiłem kod.
 
Odpowiedź
  


Wiadomości w tym wątku
Prośba o pomoc - przez AdamJab - 16-05-2019, 09:56
RE: Prośba o pomoc - przez kaczakat - 16-05-2019, 13:56
RE: Prośba o pomoc - przez AdamJab - 16-05-2019, 14:30
RE: Prośba o pomoc - przez kaczakat - 16-05-2019, 18:06
RE: Prośba o pomoc - przez Jarewa0606 - 17-05-2019, 15:39
RE: Prośba o pomoc - przez AdamJab - 17-05-2019, 19:02
RE: Prośba o pomoc - przez kaczakat - 17-05-2019, 15:53
RE: Prośba o pomoc - przez AdamJab - 17-05-2019, 19:05
RE: Prośba o pomoc - przez Jarewa0606 - 17-05-2019, 19:20
RE: Prośba o pomoc - przez AdamJab - 17-05-2019, 19:43
RE: Prośba o pomoc - przez kaczakat - 17-05-2019, 19:44
RE: Prośba o pomoc - przez Jarewa0606 - 17-05-2019, 20:44
RE: Prośba o pomoc - przez AdamJab - 18-05-2019, 08:36

Skocz do:


Przeglądający: 1 gości