Skocz do zawartości

[Arduino Uno] Dwa czujniki ruchu - problem z diodami


Pomocna odpowiedź

Napisano

Witam.

Podłączyłem 2 czujniki ruchu do Arduino. Dodatkowo chciałem dodać do układu 2 diody, gdzie każda z nich byłaby odpowiedzialna za "swój" czujnik ruchu, tzn. jeżeli aktywuje się czujnik 1 to dioda żółta zaczyna świecić, jeżeli czujnik 2 to zaświeci się dioda czerwona.

Poza tym w układzie zawarty jest brzęczek, informujący o aktywowaniu dowolnego czujnika.

Niestety mam problem. Układ na jednej diodzie działa bardzo dobrze, jednak gdy analogicznie zmieniam kod programu dodając w nim drugą diodę nie jest już tak dobrze.

Cały czas pierwszy czujnik i pierwsza dioda działają tak jak powinny, ale 2 dioda świeci nieregularnie, nie zawsze wtedy gdy powinna, np. drugi czujnik nie wykrywa ruchu, a dioda miga + brzęczek jest aktywowany.

Zamieszczam kod programu dla układu z 1 diodą.

int ledPin = 13;                
int inputPin = 2;    
int inputPin2 = 12; 
int pirState = LOW;
int pirState2 = LOW;
int val = 0;  
int val2 = 0;
int pinSpeaker = 10;           

void setup() {
 pinMode(ledPin, OUTPUT);      
 pinMode(inputPin, INPUT);     
 pinMode(inputPin2, INPUT);
 pinMode(pinSpeaker, OUTPUT);
 Serial.begin(9600);
}

void loop(){
 val = digitalRead(inputPin);  

 if (val == HIGH) {            
   digitalWrite(ledPin, HIGH);  
   playTone(300, 150);
   delay(100);

   if (pirState == LOW) {
     Serial.println("Motion detected!");
     pirState = HIGH;
   }
 } else {
     digitalWrite(ledPin, LOW); 
     playTone(0, 0);
     delay(300);    
     if (pirState == HIGH){
     Serial.println("Motion ended!");
     pirState = LOW;
   }
 }
val2 = digitalRead(inputPin2);
 if (val2 == HIGH) {            
   digitalWrite(ledPin, HIGH);  
   playTone(300, 150);
   delay(150);

   if (pirState2 == LOW) {
     Serial.println("Motion detected!");
     pirState2 = HIGH;
   }
 } else {
     digitalWrite(ledPin, LOW); 
     playTone(0, 0);
     delay(300);    
     if (pirState2 == HIGH){
     Serial.println("Motion ended!");
     pirState2 = LOW;
   }
 }

}
void playTone(long duration, int freq) {
   duration *= 1000;
   int period = (1.0 / freq) * 1000000;
   long elapsed_time = 0;
   while (elapsed_time < duration) {
       digitalWrite(pinSpeaker,HIGH);
       delayMicroseconds(period / 2);
       digitalWrite(pinSpeaker, LOW);
       delayMicroseconds(period / 2);
       elapsed_time += (period);
   }
}

Poniżej kod dla układu z 2 diodami.

int ledPin = 13;                
int ledPin2 = 8;
int inputPin = 2;    
int inputPin2 = 12; 
int pirState = LOW;             
int pirState2 = LOW;
int val = 0;  
int val2 = 0;
int pinSpeaker = 10;           

void setup() {
 pinMode(ledPin, OUTPUT);      
 pinMode(ledPin2, OUTPUT);
 pinMode(inputPin, INPUT);     
 pinMode(inputPin2, INPUT);
 pinMode(pinSpeaker, OUTPUT);
 Serial.begin(9600);
}

void loop(){
 val = digitalRead(inputPin);  

 if (val == HIGH) {            
   digitalWrite(ledPin, HIGH);  
   playTone(300, 150);
   delay(100);

   if (pirState == LOW) {
     Serial.println("Motion detected!");
     pirState = HIGH;
   }
 } else {
     digitalWrite(ledPin, LOW); 
     playTone(0, 0);
     delay(300);    
     if (pirState == HIGH){
     Serial.println("Motion ended!");
     pirState = LOW;
   }
 }
val2 = digitalRead(inputPin2);
 if (val2 == HIGH) {            
   digitalWrite(ledPin2, HIGH);  
   playTone(300, 150);
   delay(150);

   if (pirState2 == LOW) {
     Serial.println("Motion detected!");
     pirState2 = HIGH;
   }
 } else {
     digitalWrite(ledPin2, LOW);
     playTone(0, 0);
     delay(300);    
     if (pirState2 == HIGH){
     Serial.println("Motion ended!");
     pirState2 = LOW;
   }
 }

}

void playTone(long duration, int freq) {
   duration *= 1000;
   int period = (1.0 / freq) * 1000000;
   long elapsed_time = 0;
   while (elapsed_time < duration) {
       digitalWrite(pinSpeaker,HIGH);
       delayMicroseconds(period / 2);
       digitalWrite(pinSpeaker, LOW);
       delayMicroseconds(period / 2);
       elapsed_time += (period);
   }
}

Podejrzewam, że problem tkwi w kodzie programu, ale siedzę nad tym już trochę czasu i nie mogę wychwycić tego błędu.

Dlatego proszę o pomoc.

qqqqqq90, najłatwiej przy debugowaniu będzie chyba skorzystać z UARTa. Czy wszystkie teksty wyświetlają się w monitorze portu szeregowego wtedy, gdy powinny? Czy tutaj nie znalazłeś żadnych problemów?

qqqqqq90, najłatwiej przy debugowaniu będzie chyba skorzystać z UARTa. Czy wszystkie teksty wyświetlają się w monitorze portu szeregowego wtedy, gdy powinny? Czy tutaj nie znalazłeś żadnych problemów?

Motion detected1! [1 czujnik]

Motion detected2! [2 czujnik]

Gdy aktywuje czujnik 1(zasłaniam go przez około 1s):

Motion detected1!

Motion detected2!

Motion ended2!

Motion detected2!

Motion ended2!

Motion detected2!

Motion ended2!

Motion detected2!

Motion ended2!

Motion detected2!

Motion ended1!

Motion ended2!

Po aktywacji 1 czujnika, 2 też automatycznie zaczyna tak jakby się aktywować :/

Ogólnie z 2 czujnikiem całkiem coś jest nie tak.

Jak zasłonię go na chwilę

Motion detected2!

Motion ended2!

Motion detected2!

Motion ended2!

Motion detected2!

Motion ended2!

Motion detected2!

Motion ended2!

..

i tak przez jakiś czas. Co jakiś czas sam się tak jakby aktywował i dioda połączona z nim miga mimo, że żadnego ruchu powinien nie odczytywać, tak jakby program się zapętlał.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...