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ź.
Edit. Trochę poprawiłem kod.
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.