Arduino sketchbook #3 - LDR di prossimità

Un test interessante sull'utilizzo di restistori LDR come "sensori di prossimità a basso costo". L'idea: sfruttare la variazione della luminosità in base alla riflessione della luce emessa da un LED prossimo al sensore LDR. Sostanzialmente vorrei utilizzare i resistori LDR per avere un feedback sull'avvicinarsi di un ostacolo: avvicinandosi la luce riflessa del LED sul LDR subirà una variazione.


Il feedback in questo caso è dato da due LED che si accenderanno solo nel caso in cui si rileva un "ostacolo".
Un paio di appunti:
1) il valore in risposta dei due LDR deve essere il più simile possibile;
2) i LED affiancati al LDR devono possibilmente non interferire con l'altro resistore LDR.
Per garantire una funzionalità apprezzabile del tutto bisogna tener presente che la risposta della resistenza dei due LDR non sarà mai uguale. Per questo ho previsto un valore di errore del 5% sul confronto fra le risposte dei due resistori entro il quale non succede nulla:
int max = R_val > L_val ? R_val : L_val;
if(R_val < max*(1+0.05) && R_val > max*(1-0.05))
    digitalWrite(R_LED, LOW);
else
     digitalWrite(R_LED, HIGH);
if(L_val < max*(1+0.05) && L_val > max*(1-0.05))
     digitalWrite(L_LED, LOW);
else
     digitalWrite(L_LED, HIGH);
In questo modo si riesce ad ottenere un feedback ad una distanza di < 10cm (non male!).
Lo schema circuitale leggermente complesso prevede:
- 2 resistenze da 220 Ohm
- 4 resistenze da 10 KOhm
- 2 LED Rosso (il feedback)
- 2 LED Blu
- 2 LDR


Di seguito il codice per Arduino:

/**
 * LDRsensor.ino
 * -----------------
 * LDR as cheap sensor of proximity
 *
 * <sabageek.blogspot.com>
**/

const int R_LED = 9;
const int L_LED = 10;
const int digitRled = 2;
const int digitLled = 4;
const int L_LDR = 0;
const int R_LDR = 1;
//methods
void activeLight(int R_val, int L_val);
void setup(){
  pinMode(R_LED, OUTPUT);
  pinMode(L_LED, OUTPUT);
  pinMode(digitRled, OUTPUT);
  pinMode(digitLled, OUTPUT);
}
void loop(){
  //LED check
  digitalWrite(digitRled, HIGH);
  digitalWrite(digitLled, HIGH);
  activeLight((int)analogRead(R_LDR),(int)analogRead(L_LDR));
}
void activeLight(int R_val, int L_val){
  int max = R_val > L_val ? R_val : L_val;
  if(R_val < max*(1+0.05) && R_val > max*(1-0.05))
    digitalWrite(R_LED, LOW);
  else
    digitalWrite(R_LED, HIGH);
  if(L_val < max*(1+0.05) && L_val > max*(1-0.05))
    digitalWrite(L_LED, LOW);
  else
    digitalWrite(L_LED, HIGH);
}