• 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
Czujnik ruchu PIR HC-SR501 - sygnał zmienia się niezależnie od ruchu
#1
Witam,
właśnie zaczynam swoją przygodę z Arduino, na początek od sterowania oświetleniem. Zmontowałem zestaw, który sterował przekaźnikiem przy odpowiednim natężeniu światła (fotorezystor) i wszystko na stole ładnie działało.

Założyłem to w miejscu docelowym i nagle PIR nic nie widzi, a sygnał sam się zmienia, bez względu na to czy jest jakiś ciepły obiekt w zasięgu czy nie. Całość wróciła na stół, na gotowych kabelkach zapięte bezpośrednio do płytki i nadal to samo. Program uprościłem do minimum, tak aby pokazywał tylko stan sygnału. Próbowałem różnych konfiguracji potencjometrów, ale bez zmian. Próbowałem drugiego czujnika, ale nadal to samo. Zmieniałem pin arduino, ale nic to nie dało. Sprawdzałem nawet miernikiem i +5V i gnd są cały czas, a +3V pojawia się dokładnie wtedy, gdy Arduino widzi "ruch".

Tak wygląda jego wynik, na stole ustawione wprost na mnie, podczas machania dość szeroko w stronę czujnika:
Kod:
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
A to kod samego programu:
Kod:
int sensor = 2;              
int val = 0;            

void setup() {
 pinMode(sensor, INPUT);    
 Serial.begin(9600);      
}

void loop(){
 val = digitalRead(sensor);
 Serial.println(val);
 delay(300);
 }
Tak wygląda zmontowany układ:
[Obrazek: D5dHwZBK.jpg]
 
Odpowiedź
#2
Nowa obserwacja jest taka, że gdy wywołam ruch, to czujnik przez 2 sekundy go sygnalizuje stanem wysokim, po czym już cały czas jest niski, pomimo, że ruch odbywa się cały czas w polu widzenia PIR. Mija kolejne kilka, może kilkanaście sekund i ponownie mamy dwa stany wysokie, a dalej już same niskie. Jeżeli ruchu nie ma wcale, to stan niski jest cały czas

Ktoś ma jakieś pomysły?
 
Odpowiedź
#3
(07-11-2016, 09:49)Mad_Maxs napisał(a): Ktoś ma jakieś pomysły?

Po przeczytaniu opisu czujnika (zachęcam!), odpowiedź wydaje się prosta. Na płytce czujnika jest zworka (MD).Widać ją nawet na zdjęciu, które zamieściłeś.
Zworka w pozycji H ustawia wyjście w stan wysoki po wykryciu ruchu i utrzymuje ten stan przez cały czas wykrywania ruchu, natomiast zworka w pozycji L przechodzi w stan niski po pewnym czasie od wykrycia ruchu, niezależnie od tego, czy ruch się utrzymuje.

Prawdopodobnie masz tę zworkę ustawioną w niepożądaną dla siebie pozycję.
 
Odpowiedź
#4
(07-11-2016, 11:09)krn78 napisał(a): Prawdopodobnie masz tę zworkę ustawioną w niepożądaną dla siebie pozycję.

W sumie mój błąd, bo tego nie napisałem wcześniej. Próbowałem ustawiać zworkę w obydwu pozycjach, efekt zawsze jest ten sam. Na zdjęciu jest ustawiona na sygnalizowanie stanem wysokim przez cały czas wykrywania ruchu. Pomijając ten fakt, to gdybym nawet ją źle ustawił, to potencjometr odpowiedzialny za czas sygnalizowania, ustawiony na MAX, powinien dawać dłużej sygnał, niż w pozycji MIN, a w moim przypadku, nic nie wnosi
 
Odpowiedź
#5
Być może sam czujnik jest uszkodzony. Masz drugi, żeby go sprawdzić?
 
Odpowiedź
#6
Właśnie mam dwa, oba dają takie same wyniki. Myślę, że zamówię jeszcze jeden przy okazji, bo kombinowałem inne rzeczy z Arduino jak diody IR, fotorezystory, itp. i wszystko działa jak należy, tylko z PIR ma problem
 
Odpowiedź
#7
pinMode(sensor, INPUT_PULLUP);

Zapomniałeś o podciągnięciu chyba ze podciągasz zewnętrznym rezystorem i to sprawę załatwi.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#8
(09-11-2016, 02:19)adix napisał(a): pinMode(sensor, INPUT_PULLUP);

Zapomniałeś o podciągnięciu chyba ze podciągasz zewnętrznym rezystorem i to sprawę załatwi.

Niestety, nie pomogło (podobno ten czujnik nie wymaga podciągania, bo daje 3V po wykryciu ruchu) Sad Gdy kręcę potencjometrem T1, to rzeczywiście sygnał mam dłuższy, ale to nie rozwiązanie, bo mimo, że macham przed samym czujnikiem, ten pokazuje Motion stoped.

Tak wygląda konsola, gdy macham przed czujnikiem:
Kod:
1 Motion detect
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
1 Motion detect
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!
0 Motion stopped!

Dla kodu:
Kod:
int sensor = 2;              // the pin that the sensor is atteched to
int state = LOW;             // by default, no motion detected
int val = 0;                 // variable to store the sensor status (value)

void setup() {
 pinMode(sensor, INPUT_PULLUP);    // initialize sensor as an input
 Serial.begin(9600);        // initialize serial
 }

void loop(){
 val = digitalRead(sensor);   // read sensor value
 Serial.print(val);
   if (val == HIGH) {           // wykryty ruch
     Serial.println(" Motion detect"); //wyswietl napis w konsoli
     delay(500);                // delay 100 milliseconds
     }
     if (val == LOW) {
       Serial.println(" Motion stopped!");
       delay(500);
       }

       }
 
Odpowiedź
#9
Dzisiaj odebrałem paczkę z dwoma nowymi czujnikami i działają dokładnie tak samo jak te które już miałem. Ewidentnie winny jest albo sketch, albo sama płytka arduino, ale czy to możliwe? Próbowałem już z podaniem zewnętrznego źródła zasilania, ale to nadal nie to.

Tak to teraz działa:
https://youtu.be/qn3nMGPjuws

Czujnik widzi ruch i sygnalizuje go cały czas gdy trwa. Gdy jednak ruch zanika, czujnik łapie jakby delay na 5 sekund, przez które nie reaguje na ruch. Po tym czasie, gdy wystąpi ruch, znowu reaguje. Zworka jest we właściwej pozycji
 
Odpowiedź
#10
Słuchaj czujnik działa jak switch .
To sprubuj.
Kod:
int sensor = 2;              // the pin that the sensor is atteched to
int state = LOW;             // by default, no motion detected
            // variable to store the sensor status (value)

void setup() {
pinMode(sensor, INPUT_PULLUP);    // initialize sensor as an input
Serial.begin(9600);        // initialize serial
}

void loop(){

   if ( digitalRead(sensor) == HIGH) {           // wykryty ruch
     Serial.println(" Motion detect"); //wyswietl napis w konsoli
     delay(200);                // delay 100 milliseconds
     }else{
       Serial.println(" Motion stopped!");
       delay(200);
       }

       }
[Obrazek: banerelektronika.jpg]



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


Skocz do:


Przeglądający: 1 gości