Dzień dobry. Jestem poczatkującym i uczę się obsługi i programowania Arduino. Chciał bym aby moje arduino nadzorowało zamkniecie drzwi w komorze, w której muszą być szczelnie pozamykane drzwi.
Mam 4 pary drzwi. Jak są prawidłowo zamknięte drzwi to mają świecić się cztery diody zielone. W przypadku otwarcia drzwi zapalają się ledy czerwone w zależność, które drzwi są otwarte (gaśnie zielona i zapala się czerwona) oraz włącza się buzerek sygnalizujący nie zamknięte drzwi. Ja napisałem program używając pętli " if else " ale jest to błędne bo ja otwarte są pierwsze drzwi gaśnie zielona led i zaświeca się czerwona i dalej otwierając kolejne nie powoduje zmian stanów w kolejnych ledach.
Proszę o podpowiedz jakich powinienem użyć warunków aby spełnić to zadanie. Może ktoś wysłał mi przykładowy szkic.
Z góry dziękuję i myślę że niedługo ja będę mógł podpowiadać nowicjuszom.
Pozdrawiam
Bez kompletnego kodu będzie ciężko.
Rozumujesz dobrze, ale pewnie jest jakiś błąd w kodzie, np. kolejne IFy zagnieżdżone w innych, zamiast być w pętli głównej.
Tu masz gotowca porty wpisałem przypadkowe musisz sobie pozmieniać.
Kod:
const int button1 = 2;
const int button2 = 3;
const int button3 = 4;
const int button4 = 5;
const int ledc1 = 6;
const int ledc2 = 7;
const int ledc3 = 8;
const int ledc4 = 9;
const int ledz1 = 10;
const int ledz2 = 11;
const int ledz3 = 12;
const int ledz4 = 13;
int buttonState1 = 1;
int buttonState2 = 1;
int buttonState3 = 1;
int buttonState4 = 1;
void setup() {
pinMode(ledz1, OUTPUT);
pinMode(ledz2, OUTPUT);
pinMode(ledz3, OUTPUT);
pinMode(ledz4, OUTPUT);
pinMode(ledc1, OUTPUT);
pinMode(ledc2, OUTPUT);
pinMode(ledc3, OUTPUT);
pinMode(ledc4, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
}
void loop() {
buttonState1 = digitalRead(button1);
buttonState2 = digitalRead(button2);
buttonState3 = digitalRead(button3);
buttonState4 = digitalRead(button4);
if (buttonState1 == LOW) {
// turn LED on:
digitalWrite(ledc1, HIGH);
} else {
// turn LED off:
digitalWrite(ledz1, LOW);
}
if (buttonState2 == LOW) {
// turn LED on:
digitalWrite(ledc2, HIGH);
} else {
// turn LED off:
digitalWrite(ledz2, LOW);
}
if (buttonState3 == LOW) {
// turn LED on:
digitalWrite(ledc3, HIGH);
} else {
// turn LED off:
digitalWrite(ledz3, LOW);
}
if (buttonState4 == LOW) {
// turn LED on:
digitalWrite(ledc4, HIGH);
} else {
// turn LED off:
digitalWrite(ledz4, LOW);
}
}
adix - na tablicach to by było o wiele piękniej, niż tak topornie to robić
Tak wiem ale napisałem to by każdy zrozumiał.
Staram się pisać jak najbardziej proste kody bo my je zrozumiemy ale początkujący będą pytać" a czego tak"
dzięki
wgrałem kody, ale na czuwaniu nie świecą zielone ledy wskazując zamknięte drzwi. Po uruchomieniu włączników włączają się ledy czerwone, ale nie nie gasną po zamknięciu drzwi i nie załanczają zielonych.
pozdrawiam
Program działa tak;
jeśli klawisz jest 0 to włącz diodę jeśli 1 to wyłącz i tak wszystkie 4, nie tak miał działać.
Kod:
const int button1 = 2;
const int button2 = 3;
const int button3 = 4;
const int button4 = 5;
const int ledc1 = 6;
const int ledc2 = 7;
const int ledc3 = 8;
const int ledc4 = 9;
const int ledz1 = 10;
const int ledz2 = 11;
const int ledz3 = 12;
const int ledz4 = 13;
int buttonState1 = 1;
int buttonState2 = 1;
int buttonState3 = 1;
int buttonState4 = 1;
void setup() {
pinMode(ledz1, OUTPUT);
pinMode(ledz2, OUTPUT);
pinMode(ledz3, OUTPUT);
pinMode(ledz4, OUTPUT);
pinMode(ledc1, OUTPUT);
pinMode(ledc2, OUTPUT);
pinMode(ledc3, OUTPUT);
pinMode(ledc4, OUTPUT);
digitalWrite(ledz1, LOW);
digitalWrite(ledz2, LOW);
digitalWrite(ledz3, LOW);
digitalWrite(ledz4, LOW);
digitalWrite(ledc1, LOW);
digitalWrite(ledc2, LOW);
digitalWrite(ledc3, LOW);
digitalWrite(ledc4, LOW);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
}
void loop() {
buttonState1 = digitalRead(button1);
buttonState2 = digitalRead(button2);
buttonState3 = digitalRead(button3);
buttonState4 = digitalRead(button4);
if (buttonState1 == LOW) {
// turn LED on:
digitalWrite(ledc1, HIGH);
} else {
// turn LED off:
digitalWrite(ledz1, LOW);
}
if (buttonState2 == LOW) {
// turn LED on:
digitalWrite(ledc2, HIGH);
} else {
// turn LED off:
digitalWrite(ledz2, LOW);
}
if (buttonState3 == LOW) {
// turn LED on:
digitalWrite(ledc3, HIGH);
} else {
// turn LED off:
digitalWrite(ledz3, LOW);
}
if (buttonState4 == LOW) {
// turn LED on:
digitalWrite(ledc4, HIGH);
} else {
// turn LED off:
digitalWrite(ledz4, LOW);
}
}
Spróbuj ten możne się buży o brakujących stany początkowe bo zapomniałem napisać ich.
Dzięki,
ale nadal nie chcą się zaświecić na początku zielone.
Opiszę Ci jeszcze raz oraz załączę sygnalizator.
W pomieszczeniu mamy 4 pary drzwi, które muszą być zamknięte (ten stan zamknięcia sygnalizują 4 zielone ledy gdy zostaną otwarte któreś drzwi stan zielone zmienia się na czerwony).
Musimy pamiętać iż drzwi mogą być otwierane i zamykane w różnych kolejnościach.
Mój program działał do tego momentu Ok. ale w przypadku otwarcia np. drzwi nr2 następnie nr 3 i zamykamy pierwsze np. 2 i stan z czerwonej mi się nie zmieniał na zielony dopóki nie zamknąłem wszystkich.
No to zmieniasz tutaj:
Kod:
digitalWrite(ledz1, LOW); // na HIGH
digitalWrite(ledz2, LOW); // na HIGH
digitalWrite(ledz3, LOW); // na HIGH
digitalWrite(ledz4, LOW); // na HIGH
i na początku się zapalą.
To co mówisz jest trochę dziwne, bo kod każdego IFa rozpatruje osobno, a przynajmniej powinien.
Może jednak masz coś źle podłączone?
Poza tym można byłoby pominąć zmienne
buttonState4 i warunki zamienić tak:
Kod:
if ( digitalRead(button1)== LOW)
albo jeszcze inaczej:
Kod:
//deklaracja
boolean buttonState1;
//w pętli:
buttonState1 = digitalRead(button1) == LOW;
digitalWrite(ledc1, buttonState1);
digitalWrite(ledz1, !buttonState1);
a potem ten kod wstawić w pętli
Podaj mi schemat połączenia a wtedy ci dopasuje bo ja mam ledy pod 5v i sterowane gnd i u mnie działa jak masz inaczej to będzie działało na odwrót.