Oui delay() est une fonction blocante, utiliser millis() si on veut éviter ça.
Pour des relais mécaniques c'est pas terrible ... Pas terrible du tout même : 50x60x365= + de 1 000 000 de commutations !! On est loin des specs des fabriquants !!
Quelle est la charge à commander ? Continu ? alternatif ? Il existe d'autres solutions : transistor, triac, relais statique ...
Oui effectivement j'abandonne l'idée du relais... Il y a une faible tension, ça déclenche une électrovanne. J'ai le choix pour l'électrovanne (pas encore acheté) 12v, 24v et 220v le mieux étant du 24 volts.
Un mosfet ???
En fait depuis cet après midi je fais des montages et j'ai trouvé l'idée pour mon problème (peut-être pas la solution)
J'ai un potentiomètre qui me donne une valeur de 0 à 1023 en fonction de la position du bouton. Ce qu'il faut c'est tout simplement transformé cette valeur en dixième de seconde et ensuite d'utiliser le resultat pour déclencher l'action B.
J'avance dans ma tête
Si j'ai bien compris il y aura (au maximum) 50 attentes en parallèle dans le pire des cas ?
gunsman76:
Un mosfet ???
Si la charge n'est pas trop grosse un mosfet remplacerait avantageusement un relai.
gunsman76:
J'ai un potentiomètre qui me donne une valeur de 0 à 1023 en fonction de la position du bouton. Ce qu'il faut c'est tout simplement transformé cette valeur en dixième de seconde et ensuite d'utiliser le resultat pour déclencher l'action B.
Voir mon post précédent sur map ![]()
Oui le mosfet est je pense la solution, je vais profiter d'une commande pour en prendre plusieurs (70 centimes).
Et oui tu as raison la fonction map correspond à ce que je veux faire.
Bientôt le programme dans ce fil de discussion, laissé moi digéré tout ça ![]()
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 10Par 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 ? ![]()
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... ![]()
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);
}