Photorésistance plus sensible

Bonjour à tous et une fois de plus j'ai besoin de vos lumières...

J'ai réalisé un petit montage, un laser rouge qui pointe vers une photo resistance. Celle ci est relié à l'arduino avec une resistance de 10ko. Lorsque je coupe le faisceau franchement, le top est detecté par l'arduino, mais si la coupure est trop brève, malgré un réglage du programme très sensible, celle-ci ne detecte pas l'objet.

Pensez vous que la photoresistance est assez rapide pour faire la détection de la coupure du faisceau ou vaudrait il mieux que je place une photodiode dans mon montage ?

Merci

Avoir le code sous nos yeux peut être utile, mais bon..

Peut être que l'arduino perd du temps avec la conversion ADC ? Possible, mais si tu veut de l'efficacité je te conseil d'utiliser de l'infrarouge avec un photo-transitor comme sa tu aura des valeurs booléenne et comme sa on evite de faire bosser le pauvre arduino

Voilà le code, désolé ce n'est pas du très pro...

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
const int RS=2;
const int E=3;
const int D4=4;
const int D5=5;
const int D6=6;
const int D7=7;

const int RVar=0;
const int RVar1=1;
const int RVar2=2;

const int photoIR=3;

int mesureIR=0; //Infrarouge
int mesureBrute=0; // Potard

int seuil=1000; //Infrarouge seuil 

float mesure;
float temperature;

LiquidCrystal lcd(RS,E,D4,D5,D6,D7);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  lcd.clear();
  delay(10);
  // Print a message to the LCD.
  lcd.print("Piochel 2013");
  delay(1000);
  lcd.clear();
  delay (10);
   lcd.print("test en cours...");
  delay(2000);
  lcd.clear();
  delay (10);
  
  Serial.begin(115200);
  
}

void loop() {

  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,5000.0);
  
  //lcd.clear();
  //delay(5);
  
  lcd.home();
  lcd.print("1");
  lcd.setCursor(6,0);
  lcd.print("2");
  lcd.setCursor(13,0);
  lcd.print("3");
  
  temperature=mesure/10.0;
  lcd.setCursor(1,1);
  lcd.print(temperature,0);
  delay(200);
  
  //2e potard
  
  mesureBrute=analogRead(RVar1);
  mesure=map(mesureBrute,0,1023,0.0,5000.0);
  
  temperature=mesure/10.0;
  lcd.setCursor(7,1);
  lcd.print(temperature,0);
  delay(100);
  
  //3e potard

  
  mesureBrute=analogRead(RVar2);
  mesure=map(mesureBrute,0,1023,0.0,5000.0);
  
  temperature=mesure/10.0;
  lcd.setCursor(13,1);
  lcd.print(temperature,0);
  delay(100);
  
  mesureIR=analogRead(photoIR);
  Serial.println(mesureIR);
  if (mesureIR<seuil) Serial.println("Piece detecte");
  delay(50);
  
}

Bonsoir
Il faudrait verifier les valeurs de 'temps de réponse' dans la doc de la photo résistance utilisée et comparer avec les durées de coupure de faisceau à détecter mais en général c'est pour une photoresistance de plusieurs dizaines de millisecondes -> pas véritablement adapté pour une détection de coupure 'brève' d'un faisceau.

Il faudrait donc que j'utilise une photodiode ?

Faudrait déjà virer le delay(50) qui plombe le truc !

A je vais essayé sans alors !

Alors si je supprime tous les delay du programme ça fonctionne parfaitement, trop parfaitement... il me detecte plusieurs passages pour un passage en fonction de la vitesse à laquelle l'objet passe le faisceau !!!

Existe t'il une ligne de code à ajouté pour régler ce soucis ?

Voilà corrigé :

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
const int RS=2;
const int E=3;
const int D4=4;
const int D5=5;
const int D6=6;
const int D7=7;

const int RVar=0;
const int RVar1=1;
const int RVar2=2;

const int photoIR=3;

int mesureIR=0; //Infrarouge
int mesureBrute=0; // Potard

int seuil=100; //Infrarouge seuil 

float mesure;
float temperature;

LiquidCrystal lcd(RS,E,D4,D5,D6,D7);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  lcd.clear();
  delay(10);
  // Print a message to the LCD.
  lcd.print("Piochel 2013");
  delay(1000);
  lcd.clear();
  delay (10);
   lcd.print("test en cours...");
  delay(2000);
  lcd.clear();
  delay (10);
  
  Serial.begin(115200);
  
}

void loop() {

  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,5000.0);
  
  //lcd.clear();
  //delay(5);
  
  lcd.home();
  lcd.print("Col");
  lcd.setCursor(6,0);
  lcd.print("Fond");
  lcd.setCursor(13,0);
  lcd.print("Tra");
  
  temperature=mesure/10.0;
  lcd.setCursor(1,1);
  lcd.print(temperature,0);
  //delay(200);
  
  //2e potard
  
  mesureBrute=analogRead(RVar1);
  mesure=map(mesureBrute,0,1023,0.0,5000.0);
  
  temperature=mesure/10.0;
  lcd.setCursor(7,1);
  lcd.print(temperature,0);
  //delay(100);
  
  //3e potard

  
  mesureBrute=analogRead(RVar2);
  mesure=map(mesureBrute,0,1023,0.0,5000.0);
  
  temperature=mesure/10.0;
  lcd.setCursor(13,1);
  lcd.print(temperature,0);
  //delay(100);
  
  mesureIR=analogRead(photoIR);
  //Serial.println(mesureIR);
  if (mesureIR<seuil) Serial.println("Piece detecte");
  //delay(10);

Sinon, il y a les balises 'code', pour une meilleure lisibilité: le bouton '#' de l'éditeur de commentaire :slight_smile:

S'il y a plusieurs detection c'est qu'il y a un effet de rebond. Il y a plusieurs methode : la plus simple, celle que tu utilisais sans faire exprès c'est à dire ajouter un delay() le temps que "la tempête passe". Dans ton cas ça peut suffire, il faut juste trouver la bonne valeur qui donne une réponse tout en limitant l'effet de rebond. Après il y a la méthode hardware : un condensateur tout seul ou un RC.

Dilemme :
Réagir "instantanément" ou éviter les "rebonds"

Quel que soit le moyen utilisé (la solution matérielle a bien sûr ma préférence :grin:), il ne sera pas possible de satisfaire à ce dilemme à partir du moment où on ne peut pas supprimer les phénomènes transitoires.

Pour moi la bonne question est : quel est le temps de réponse minimal dont on a besoin : la milliseconde où la seconde.
Après, voir le choix du moyen.

ATTENTION, ce n'est pas des rebonds au sens mécanique de la chose. C'est juste que le passage devant la barrière optique est relativement lent par rapport au temps d'exécution de la boucle principale et que celle-ci est parcourue plusieurs fois avant que le faisceau soit rétabli.

Suivant le besoin de l'application, il faut:
soit attendre que le faisceau soit rétabli avant de déclencher une nouvelle alarme
soit mettre en place un comptage pour redéclencher une nouvelle alarme si le faisceau est interrompu trop longtemps (signalement d'une panne potentielle du capteur)

J'aimerais bien la première solution, attendre que le faisceau soit rétabli pour relancer la mesure.

Quel commande puis-je utiliser ?

Sinon en supprimant la fonction delay, le programme est beaucoup plus réactif !

Dès qu'un petit objet passe, c'est détecté.

schizophrene:
Sinon, il y a les balises 'code', pour une meilleure lisibilité: le bouton '#' de l'éditeur de commentaire :slight_smile:

C'est fait merci et c'est beaucoup plus lisible pour tout le monde !

Bonjour,

gunsman76:
Quel commande puis-je utiliser ?

Ajoute une boucle d'attente (active) :

mesureIR = analogRead(photoIR);
if (mesureIR < seuil) 
  Serial.println("Piece detecte");

do {
  mesureIR = analogRead(photoIR);
} while(mesureIR < seuil);

Voilà c'est nettement mieux !!!

Le code :

#include <LiquidCrystal.h>

// initialisation librairie LCD
const int RS=2;
const int E=3;
const int D4=4;
const int D5=5;
const int D6=6;
const int D7=7;

const int RVar=0; //potentiomètre 1 "col"
const int RVar1=1; //potentiomètre 2 "fond"
const int RVar2=2; // potentiomètre 3 "Travers"

const int photoIR=3; //cellule mesure de lumière ARCHE

const int Led=8;
const int Ledrouge=9;

int mesureIR=0; //Infrarouge initialisation
int mesureBrute=0; // Potard initialisation

int seuil=600; //Infrarouge seuil sensiblité passage pièce

float mesure;
float potard;

LiquidCrystal lcd(RS,E,D4,D5,D6,D7);

void setup() {
  // set up LCD indication nb colonne et case: 
  lcd.begin(16, 2);
  lcd.clear();
  delay(10);
  // Print a message to the LCD.
  lcd.print("Piochel 2013");
  delay(1000);
  lcd.clear();
  delay (10);
   lcd.print("Initialisation...");
  delay(2000);
  lcd.clear();
  delay (10);
  
  pinMode (Led, OUTPUT);
  pinMode (Ledrouge, OUTPUT);
  
  Serial.begin(115200);
  
}

void loop() {

  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
  
  //lcd.clear();
  //delay(5);
  
  lcd.home();
  lcd.print("Col");
  lcd.setCursor(6,0);
  lcd.print("Fond");
  lcd.setCursor(13,0);
  lcd.print("Tra");
  
  //1er potard
  
  potard=mesure/10.0;
  lcd.setCursor(0,1);
  lcd.print(potard,0);
  //delay(200);
  
  //2e potard
  
  mesureBrute=analogRead(RVar1);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
  
  potard=mesure/10.0;
  lcd.setCursor(7,1);
  lcd.print(potard,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");
  //delay(100);
  
  //3e potard

  
  mesureBrute=analogRead(RVar2);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
  
  potard=mesure/10.0;
  lcd.setCursor(13,1);
  lcd.print(potard,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");
  //delay(100);
  
  mesureIR=analogRead(photoIR);
  if (mesureIR<seuil) {//Serial.println("Piece detecte");
  digitalWrite (Led, HIGH);
  }
  else {
    digitalWrite(Led,LOW);
  }
  
  do {
    mesureIR = analogRead(photoIR);
  } while(mesureIR < seuil);
  
  
 //  if (mesureIR<seuil) {//Serial.println("Piece detecte");
 // digitalWrite (Ledrouge, HIGH);
 // }
 // else {
 //   digitalWrite(Ledrouge,LOW);
 // }
 // delay(Rvar2);
  
}