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 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 initialisationint 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 verteif(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
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
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à
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.
a oui, se serait super !
On peut régler le problème comment ?
gunsman76:
a oui, se serait super !On peut régler le problème comment ?
suffit de reprendre le code donné, comme quoi tu comprends pas trop le code.
si tu fixe à 2 la mesure et 1000 le coef, cela fait 2000 en plus sur les millis
en imaginant que le timerledverte se trouve à 10000, le prochain timer sera à 12000.
la led rouge ne s'allumera pas tant que ce timer est franchit, et avec mon code, la led rouge sera allumée pendant 2000ms soit 2 secondes.
void loop() {
//mesureBrute=analogRead(RVar); // desactivation du potar
//mesure=map(mesureBrute,0,1023,0.0,100.0); // desactivation du potar
mesure = 1; //valeur fixée pour simuler le potar
potard=mesure*1000; // a modifier suivant le délais a atteindre 1000 = 1s
Je veux pas paraitre trop chiant et boulet mais j'ai repris le code, j'ai passé l'après midi dessus... (ça fait 3 jours que j'y suis)
Peut-être qu'on si prend mal ou que je me suis mal expliqué mais en prenant ton code ça ne marche pas du tout comme je l'entends.
Je sais que tu t'es donné beaucoup de mal mais rien à faire.
On serait mieux de reprendre depuis le début, éliminer tout du montage et recommencer avec juste une led, une photoresistance et un potentiomètre.
Je reprends le but initial :
Une série d'objet passe devant la photo resistance, une fois detecté, je dois simplement (enfin c'est pas si simple) dire :
detection : décalage temps : action
mais le truc c'est de le faire à chaque detection et pas juste une fois.
donc on decale à chaque fois la detection de X secondes
Si le potentiomètre de réglage du temps est trop chiant on le vire pour le moment, simplement il ne faut pas que le programme soit bloqué.
je pige pas du tout.
ce que je t'ai donné en sketch fonctionne impec.
j'ai shunté ton potar en mettant une valeur en dur dans le sketch.
en plus c'est non bloquant, puisque ca boucle dans le loop.
par contre, tant que le timer pour la led rouge est pas a zero, il boucle sur le while.
après tout est mis à zero par timerledverte = 0;
le sketch fait quoi?
il détecte si passage ou non devant le détecteur
si rien, il regarde si le timer est à zero via le void testledrouge() appelé dans le loop
si detection
led verte allumée 2s
timerledverte = millis(); pour récupérer un temps
on rajoute pour la led rouge le XXX millisecondes du potar factice mesure = 1 potard; = mesure*1000;
du coup, dans le loop ca va allez voir si les conditions sont réunies dans le void testledrouge
si le timer est < a millis(), on fait rien
si le timer est > millis(), on allume la led rouge pendant le temps du potard
si potard-- est à zero
on met sur off la led rouge
on met a zero le timerledverte
et on repart sur une nouvelle détection
c'est bien ce que tu voulais au départ? non ?
maintenant, si tu veux que lorsque le potard-- n'est pas encore à zero, on puisse faire une nouvelle détection, il suffit de mettre une verif de détection dans le while et si détection, on break pour ressortir de la boucle et on réécrit le timerledverte par la même occasion.
donc ca repart dans le loop, vérification et on retombe dans le void testledrouge pour une nouvelle boucle.
voila ce que ca donne dans le serial
initialisation PIR
Lecture mesure1 : 1.00Lecture potar1 : 1000
Testled rouge
etat led verte :0
Lecture mesure1 : 1.00Lecture potar1 : 1000
Testled rouge
etat led verte :0
Piece detecte
timerledverte : 23896
Testled rouge
etat led verte :1
timerledrouge : 24879
milli : 25969
999
998
997
996
995
994
......
4
3
2
1
0
Lecture mesure1 : 1.00Lecture potar1 : 1000
Testled rouge
etat led verte :0
Lecture mesure1 : 1.00Lecture potar1 : 1000
Testled rouge
etat led verte :0
Re et je vois que tu t'acharnes aussi
Pourquoi veux tu allumer la verte 2 secondes ? la led verte s'allume juste au passage de la pièce puis s'éteint, dans mon programme ça fonctionne parfaitement. je vais te le remettre pour que tu vois comment elle fonctionne. Cette led est juste là pour donner l'impulsion qui sert au décompte.
Une fois qu'on a l'impulsion, on décale l'action de X seconde grâce au potentiomètre pour allumer la led rouge après X secondes
Là jusque là tu suis ?
Bon là on complique la chose c'est qu'il n'y a pas qu'une detection mais plusieurs et à chaque fois la led rouge va s'allumer autant de fois que de detection mais toujours en décalé.
C'est là que tout est le problème
Car sinon j'utiliserai un simple delay comme pour une alarme