Arduino Polska Forum

Pełna wersja: Monitorowanie wejść
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
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ć Smile
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 Smile
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.
Stron: 1 2 3