Servono due led IR(io ho utilizzato quelli di due vecchi telecomandi), un Arduino ONE, un materiale non trasparente da frapporre i due led ed un display LCD (per esempio quello fornito nello starter kit di arduino).

Il principio di funzionamento è molto semplice:

un led (denominato emettitore) emetterà la radiazione ad infrarosso e verrà collegato ad un qualsiasi pin digitale di arduino, mentre il secondo led (ricevitore) la riceverà e lo collegheremo invece ad un pin analogico settandolo come input per leggere il valore di intensità ricevuto.

Il codice scritto è molto semplice, dapprima si effetuerà la lettura dell'intensità con l'emettitore spento per verificare il contributto dell'ambiente per poi eseguire le letture accendo il led emettitore.

Per il calcolo della distanza, si sono eseguire varie letture a distanze note e si è ricavate l'equazione linearizzata passante i punti trovati. L'equazione è del tipo y=mx+q

 

 

 

#include
LiquidCrystal lcd (12, 11, 5, 4, 3, 2); //indico i pin con cui voglio comunicare
int inputPIN = A2;               // PIN LED RECEIVER
int emitterPIN = 13;             // PIN LED EMETTITER
double minDistanceIntensity = 0; // MAX INTENSITY
float intensity = 0;            // INTENSITY
float distance = 0;             // DISTANCE
double reading = 0;              // ACTUAL READ
float ambient = 0;              // AMBIENT RAEAD
int readings = 1000;             // NUMBER OF READING
float sensore_constante_m = -2.7;
float sensore_constante_q = 124;


void setup()

  lcd.begin(16,2);
  pinMode(inputPIN, INPUT); 
  pinMode(emitterPIN, OUTPUT);
  Serial.begin(9200); 

void getDistance()

  ambient = 0; 
  intensity = 0; 
  digitalWrite(emitterPIN, LOW); // ambient reading
  for(int i = 0; i < readings; i++) { 
    ambient = ambient + analogRead(inputPIN); //AVARAGE
  }
  ambient=ambient/readings;
  digitalWrite(emitterPIN, HIGH); // reading on
  for (int i = 0; i < readings; i++)
  { 
    intensity = intensity + analogRead(inputPIN); 
  }
  intensity = intensity / readings;
  digitalWrite(emitterPIN, LOW);
  if(ambient < intensity) intensity = intensity - ambient; // Filtro luce ambientale
  distance = (intensity-sensore_constante_q)/sensore_constante_m;

void loop()

  long time = millis();
  getDistance();
  Serial.print(1000 / (millis() - time));
  Serial.print(" ");
  Serial.print ("Distance cm:\t");
  Serial.print(distance);
  Serial.print(" ");
  Serial.print ("Intensity:\t");
  Serial.print(intensity); 
  Serial.print(" ");
  Serial.print ("Intensity/Ambient:\t");
  Serial.println(intensity / ambient);
  Serial.print("\n");
  LcdWrite(intensity,distance);
  delay (1000);
}

void LcdWrite (float intensity, float distance)
{
  lcd.setCursor(0,0);
  lcd.print("Intensity'");
  lcd.setCursor(11,0);
  lcd.print(intensity);
  lcd.setCursor(0,1);
  lcd.print("Dist_cm");
  lcd.setCursor(11,1);
  lcd.print(distance);
}