Utiliser valeur du potentiomètre pour décaler une action

Voilà mon petit programme avance,

J'ai un barrière laser rouge qui lorsqu'elle est coupé déclenche l'allumage d'une led. J'ai installé un potentiomètre qui me permet d'afficher sur le LCD un nombre qui va de 0 à 100. J'aimerais récupérer le résultat de cet affichage pour allumé une autre led avec un décalage dans le temps de 0 à 100 secondes.

Comment procédé ?

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

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

int seuil=100; //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);
  
  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);
  }
  //delay(10);
  
}

j'ajouterais donc une LED sur le pin 8

Impératif, il ne faut pas bloquer le déclenchement d'un second passage avec une fonction delay.

Est-ce possible ?

J'ai édité le premier post comme c'est un peu plus clair...

bonjour,

J'ai installé un potentiomètre qui me permet d'afficher sur le LCD un nombre qui va de 0 à 100. J'aimerais récupérer le résultat de cet affichage pour allumé une autre led avec un décalage dans le temps de 0 à 100 secondes.

je dirais que tu écris un code sans en comprendre son fonctionnement.
tu crois pas que tu peux récupérer quelque chose la dedans?

mesureBrute=analogRead(RVar);
mesure=map(mesureBrute,0,1023,0.0,1000.0);

Non justement j'essaie d'éviter de récuperer des bouts de code à droite à gauche, tout ce que j'ai mis dans mon code, je l'ai compris.

mesureBrute=analogRead(RVar);
mesure=map(mesureBrute,0,1023,0.0,1000.0);

je récupère une mesure de 0 à 1000 que je redivise par 10 si tu regardes bien mon programme.

Maintenant que j'ai mesure et c'est là que je bloque.

Comment récupérer cette mesure pour décaler l'allumage d'une seconde led.

Led A sur pin 8 s'allume
Led B sur pin 9 s"allume avec décalage de la valeur récupérer sur le potentiomètre (donc de 0 à 100 secondes)

Sans bloquer le programme, car un autre déclenchement doit pouvoir être enregistré et décalé

gunsman76:
Non justement j'essaie d'éviter de récuperer des bouts de code à droite à gauche, tout ce que j'ai mis dans mon code, je l'ai compris.

mesureBrute=analogRead(RVar);
mesure=map(mesureBrute,0,1023,0.0,1000.0);

je récupère une mesure de 0 à 1000 que je redivise par 10 si tu regardes bien mon programme.

Maintenant que j'ai mesure et c'est là que je bloque.

Comment récupérer cette mesure pour décaler l'allumage d'une seconde led.

Led A sur pin 8 s'allume
Led B sur pin 9 s"allume avec décalage de la valeur récupérer sur le potentiomètre (donc de 0 à 100 secondes)

Sans bloquer le programme, car un autre déclenchement doit pouvoir être enregistré et décalé

tu récupère dans une variable les millis() de la première led et tu ajoute ton décalage.

unsigned long time1;
unsigned long time2;
unsigned long time3;

si led allumée
time1 = millis();
alors
time2 = time1 + valeur_a_ajouter;
si time2 == millis();
allumer led2
etc.....

Ok merci j'étais justement en train de regarder cette fonction milli() !

Alors :

time2 = time1 + valeur_a_ajouter;

Et la valeur à ajouté je déclare :

mesureBrute=analogRead(RVar2);
mesure=map(mesureBrute,0,1023,0.0,1000.0);

potard=mesure/10.0;

donc time2 = time1 + (potard)

C'est ça ?

heu si je me trompe pas, tu vas te retrouver avec une valeur float dans le potar vu que tu le divise par 10.
pour le lcd ca va le faire mais pas pour millis()

sinon, oui c'est le principe.

Oui donc je vais modifier la fonction map pour éviter la division par 10

Par contre je rame quand même.

 time1=analogRead(Led);
    if (time1=milli()); {
      time2=time1+(potard);
    }

Bon cet après midi j'ai du boulot, mais je vais me mettre au codage juste après pour sortir quelque chose de propre. Faut que j'essaie par moi même pour bien comprendre

Juste une petite chose :

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(" ");

J'ai fait ce code là, il m'affiche le pourcentage sur le LCD comme je le souhaite.

Maintenant pour déclencher l'allumage de la Led2, le mieux c'est de continuer le code à ce niveau là ou je recommence à coder à la fin du programme et je recommence la mesureBrut etc... ?

gunsman76:
Oui donc je vais modifier la fonction map pour éviter la division par 10

Par contre je rame quand même.

 time1=analogRead(Led);

if (time1=milli()); {
      time2=time1+(potard);
    }

millis() renvoi l nb de millisecondes depuis le début du programme.
comment veux tu comparer millis() avec un analogRead ? :grin:
regardes bien mon post au dessus

Je suis un peu perdu...

Je vais potasser, potasser et encore potasser

Désolé tu as devant toi un boulet... :frowning:

Je te remercie de ta patience.

si led allumée
time1 = millis();
alors
time2 = time1 + valeur_a_ajouter;
si time2 == millis();
allumer led2
etc.....

J'ai commencé par remettre mon code dans l'ordre pour mieux visualiser :

1 toutes les déclarations
2 initialisation de la barrière IR
3 initialisation des potentiomètres

Et maintenant je vais pouvoir attaquer le décalage dans le temps.

// include the library 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=500; //Infrarouge seuil sensiblité passage pièce

float mesure;
float potard;

unsigned long time1;
unsigned long time2;

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() {


// Passage pièce devant InfraRouge  

  
   mesureIR=analogRead(photoIR);
  if (mesureIR<seuil) {//Serial.println("Piece detecte");
  digitalWrite (Led, HIGH);
  }
    
  else {
    digitalWrite(Led,LOW);
  }
  
  do {
    mesureIR = analogRead(photoIR);
  } while(mesureIR < seuil);
  
  
// Mesure et décalage temps et inscription sur LCD 
  
// initialisation LCD  
  
  
  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
  
  
  lcd.home();
  lcd.print("Col");
  lcd.setCursor(6,0);
  lcd.print("Fond");
  lcd.setCursor(13,0);
  lcd.print("Tra");
  
// Initialisation 1er potard
  
  potard=mesure/10.0;
  lcd.setCursor(0,1);
  lcd.print(potard,0);
  
   
// Initialisation 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(" ");
  
  
// Initialisation 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(" ");

voilà mon code, après plusieurs essai, la led verte s'allume correctement mais la led rouge reste éteinte.

Lorsque j'applique la map :

mesure=map(mesureBrute,0,1023,0.0,100.0);

est-ce que c'est bien interprété comme une mesure de temps le 0 à 100 ?

time1=millis();

if (analogRead(Ledverte) == HIGH);
  
  if (time2=time1 + (potard)); else digitalWrite(Ledrouge, HIGH);

Voilà autre code mais toujours pas d'allumage

int etat;
etat=analogRead(Ledverte);

if(etat==HIGH){
  digitalWrite(Ledrouge, HIGH);
  
  
  int temps;
  
  if(millis()+potard1)
    digitalWrite(Ledrouge, HIGH);
  }

voilà j'ai avancé !!!!

la led verte s'allume, immédiatement la led rouge s'allume puis s'éteint !!

int etat;

etat=digitalRead(Ledverte);

if(etat==HIGH){
  digitalWrite(Ledrouge, HIGH);
}
else
{
  digitalWrite(Ledrouge, LOW);
  
  }

au lieu de mettre des bouts de codes comme ca, mets ton code entier.
déjà ca veut rien dire ce que tu écris

if(millis()+potard1)

Oups, je pensais que c'était plus facile de mettre les modifs.

Voilà le code :

// include the library 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 Ledverte=8;
const int Ledrouge=9;

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

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

float mesure;
float potard;
float potard1;
float potard2;

unsigned long time1;
unsigned long time2;
int etat;

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 (Ledverte, OUTPUT);
  pinMode (Ledrouge, OUTPUT);
  
  Serial.begin(115200);
  
}

void loop() {

  
// initialisation LCD  
  
  
  lcd.home();
  lcd.print("Col");
  lcd.setCursor(6,0);
  lcd.print("Fond");
  lcd.setCursor(13,0);
  lcd.print("Tra");
  
  
// Passage pièce devant InfraRouge  

  
   mesureIR=analogRead(photoIR);
  if (mesureIR<seuil) {//Serial.println("Piece detecte");
  digitalWrite (Ledverte, HIGH);
  }
    
  else {
    digitalWrite(Ledverte,LOW);
  }
  
  do {
    mesureIR = analogRead(photoIR);
  } while(mesureIR < seuil);
  
  
// Mesure et décalage temps et inscription sur LCD 

  
// Initialisation 1er potard
  
   
  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,100.0);
  
  potard=mesure;
  lcd.setCursor(0,1);
  lcd.print(potard,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");

// nouveau programme test

//int temps;
//int test=0;

//if(millis()+(potard)) {
// test=0;
// }else{
//  digitalWrite(Ledrouge,HIGH);
  
//}
   
// Initialisation 2e potard
  
  mesureBrute=analogRead(RVar1);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
  
  potard1=mesure/10.0;
  lcd.setCursor(7,1);
  lcd.print(potard1,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");
  
  
// Initialisation 3e potard

  
  mesureBrute=analogRead(RVar2);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
  
  potard2=mesure/10.0;
  lcd.setCursor(13,1);
  lcd.print(potard2,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");

  
// Decalage des ouvertures electrovanne

int etat;

etat=digitalRead(Ledverte);

if(etat==HIGH){
  digitalWrite(Ledrouge, HIGH);
}
else
{
  digitalWrite(Ledrouge, LOW);
  
  }


}

Donc là tout fonctionne, il me manque juste a faire en sorte que lorsque la led verte s'allume, il faut que la led rouge s'allume en décalage en fonction de la position du potentiomètre (s'il est à 0=0secondes, s'il est ouvert à fond = 100 secondes)

Merci pour ton aide précieuse

tu peux faire un truc de ce genre, mais j'ai pas relus tout le post pour voir si tu dois allumer pendant X secondes la led ou pas

etat=digitalRead(Ledverte);
timerledverte = millis();

//lecture du potar
ton code potar ici
//fin lecture potar
timerledrouge = timerledverte + (potar*XXXX); //XXXX etant le temps a multiplier pour les millisecondes en plus
if(etat==HIGH & timerledrouge < millis()){ //tant que timerledrouge inférieur au temps prévu on allume la led rouge
digitalWrite(Ledrouge, HIGH);
}
else
{
digitalWrite(Ledrouge, LOW);

}

Ouf je m'arrache les cheveux mais là ça fonctionne a peu près, merci pour tes précieux conseils.

Bon alors à peu près, car le temps entre l'allumage de la led verte et l'allumage de la led rouge ne doit pas être en seconde.

Si je mets à 0 le potard, l'allumage se fait aussitôt, si je décale un peu le potentiomètre j'attends mais rien ne se passe...

// include the library 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 Ledverte=8;
const int Ledrouge=9;

int timerledverte=0;
int timerledrouge=0;


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

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

float mesure;
float potard;
float potard1;
float potard2;

unsigned long time1;
unsigned long time2;
int etat;

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 (Ledverte, OUTPUT);
  pinMode (Ledrouge, OUTPUT);
  
  Serial.begin(115200);
  
}

void loop() {

  
// initialisation LCD  
  
  
  lcd.home();
  lcd.print("Col");
  lcd.setCursor(6,0);
  lcd.print("Fond");
  lcd.setCursor(13,0);
  lcd.print("Tra");
  
  
// Passage pièce devant InfraRouge  

  
   mesureIR=analogRead(photoIR);
  if (mesureIR<seuil) {//Serial.println("Piece detecte");
  digitalWrite (Ledverte, HIGH);
  }
    
  else {
    digitalWrite(Ledverte,LOW);
  }
  
  do {
    mesureIR = analogRead(photoIR);
  } while(mesureIR < seuil);
  
  
// Mesure et décalage temps et inscription sur LCD 

  
// Initialisation 1er potard
  etat=digitalRead(Ledverte);
  timerledverte=millis();
   
  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
  
  potard=mesure;
  lcd.setCursor(0,1);
  lcd.print(potard,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");
  
  timerledrouge = timerledverte +(potard*1);//nouveau prog
  if(etat==HIGH & timerledrouge < millis()){//nouveau prog
    digitalWrite(Ledrouge, HIGH);//nouveau prog
  }//nouveau prog
  
  else//nouveau prog
  {//nouveau prog
  digitalWrite(Ledrouge,LOW);//nouveau prog
  }//nouveau prog
  
  
// nouveau programme test

//int temps;
//int test=0;

//if(millis()+(potard)) {
// test=0;
// }else{
//  digitalWrite(Ledrouge,HIGH);
  
//}
   
// Initialisation 2e potard
  
  mesureBrute=analogRead(RVar1);
  mesure=map(mesureBrute,0,1023,0.0,1000.0);
  
  potard1=mesure/10.0;
  lcd.setCursor(7,1);
  lcd.print(potard1,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");
  
  
// Initialisation 3e potard

  
  mesureBrute=analogRead(RVar2);
  mesure=map(mesureBrute,0,1023,0.0,100.0);
  
  potard2=mesure;
  lcd.setCursor(13,1);
  lcd.print(potard2,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");

  
// Decalage des ouvertures electrovanne

//int etat;

//etat=digitalRead(Ledverte);

//if(etat==HIGH){
//  time1=millis();
//  if (time2=time1++(potard));
  
//  digitalWrite(Ledrouge, HIGH);
//}
//else (millis() + (potard1))

//  digitalWrite(Ledrouge, LOW);
//}
  
  }

Je pense que ça vient de ma fonction map qui ne doit pas traduire en secondes

Tu m'avais noté dans ton morceau de code potard*XXXX, hors justement je ne veux pas faire intervenir de XXXX mais récupérer la valeur du potard qui doit décalé le temps.

Exemple si sur l'écran LCD j'ai 10, ça doit décalé l'allumage de la led rouge une fois la led verte allumé de 10 secondes.