RCWL-0516. Mikrofalowy sensor ruchu człowieka (Arduino i MicroPython)

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.


LINKI

Dodaj komentarz