Interruption et lecture analogique

Bonjour, ça fait un moment que j'ai pas poster ici, et pour cause je me suis lancé dans le HTML et CSS (C'est sympa)
Mais cette apres-midi, alors que je tournais un peu en rond j'ai décidé d'utiliser un peu mon arduino, sans projet particulier !

J'ai donc d'un coté un tcrt-5000 (capteur infrarouge) et un neo-pixel ring 16 !
Le but étant d'essayer d'en faire un pseudo avertisseur d'obstacle...

J'ai donc une lecture analogique de mon capteur (de 1000 à 29) et le but serais que tant que la lecture est au dessus de 400, tout reste éteint, en dessous ça déclenche une routine qui reste allumé TANT QUE la lecture est inférieur à 400...

Seulement, une fois que la routine ce lance, le capteur n'a plus la main, et je ne sais pas si la routine à un temps aléatoire ou pas !

Mon capteur est câblé :
EMETTEUR : +5V ---> 100 Ohm ---> led ---> GND
RECEPTEUR : +5V ---> 4700 Ohm ---> led ---> GND
|
|
A0

Et le code est le suivant :

#include <Adafruit_NeoPixel.h>

#define PIN 6

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(16, PIN);
int tcrt;

void setup(){
  Serial.begin(9600);
  pixels.begin();
  pixels.show(); // Eteint tout les pixels
}

void loop(){
  tcrt = analogRead(A0); // lecture du tcrt
  Serial.println(tcrt);
  while(tcrt <400){  // Tant que la lecture est INFERIEUR à 400, lire l'instruction.
   multicolor();
  }

  if(tcrt >500){ // Si la lecture passe au dessus de 500, éteindre les pixels.
    pixels.show();
  }
}


void multicolor(){
   uint8_t  i;
   uint32_t t;
   int a;
   int b;
   int c;
   int e;
   i = random(16);
   a = random(255);
   b = random(255);
   c = random(255);
   pixels.setPixelColor(i, a, b, c); // Pour (i)la position du pixel de 0 à 15 (a)valeur de rouge (b)valeur de vert (c)valeur de bleu.
   pixels.show();
   delay(50);
   pixels.setPixelColor(i, 0); // Eteint chaque pixel après son allumage, permet d'afficher un unique pixel à la fois.
}

Donc là, c'est bien éteint de base, puis, dès que j'approche la main, les pixels clignotes de façon (pseudo)aléatoire, mais ne s'éteigne uniquement après X temps (indéterminé) et pas au retrait de l'obstacle du capteur...

Existe t'il une astuce pour pouvoir garder la lecture analogique mais permettre une interruption ?

Bizounours:

void loop(){

tcrt = analogRead(A0); // lecture du tcrt
  Serial.println(tcrt);
  while(tcrt <400){  // Tant que la lecture est INFERIEUR à 400, lire l'instruction.
   multicolor();
  }

Dans le while tu ne remets pas à jour tcrt. Donc tu ne peux pas sortir de cette boucle.

void loop(){
  tcrt = analogRead(A0); // lecture du tcrt
  Serial.println(tcrt);
  while(tcrt <400){  // Tant que la lecture est INFERIEUR à 400, lire l'instruction.
   multicolor();
  tcrt = analogRead(A0); // lecture du tcrt
  }

Merci beaucoup, je suis un peu rouillé !

Ca fonctionne :wink: je vais pouvoir passer à la suite sous peu :smiley:
Merci bien !