RCWL-0516 to alternatywa dla czujnika PIR. Sprawdzę jak silna.
SPECYFIKACJA
RCWL-0516 microwave radar sensor module Human body induction switch module Intelligent sensor
- Napięcie robocze: 4-28V
- Prąd operacyjny: 2,8 mA (typowy); 3 mA (maks.)
- Odległość wykrywania: 5-9 m
- Moc transmisyjna: 20 mW (typowa); 30 mW (maks.)
- Napięcie wejściowe: 3,2-3,4V
- Prąd zasilania: 100 mA
- Kontrola wstępna poziom niski: 0V
- Kontrola wstępna wysoki poziom: 3.3V.
- Temperatura pracy: -20 ~ 80 stopni Celsjusza
Stan logiczny HIGH wysyła napięcie 3.3V przy zasilaniu 5V. Jest zatem bezpieczny dla wejść ESP8266. Natomiast przy zasilaniu z NodeMCU 3.3V nie pracuje (prąd zasilania 100 mA)
Czujnik działa również przy napięciu 9V. Również wtedy OUT wysyła napięcie 3.3V. Przy napięciu 12V sensor nie działał, cały czas trzymał poziom HIGH (3.3V). Nie wiem dlaczego, skoro w nocie katalogowej jest zakres 4-28V.
Czujnik RCWL-0516 potrzebuje mocnego zasilania z osobnego źródła. Zwykle zasilam urządzenie stabilnym zasilaczem 5V/2A. Zamykam czujnik w plastikowej obudowie w odległości co najmniej 10 cm od płytki z mikrokontrolerem. Wtedy układ działa praktycznie bezawaryjnie.
ŁĄCZENIE
Łączenie jest banalnie proste.
KODY:
/*
RCWL-0516 czujnik ruchu pin 2 //arduino nano
Po ustaniu ruchu program odlicza czas ustawiony w zmiennej "zwloka"
i miga diodą na pinie 6
Written by Jarogniew Milewski for "Arduino dla strasznych lamerów"
http://arduino.net.pl
Licensed under the MIT license.
All text above must be included in any redistribution.
*/
#include "millisDelay.h"
millisDelay outMillisDelay, flashingMillisDelay;
#define motionSensor 2 //D2 nano
#define outLed 5
#define flashingLed 6
long sensorDelay = 15000; // zwłoka po ustaniu ruchu
int flashingSpeed = 500; // tempo migania diody
bool isDark = true;
bool moveStatus = false; // blokada pętli
bool ledOn = false;
void setup() {
Serial.begin(9600);
pinMode(outLed, OUTPUT);
digitalWrite(outLed, LOW);
pinMode(flashingLed, OUTPUT);
digitalWrite(flashingLed, LOW);
outMillisDelay.start(sensorDelay); // inicjowanie akcji biblioteki millisDelay
}
void loop() {
if (isDark) {
if (outMillisDelay.isFinished()) { // jeśli zakończone odliczanie
digitalWrite(outLed, LOW);
Serial.println("Wyłączam światło");
flashingMillisDelay.stop(); // zakończ miganie diody i wyświetlanie czasu
digitalWrite(flashingLed, LOW); // dioda migająca zgaszona
ledOn = false;
}
// ================ dioda migająca ========================
if (!moveStatus) // jeśli brak ruchu wyświetl pozostający czas i migaj diodą
{
if (flashingMillisDelay.isFinished())
{
flashingMillisDelay.repeat(); // powtarzaj z ustawioną wcześniej zwłoką
Serial.println(outMillisDelay.remaining());
if (outMillisDelay.remaining() <= 10000) // migaj diodą w ostatnich 10 sekundach
{
ledOn = !ledOn; // toggle led
if (ledOn) {
digitalWrite(flashingLed, HIGH);
} else {
digitalWrite(flashingLed, LOW);
}
}
}
}
czujnik_ruchu();
}
}
// ================== FUNKCJE ========================
void czujnik_ruchu()
{
bool IsMove = digitalRead(motionSensor); // stan sensora ruchu
switch (moveStatus)
{
case 0:
if (IsMove) // wykryto ruch
{
Serial.println("Wykryto ruch");
//analogWrite(outLed, data2); // sterowanie jasnością paska led
digitalWrite(outLed, HIGH); // zapalenie diody
Serial.println("Włączam światło");
outMillisDelay.stop();
digitalWrite(flashingLed, LOW); // zgaszenie ledy odliczającej przy wykryciu ruchu
moveStatus = true;
}
break;
case 1:
if (!IsMove) // ruch ustał
{
outMillisDelay.start(sensorDelay); // inicjowanie akcji biblioteki millisDelay
flashingMillisDelay.start(flashingSpeed); // włączenie diody migającej z ustawioną częstotliwością
Serial.print("Brak ruchu, zaczynam odliczanie ustalonej zwłoki - ");
Serial.print(outMillisDelay.delay() / 1000);
Serial.println(" sekund:");
moveStatus = false;
}
break;
}
}
MicroPython i RCWL-0516
Uwaga! Pamiętać należy, że w przypadku użycia ESP-8266 czy ESP-32 czujnik RCWL-0516 nie zadziała na 3,3V. Aby oszczędzić sobie stresu szukania w kodzie dlaczego program nie działa właściwie, należy zasilić go co najmniej 5V. I nie wystarczy zasilić go na przykład z pinu 5V płytki ESP8266 D1 mini, jeśli podłączone są inne czujniki. Do stabilnej pracy RCWL-0516 dobrym rozwiązaniem jest osobny zasilacz.
Oto prosty program obsługujący czujnik.
Bardziej skomplikowany program, który sprawdza ruch i jeśli nastąpił po czasie dłuższym niż MIN_ELAPSED_SINCE_STOP, wysyła info na serwer flask o intruzie.
https://gist.github.com/yarogniew/28d0f7450b08e57f3248aaee71975ecd
LINKI
- ESP8266-RCWL0516
- Wiring the RCWL0516 Auto Induction Doppler Microwave Radar with ESP8266/32/Arduino
- https://dronebotworkshop.com/rcwl-0516-experiments/
- abc-rc.pl
- rohling-de.blogspot.com
- RCWL-0516 information
- Investigating a RCWL 9196 / RCWL-0516
- #135 Radar Sensors / Switches: Comparison and Tests – Andreas Spiess