Arduino

Tani czujnik zbliżeniowy RPR220, bistabilny wyłącznik światła.

RPR220 jest czujnikiem zbliżeniowym opartym o fotodiodę i tranzystor. Czujniki tego typu składają się z 2 elementów: emitera oraz detektora. Emiter wysyła sygnał o określonej częstotliwości, który odbijając się od przeszkody wraca do detektora.

Karta techniczna RPR220.

Przy tym projekcie korzystałem z tekstu na instructables.com:  Cheap Sensors: RPR220 by sdfgeoff

Podłączenie do Arduino jest proste i wymaga użycia jedynie dwóch rezystorów:

RPR220

Tak to działa:

Muszę powiedzieć, że jestem mile zaskoczony precyzją działania czujnika. Reaguje już na przeszkodę znajdującą się w odległości ok. 40 cm, więc możemy go śmiało wykorzystać na przykład jako włącznik światła w szafie po otwarciu drzwi.

Kod programu:


#define IR_INPUT_PIN A0
#define IR_LED_PIN 2
#define LED_PIN 13
int STAN_LED=0;

void setup(){
 Serial.begin(9600);
 pinMode(IR_INPUT_PIN, INPUT);
 pinMode(IR_LED_PIN, OUTPUT);
 pinMode(LED_PIN, OUTPUT);
}

void loop(){
  int ambient = 0;
  int lit = 0;
  int value = 0;

  digitalWrite(IR_LED_PIN, LOW);
  delay(5);                            //To give ADC and LED transition time
  ambient = analogRead(IR_INPUT_PIN);

  digitalWrite(IR_LED_PIN, HIGH);
  delay(5);
  lit = analogRead(IR_INPUT_PIN);

  value = lit - ambient;

  if(value>60 & !STAN_LED){
    digitalWrite(LED_PIN, HIGH);
    STAN_LED=1;
  }
  else
  {
    digitalWrite(LED_PIN, LOW);
    STAN_LED=0;
  }

   Serial.println(value);

}

Wariant drugi:

Postanowiłem wykorzystać czujnik jako zbliżeniowy, bistabilny włącznik światła. Przesłonięcie ręką włącza, albo wyłącza lampę. Tak to wygląda:

VID_123370223_151518_798

I odpowiedni kod:


#define IR_INPUT_PIN A0
#define IR_LED_PIN 2
#define LED_PIN 13

boolean ledState = 0;
boolean prevLedState = 0;
int counter = 0;

void setup() {
  Serial.begin(9600);
 pinMode(IR_INPUT_PIN, INPUT);
 pinMode(IR_LED_PIN, OUTPUT);
 pinMode(LED_PIN, OUTPUT); 

} 

void loop() {
   int ambient = 0;
   int lit = 0;
   int value = 0;

digitalWrite(IR_LED_PIN, LOW);
  delay(5);
  ambient = analogRead(IR_INPUT_PIN);   // czytanie sygnalu otoczenia bez wyslania IR
digitalWrite(IR_LED_PIN, HIGH);
  delay(5);
  lit = analogRead(IR_INPUT_PIN);
  value = lit - ambient;
  Serial.print("value = ");
  Serial.println( value);

// ustalenie przy jakim zbliżeniu ręki włączamy LED
  if(value>40){
    ledState=1;
  }else{
    ledState=0;
    }
  delay(5);

  if (ledState != prevLedState && ledState) {  // jeśli LED zmienił stan i było zasłonięcie

      counter++;               // liczymy ilość zasłon

        if (!isEven(counter)) // sprawdzamy czy liczba zasłon jest nieparzysta
            {digitalWrite(LED_PIN, LOW);
            counter=0;} // zerujemy licznik zasłon, żeby nie mnożyć bytów 😉
        else
            {digitalWrite(LED_PIN, HIGH);}

  }

  prevLedState = ledState;   // zapamiętujemy nowy stan LED

}

int isEven(int x) // funkcja ustalania parzystości
{
if ((x%2)==0) return 0;
else return 1;
}
Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s