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

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

Non ça n'a pas bougé depuis le début.

Bon je vais refaire le montage complet , j'ai un autre arduino.

On va faire plus simple, j'adapterais ensuite pour mon cas.

Alors j'ai une photoresistance connecté en A5

un potentiomètre connecté en A0

un laser éclair la photoresistance me donnant une valeur de 1000.

lorsque je coupe le laser, la photoresistance passe à une valeur de 0

maintenant jaimerais que le passage de la photoresistance à 0 déclenche une action à X seconde(s)

X étant la valeur de potentiomètre qui va de 0 à 1023. (on met en place une fonction map pour réduire le temps de 0 à 100.

Voilà est-ce que c'est plus clair ?

heu dans le code

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

et non A5

après suffit de décommenter et commenter comme ceci

void loop() {
mesureBrute=analogRead(RVar);
mesure=map(mesureBrute,0,1023,0.0,100.0);
// mesure = 1;
potard=mesure*1000; // a modifier suivant le délais a atteindre 1000 = 1s

puis

if (mesureIR < seuil) { // seuil = 500

par

if (mesureIR = 0) { // tu peux aussi mettre une valeur au dessus

donc bien une question de pin déjà :wink:
essaie de lire un peu mieux le code aussi

Bon je ne vais pas t'embeter plus, tu as déjà perdu beaucoup de temps avec mon problème.

Je vais essayer de reprendre tout depuis le début, et surtout bien analyser pourquoi ça ne marche pas.

déjà fait un test tout bête avec ta cellule pour voir si elle fonctionne bien.

dans le sketch donné, remplace par un bouton poussoir afin de la simuler.
mais le code fonctionne très bien avec un détecteur pir.

Avec le programme d'origine, ça fonctionne parfaitement, quand j'ai une detection de passage devant la cellule, la led verte s'allume parfaitement.

Le problème c'est de lancer une action a X seconde derrière l'allumage de la led verte

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.

C'est pas la manière de saisir les consignes qui complique ou ralenti le code c'est les ajouts successifs non maitrisés.
La saisie du temps par les potentiomètres et d'ailleurs plus simple que la saisie par des boutons.
Il faut juste mettre le montage de coté, prendre une feuille de papier et décrire pas à pas ce que doit faire ton programme. Comment sont utilisées les commandes les paramètres qu'elles fournissent et ce que le programme en fait. Tu vas voir, c'est magique après cela ira tout seul.

C'est peut-être parce qu'on se complique trop la vie.

Parce que le problème est très simple

1 pièce passe devant le capteur --> allumage led verte ---> attente Nb secondes ---> allumage led rouge

c'est juste un décalage d'action, décalage que je dois controler

Dur dur....

en mettant une valeur en dur pour le potar, chez moi ca fonctionne.
donc, je dirais une mauvaise lecture du potar avec un truc style 2.00 qui fout tout par terre dans le millis.
c'est pas un float qu'il faut pour initialiser le potar mais un int vu que tu vas jusqu'à 100.