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

si tu multiplie un nombre par 1, ca donne quoi à ton avis? :grin:

timerledrouge = timerledverte +(potard*1);//nouveau prog

tu travaille en millisecondes donc il faut multiplier par XXXX
1 ms = 0.001 sec
donc si je calcule bien, tu dois multiplier par 1000 potar pour être bon
si ton décalage doit être de 5s, ca te donne sauf erreur 5000ms

donc on schématise
1- declenchement de la led verte
2- on récup l'instant T en miilis => timerledverte = millis();
3- on récup la valeur du potar =>mesureBrute=analogRead(RVar); mesure=map(mesureBrute,0,1023,0.0,1000.0);
4- on calcule le temps d'allumage de la led rouge => timerledrouge = timerledverte +(potard*1000);
5- on regarde si tout est bon pour allumer la led,
6 en imaginant que la rouge doit s'allumer de suite
if(etat==HIGH & timerledrouge < millis()){
digitalWrite(Ledrouge, HIGH);
}else{
digitalWrite(Ledrouge, LOW);
}

le mieux serait quand même un papier et crayon
tu marque ce qu'il doit se passer
------------détection-----------------
/
oui-------------------------------------non
| |
led verte rien a faire
temps potar donc on boucle
etc...

Je te remercie pour tes explications, j'avance petit à petit.

J'ai donc suivi tes explications à la lettre, en essayant de comprendre, c'est beaucoup plus clair mais ça ne fonctionne pas.

La led verte s'allume sans problème lorsque je coupe l'IR mais la led rouge s'allume uniquement quand le potard est à 0, si je le tourne pour qu'il affiche 2 ça ne marche plus, même si j'attends un bon moment.

Je pense qu'il y a un bug dans mon programme, j'ai dû raté quelque chose.

// 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 sensorValue=0;
long time=0;
int timeHasCome=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;

int val=0;

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


  timerledrouge = timerledverte + (potard*1000);//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,100.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);
//}
  
  }

Ou alors on fait fausse route et au lieu de s'occuper de la led verte on reste indépendant de la led verte mais ont déclenche une action (allume led rouge) lorsque la barrière Infrarouge est déclenché avec comme délai le potard.

Parce que là (bon je suis pas non plus trop calé) mais j'ai passé l'après midi à faire des essais sans que ce soit concluant.

allez avec un truc de ce genre ca devrait le faire.
j'ai viré pas mal de truc comme lcd, la flemme d'en monter un.
j'ai pris un PIR pour le test

const int RVar = A0; //potentiomètre 1 "col"
const int RVar1 = A1; //potentiomètre 2 "fond"
const int RVar2 = A2; // potentiomètre 3 "Travers"
const int photoIR = A3; //cellule mesure de lumière ARCHE
const int Ledverte = 8;
const int Ledrouge = 9;

int timerledverte = 0;
int timerledrouge = 0;

int sensorValue = 0;
long time =0;
int timeHasCome = 0;

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

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

float mesure;
float mesure1;
float mesure2;

//float potard;
//float potard1;
//float potard2;
int potard = 0;
int potard1 = 0;
int potard2 = 0;

unsigned long time1;
unsigned long time2;
int etat;

int val=0;

void setup() {
pinMode (Ledverte, OUTPUT);
pinMode (Ledrouge, OUTPUT);
pinMode (RVar, INPUT);
pinMode (RVar1, INPUT);
pinMode (RVar2, INPUT);
pinMode (photoIR, INPUT);
digitalWrite(Ledverte,LOW);
digitalWrite(Ledrouge,LOW);
Serial.begin(9600);
Serial.println("initialisation PIR");
delay(3000);
}

void loop() {
//mesureBrute=analogRead(RVar);
//mesure=map(mesureBrute,0,1023,0.0,100.0);
mesure = 1;
potard=mesure*10000;
Serial.print("Lecture mesure1 : ");
Serial.print(mesure);
Serial.print("Lecture potar1 : ");
Serial.println(potard);

// Passage pièce devant InfraRouge

mesureIR = digitalRead(photoIR);
if (mesureIR == HIGH) {
//if (mesureIR < seuil) {
Serial.println("Piece detecte");
digitalWrite (Ledverte, HIGH);
timerledverte=millis();
testledrouge();
}

else {
digitalWrite(Ledverte,LOW);
}

}

void testledrouge()
{
Serial.println("Testled rouge");
// Mesure et décalage temps et inscription sur LCD

// Initialisation 1er potard
etat=digitalRead(Ledverte);
Serial.println(etat);
timerledrouge = timerledverte + potard;
Serial.println(timerledrouge);

if(etat==HIGH && timerledrouge > millis()){
digitalWrite(Ledrouge, 1);
}
else
{
digitalWrite(Ledrouge,0);
}

}

Tu sais quoi ?

C'est la première fois que quelqu'un se donne autant de mal pour m'aider sur un forum. Je ne sais vraiment pas comment te remercier !

Je vais donc mettre ton code dans le mien et je te tiens au courant du résultat dès que j'ai fini

Merci encore !

de rien, mais j'ai eu pas mal de coups de main ici au début par de supers membres qui se reconnaitront :wink:
Artouste, skywodd, B@tto, jean francois et j'en oublie
donc, normal de rendre la monnaie.

y a peut être des couacs dans mon code, mon PIR déconne un peu avec un mauvais branchement hier :frowning:

Je test tout et je te tiens au courant. J'espère aussi pouvoir aider les autres par la suite, d'autant que ce projet fait partie d'un projet beaucoup plus ambitieux.

Encore merci.

Demain tu auras mon résultat :wink:

je crois que je me suis un peu vautré sur le code, celui la devrait être mieux

const int RVar = A0; //potentiomètre 1 "col"
const int RVar1 = A1; //potentiomètre 2 "fond"
const int RVar2 = A2; // potentiomètre 3 "Travers"
const int photoIR = A3; //cellule mesure de lumière ARCHE
const int Ledverte = 8;
const int Ledrouge = 9;

//unsigned long time;
unsigned long timerledverte = 0;
unsigned long timerledrouge = 0;

int sensorValue = 0;
long time =0;
int timeHasCome = 0;

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

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

float mesure;
float mesure1;
float mesure2;

//float potard;
//float potard1;
//float potard2;
int potard = 0;
int potard1 = 0;
int potard2 = 0;

unsigned long time1;
unsigned long time2;
int etat;

int val=0;

void setup() {
pinMode (Ledverte, OUTPUT);
pinMode (Ledrouge, OUTPUT);
pinMode (RVar, INPUT);
pinMode (RVar1, INPUT);
pinMode (RVar2, INPUT);
pinMode (photoIR, INPUT);
digitalWrite(Ledverte,LOW);
digitalWrite(Ledrouge,LOW);
Serial.begin(9600);
Serial.println("initialisation PIR");
delay(3000);
}

void loop() {
//mesureBrute=analogRead(RVar);
//mesure=map(mesureBrute,0,1023,0.0,100.0);
mesure = 1;
potard=mesure*10000;
// Serial.print("Lecture mesure1 : ");
// Serial.print(mesure);
// Serial.print("Lecture potar1 : ");
// Serial.println(potard);

// Passage pièce devant InfraRouge

mesureIR = digitalRead(photoIR);
if (mesureIR == HIGH) {
//if (mesureIR < seuil) {
Serial.println("Piece detecte");
digitalWrite (Ledverte, HIGH);
timerledverte = millis();
Serial.print("timerledverte : ");
Serial.println(millis());

timerledrouge = timerledverte + potard;
testledrouge();

}

else {
digitalWrite(Ledverte,LOW);
digitalWrite(Ledrouge,LOW);
timerledverte = 0;
}

}

void testledrouge()
{
Serial.println("Testled rouge");
// Mesure et décalage temps et inscription sur LCD
digitalWrite (Ledverte, HIGH);
// Initialisation 1er potard
etat=digitalRead(Ledverte);
Serial.print("etat led verte :");
Serial.println(etat);

Serial.println(timerledrouge);
while(timerledrouge > millis()){
Serial.println(millis());
Serial.println(timerledrouge);
//if(etat==HIGH && timerledrouge < millis()){
digitalWrite (Ledverte, HIGH);
digitalWrite(Ledrouge, HIGH);

}

}

Je test ça de bonne heure demain matin !

Bon mauvaise nouvelle ça ne fonctionne pas du tout... Lorsque je compile le programme et que je le televerse, outre le fait que le lcd ne fonctionne pas, c'est surtout que les 2 leds sont allumés en continue, l'action des potards ne change rien. Et le passage devant la cellule ne modifie rien du tout.

Je vais donc essayer de prendre quelques morceaux de ton programme pour faire avancer mon mien :smiley:

Edit :

Concernant l'IR, ce n'est pas une IR comme tu dois t'imaginer (0 ou 1) mais c'est un rayon lumineux dirigé vers une photo resistance.

si tu modifie pas certaines choses, les potars ne fonctionnent pas effectivement

//mesureBrute=analogRead(RVar);
//mesure=map(mesureBrute,0,1023,0.0,100.0);
mesure = 1;
potard=mesure*10000;

mais ton truc est pas clair
la led verte s'allume au passage, mais reste t'elle allumée après?
la rouge s'allume quand? après un certain temps ou dès que la verte est allumée?
la rouge s'allume pendant combien de temps?

car d'après tes posts et ton prog,
la verte s'allume à la détection
si la verte est allumée => rouge s'allume pendant valeur du potar

sachant que la verte s'allume à la détection, reste t'elle allumée après?
donc normal que la verte reste allumée pour que la rouge s'allume le temps du potar, puis le temps écoulé, elles s'éteignent.
c'est ce que fait le code que je t'ai passé :wink:
ledverte allumée => timerledverte = millis();
valeur potar = xxx
timerledrouge = timerledverte + (xxx * y); y coef multiplicateur a déterminer
si timerledrouge > millis() => tout reste allumé
si timerledrouge < millis() => tout s'éteint jusqu'au prochain passage.

un conseil, avant de mettre le lcd et tout le basard, fait un truc simple avant avec des retours Serial pour tester les valeurs, tu vas gagner du temps et des cheveux :wink:

Oui effectivement ce n'est pas clair (pour toi :grin:) mais dans ma tête c'est clair :grin: :grin:

Bon alors on va faire simple :

photo resistance eclairé par lazer

si coupure

lampe verte s'allume

voilà ça c'est l'idée.

maintenant j'ajoute un potentiomètre dans le montage relié à une led rouge.

Quand la photoresistance n'est plus eclairé par le laser (donc passage devant), la led verte s'allume et je voudrais que la led rouge s'allume avec un décalage

potentiomètre

detection allumage ledverte ------------>temps potard<-----------------> déclenchement ledrouge

J'ai mis 3 potentiomètres, c'est juste que l'allumage de la led verte va entrainé 3 actions

Est-ce que c'est plus clair ?

alors c'est simple, avec le même sketch et quelques modifs à la fin

const int RVar = A0; //potentiomètre 1 "col"
const int RVar1 = A1; //potentiomètre 2 "fond"
const int RVar2 = A2; // potentiomètre 3 "Travers"
const int photoIR = A3; //cellule mesure de lumière ARCHE
const int Ledverte = 8;
const int Ledrouge = 9;

//unsigned long time;
unsigned long timerledverte = 0;
unsigned long timerledrouge = 0;

int sensorValue = 0;
long time =0;
int timeHasCome = 0;

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

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

float mesure;
float mesure1;
float mesure2;

//float potard;
//float potard1;
//float potard2;
int potard = 0;
int potard1 = 0;
int potard2 = 0;

unsigned long time1;
unsigned long time2;
int etat;

int val=0;

void setup() {
pinMode (Ledverte, OUTPUT);
pinMode (Ledrouge, OUTPUT);
pinMode (RVar, INPUT);
pinMode (RVar1, INPUT);
pinMode (RVar2, INPUT);
pinMode (photoIR, INPUT);
digitalWrite(Ledverte,LOW);
digitalWrite(Ledrouge,LOW);
Serial.begin(9600);
Serial.println("initialisation PIR");
delay(3000);
}

void loop() {
mesureBrute=analogRead(RVar);
mesure=map(mesureBrute,0,1023,0.0,100.0);
// mesure = 1;
potard=mesure*10000;
Serial.print("Lecture mesure1 : ");
Serial.print(mesure);
Serial.print("Lecture potar1 : ");
Serial.println(potard);

// Passage pièce devant InfraRouge

mesureIR = digitalRead(photoIR);

if (mesureIR < seuil) {
Serial.println("Piece detecte");
digitalWrite (Ledverte, HIGH);
timerledverte = millis();
Serial.print("timerledverte : ");
Serial.println(millis());

timerledrouge = timerledverte + potard;
testledrouge();

}

else {
digitalWrite(Ledverte,LOW);
digitalWrite(Ledrouge,LOW);
timerledverte = 0;
}

}

void testledrouge()
{
Serial.println("Testled rouge");
// Mesure et décalage temps et inscription sur LCD
// Initialisation 1er potard
etat=digitalRead(Ledverte);
Serial.print("etat led verte :");
Serial.println(etat);
delay(2000);
digitalWrite (Ledverte, LOW); on éteint la led verte

if(timerledverte > 0){
Serial.println(timerledrouge);

if(timerledrouge > millis()){
digitalWrite(Ledrouge, LOW);
}else{
digitalWrite(Ledrouge, HIGH);

}
}

}
}

Je ne veux pas abuser de ta patience ni de ta gentillesse mais j'ai une erreur de compilation et j'ai beau essayé toutes les solutions (à mon niveau) mais rien à faire.

suffit de rechercher les erreurs :slight_smile: je me suis gauffré aussi dans le raisonnement 8)
bon celui la fonctionne impec

détection => led verte pendant 2s => après temps XX du potar => allumage de la rouge => tant que valeur potard >0 led rouge allumée
si valeur potard = 0 => led rouge off => timerledverte = 0
et on attend le détection suivante

A toi de mettre la valeur du potard en place

const int RVar = A0; //potentiomètre 1 "col"
const int RVar1 = A1; //potentiomètre 2 "fond"
const int RVar2 = A2; // potentiomètre 3 "Travers"
const int photoIR = A3; //cellule mesure de lumière ARCHE
const int Ledverte = 8;
const int Ledrouge = 9;

//unsigned long time;
unsigned long timerledverte = 0;
unsigned long timerledrouge = 0;

int sensorValue = 0;
long time =0;
int timeHasCome = 0;

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

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

float mesure;
float mesure1;
float mesure2;

//float potard;
//float potard1;
//float potard2;
int potard = 0;
int potard1 = 0;
int potard2 = 0;

unsigned long time1;
unsigned long time2;
int etat;

int val=0;

void setup() {
pinMode (Ledverte, OUTPUT);
pinMode (Ledrouge, OUTPUT);
pinMode (RVar, INPUT);
pinMode (RVar1, INPUT);
pinMode (RVar2, INPUT);
pinMode (photoIR, INPUT);
digitalWrite(Ledverte,LOW);
digitalWrite(Ledrouge,LOW);
Serial.begin(9600);
Serial.println("initialisation PIR");
delay(3000);
}

void loop() {
//mesureBrute=analogRead(RVar);
// mesure=map(mesureBrute,0,1023,0.0,100.0);
mesure = 1;
potard=mesure*1000;
Serial.print("Lecture mesure1 : ");
Serial.print(mesure);
Serial.print("Lecture potar1 : ");
Serial.println(potard);

// Passage pièce devant InfraRouge

mesureIR = digitalRead(photoIR);

if (mesureIR == HIGH) {
Serial.println("Piece detecte");
digitalWrite (Ledverte, HIGH);
timerledverte = millis();
Serial.print("timerledverte : ");
Serial.println(millis());

timerledrouge = timerledverte + potard;

}

else {
digitalWrite(Ledverte,LOW);
//digitalWrite(Ledrouge,LOW);
//timerledverte = 0;
}
testledrouge();

}

void testledrouge()
{
Serial.println("Testled rouge");
// Mesure et décalage temps et inscription sur LCD
// Initialisation 1er potard
etat=digitalRead(Ledverte);
Serial.print("etat led verte :");
Serial.println(etat);
delay(2000);
digitalWrite (Ledverte, LOW);// on éteint la led verte

if(timerledverte > 0){
Serial.print("timerledrouge : ");
Serial.println(timerledrouge);
Serial.print("milli : ");
Serial.println(millis());
if(timerledrouge > millis()){
digitalWrite(Ledrouge, LOW);

}else{
while(potard > 0){
potard--;
Serial.println(potard);
digitalWrite(Ledrouge, HIGH);
timerledverte = 0;
}
digitalWrite(Ledrouge,LOW);
}
}

}

Bon désolé de te decevoir surtout vu le mal que tu te donnes...

La barrière infrarouge ne réagit plus en temps réél. il n'aurait pas fallu touché au niveau de la led verte, tout était ok pour ça.

Peut-être que je vois trop compliqué pour le moment avec les potar, on est peut être mieux d'utiliser des boutons poussoirs ?

on monterait et on descendrait le temps directement. Parce que là j'ai beau tout essayé, je me heurte toujours au même problème

gunsman76:
Bon désolé de te decevoir surtout vu le mal que tu te donnes...

La barrière infrarouge ne réagit plus en temps réél. il n'aurait pas fallu touché au niveau de la led verte, tout était ok pour ça.

Peut-être que je vois trop compliqué pour le moment avec les potar, on est peut être mieux d'utiliser des boutons poussoirs ?

on monterait et on descendrait le temps directement. Parce que là j'ai beau tout essayé, je me heurte toujours au même problème

je crois que tu es surtout paumé si on modifie un peu ton code :wink:
regardes bien

if (mesureIR == HIGH) {

mets ceci pour retrouver ta détection

if (mesureIR < seuil) {

je modifie en fonction du matos que j'ai sous la main aussi, donc je vire ce qui me sers pas ou le modifie, à toi de le ré-adapter.

Oui j'avoue :cold_sweat:

Au début j'ai bien assimiler dans le démarrage de mon code, car j'ai analyser puis écrit en comprenant ce que je faisais. Quand j'ai demandé de l'aide j'ai commencé à faire du copier/collé d'action que je ne comprenais pas.

Mais je me rends surtout compte que l'idée du potar paraissait une bonne idée car c'était sur le papier la plus simple, on tourne un bouton pour augmenter le temps, on le baisse pour baisser le temps. Mais quand je vois le mal à programmer le code, je me demande si en mettant des boutons on gagnerait pas du temps pour incrémenter et décrémenter la valeur de décalage.

Tu en pense quoi ?

Bon je refais un essai avec ton code

La led verte s'allume 2 seconde s'eteind puis la led rouge s'allume etc...

mais la detectionIR ne fonctionne pas. Je m'arrache les cheveux !

peut être une erreur de pin sur ton montage