étant un nouveau possesseur d'un arduino, je m amuse a faire des petits projets mais la je bute sur un truc que je pense tout con.
allumer une led apres appui sur un bouton poussoir avec 6 secondes de retard par exemple.
je vous met mon programme, si vous pouvez m'aiguiller sur mes erreurs svp. ca fait 3 soirées que mon "cerveau" bug.
int boutonpouss = 2;
int etatbouton = 0;
int etatboutonav = 0;
int led1 = 3;
int led2 = 4;
int led4 = 5;
long interval = 6000;
unsigned long ancientemps = 0;
Si j'ai bien compris, voici ce que ça devrait donner
// Allumage d'une led avec un retard de 6 secondes
// Déclaration des variables
int boutonpouss = 2;
int etatbouton = 0;
int etatboutonav = 0;
int led1 = 3; // On attribue le pin sur lequel on a branché l'anode de la led1 !!! IMPORTANT : On oublie pas de mettre une résistance !!!
int led2 = 4; // On attribue le pin sur lequel on a branché l'anode de la led2 !!! IMPORTANT : On oublie pas de mettre une résistance !!!
int led3 = 5; // On attribue le pin sur lequel on a branché l'anode de la led3 !!! IMPORTANT : On oublie pas de mettre une résistance !!!
int interval = 6000; // Durée du retardement en ms
int ancientemps = 0;
// the setup routine runs once when you press reset:
void setup() {
// On utilise le moniteur serie
Serial.begin(9600);
Serial.println("Demarrage");
// initialisation des digital pin en OUTPUT ou INPUT
pinMode(led1, OUTPUT); // declare led1 as OUTPUT
pinMode(led2, OUTPUT); // declare led2 as OUTPUT
pinMode(led3, OUTPUT); // declare led3 as OUTPUT
pinMode(boutonpouss, INPUT); // declare boutonpouss as input
}
// La routine loop
void loop() {
if(digitalRead(boutonpouss) == HIGH) {
Serial.println("Je viens d'appuyer sur le bouton");
ancientemps = 0; // On demarre le chrono à 0
Serial.println(ancientemps);
etatboutonav = 1; // On set l'etat du bouton
Serial.println(etatboutonav);
}
// Vérfication si l'état du bouton == 1 alors on incrémente la variable ancientemps
if (etatboutonav == 1) {
ancientemps++ ; // incrémentation de 0 à 60 à cause de la commande "delay(100);" en fin de loop
Serial.println(ancientemps * 100);
// Si ancientemps * 100 est plus grand ou égal à 6000 alors on allume la led et on repasse l'état du bouton à 0
if ((ancientemps * 100) >= interval) {
digitalWrite(led1, HIGH);
Serial.println("Led allumee");
etatboutonav = 0;
}
}
// Suite du code selon ce que tu veux faire
// On attend 100 ms avant de refaire un tour
delay(100);
}
Tu peux aussi t'inspirer de ce code que j'ai tapé hier soir pour un nouveau projet qui est d'allumer une led lorsqu'un mouvement est détecté la nuit et qui s’éteint 6 secondes après la dernière détection de mouvement.
/*
Ensemble Arduino + Pir + LDR + Leds
By WMLogistic
Merci à Bricoleau et _pepe_ pour leurs conseils
*/
const int led = 12; // On attribue le pin sur lequel on a branché l'anode de la led !!! IMPORTANT : On oublie pas de mettre une résistance !!!
const int led2 = 2;
const int pir = A0; // On attribue le pin sur lequel on a branché le PIRsignal
const int LightS = A1;
const unsigned long temporisation = 6000UL; // On garde la led allumée pendant 6 secondes s'il n'y a plus de mouvements
boolean LedOn = false;
int mouvement = 0;
int lum = 1000;
unsigned long chrono;
unsigned long temps;
void setup() {
Serial.begin(9600);
Serial.println("Demarrage");
pinMode(led, OUTPUT); // On définit le pin "led" en sortie
pinMode(led2, OUTPUT); // On définit le pin "led2" en sortie
pinMode(pir, INPUT); // On définit le pin "Pir" en entrée pour lire la valeur
pinMode(LightS, INPUT); // On définit le pin "LightS" en entrée pour lire la valeur
}
void loop() {
lum = analogRead(LightS) ;
temps = millis();
//Serial.println(lum);
//On vérifie s'il fait nuit
if (lum <= 400) {
digitalWrite(led2, HIGH); // Si c'est le cas, on allume la led qui indique qu'il fait nuit
// Maintenant qu'il fait nuit on peut vérifier s'il y a détection de mouvement
mouvement = analogRead(pir) ;
if (mouvement > 0) {
digitalWrite(led, HIGH); // On allume la led qui indique un mouvement
LedOn = true ; // On Set la variable temoin de led allumée à true
chrono = temps; // On lance le chrono
Serial.println("Il fait nuit et un mouvement est detecte");
}
// Maintenant on vérifie, s'il n'y a plus de mouvement, le temps écoulé et l'état de la led pour l'éteindre si elle est allumée
else if ((temps - chrono >= temporisation) && (LedOn == true)) {
digitalWrite(led, LOW); // On éteind la led de mouvement
LedOn = false ; // on set son état à false
Serial.println("On eteind la led");
}
// Ici c'est juste une vérification visuelle du passage dans la condition qui est facultative
else if (LedOn == true) {
Serial.println(".");
}
}
// S'il fait jour on garde la led2 éteinte
else {
digitalWrite(led2, LOW); // HIGH = Eteind
}
// on evite de surcharger notre petit arduino, une vérification par seconde est suffisante pour ce genre d'application.
delay(1000);
}
Pour le montage c'est à ça que ça ressemble mon projet :
Ton programme risque de dysfonctionner (genre blocage total) au bout de 49 jours et des briquettes, quand millis() va atteindre la valeur 2^32 et revenir à zéro.
Il ne faut jamais prendre la valeur de millis() et lui ajouter une constante pour déterminer un instant dans le futur.
A la place, tous les tests de durée doivent être de la forme if (millis()-millis_depart >= duree)
En effet, cette forme de test est insensible à l'overflow de millis()
Ton programme risque de dysfonctionner (genre blocage total) au bout de 49 jours et des briquettes, quand millis() va atteindre la valeur 2^32 et revenir à zéro.
Il ne faut jamais prendre la valeur de millis() et lui ajouter une constante pour déterminer un instant dans le futur.
A la place, tous les tests de durée doivent être de la forme if (millis()-millis_depart >= duree)
En effet, cette forme de test est insensible à l'overflow de millis()
ok j'en prend bonne note merci
j'ai modifié mon code précédant en suivant vos conseils.
Salut a tous! et merci bcp d'avoir pris le temps de me répondre et de m'aider.
Grâce a vos explications j'ai réussi la première partie de mon programme:
mon programme sera un minuteur a led, avec les leds qui s'allume par tranches de 10min, avec un seul bouton poussoir pour démarrer la minuterie, l’arrêter, reset, démarrer ...
int boutonpouss = 2;
int etatbouton = 0;
int etatboutonav = 0;
int led1 = 3;
int led2 = 4;
int led4 = 5;
const unsigned long interval = 6000;
unsigned long ancientemps = 0;