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:

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

Dodaj komentarz