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