• 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
Monitorowanie wejść
#1
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
 
Odpowiedź
#2
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.
 
Odpowiedź
#3
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);
  }


  
}
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#4
adix - na tablicach to by było o wiele piękniej, niż tak topornie to robić Smile
 
Odpowiedź
#5
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"
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#6
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
 
Odpowiedź
#7
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.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#8
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.
 
Odpowiedź
#9
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
 
Odpowiedź
#10
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.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości