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