RCWL-0516. Mikrofalowy sensor ruchu człowieka

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

Uwaga! 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).

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.

ŁĄ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;
  }

}

LINKI

Dodaj komentarz