Bonjour à toutes et à tous.
Le sujet a dû être traité une bonne centaine fois mais je ne trouve pas de topic qui puisse m'aider. J'ai passé du temps beauuuuuucoup de temps à essayer de comprendre sans succès .
Alors voilà: dans la maquette du faucon millenium, un appui sur le bouton fait descendre la trappe et allume l'éclairage. Un autre appui sur le bouton remonte la trappe et la lumière s’éteint.
Le programme avec du delay marche à merveille mais lorsque je veux le remplacer par du millis() ... ça marche pas.
"Au secours les Obi wan Kenobi du forum, vous êtes mon seul espoir"
Le programme à base de delay
/* ------------------- DECLARATIONS DES VARIABLES ---------*/
// Rampe
int etat_bouton;
int leds_rampe;
int moteur_descente;
int moteur_montee;
int moteur_validation;
// Variable qui stocke la mesure du temps.
long temps;
// Variable etat_leds à 0 (boolean ne prend que 2 valeurs: 0 ou 1
boolean etat_leds = false;
/*------------------------------------ INITIALISATION ------------*/
void setup()
{
// Initialisation des pins pour le moteur.
// moteur_descente sur pin4 en sortie
pinMode(moteur_descente = 4, OUTPUT);
// Moteur_Montée sur pin5 en sortie
pinMode(moteur_montee = 5, OUTPUT);
// moteur_validation sur pin6 en sortie
pinMode(moteur_validation = 6, OUTPUT);
// déclaration du bouton en entrée avec la résistance pullup interne
pinMode(etat_bouton = 3, INPUT_PULLUP);
// Led_rampe sur pin7 en sortie
pinMode(leds_rampe = 7, OUTPUT);
// Initialisation du temps
temps = millis();
}
/*----------------------------- EXECUTION -------------------------------- */
void loop()
{
//telecommande();
rampe();
//rampeIR();
}
/*----------------------------- SOUS PROGRAMME -------------------*/
/*-------------------------- Sous Programme pour la rampe -------------------------------*/
void rampe()
{
//Lire la pin3 et stocker dans etat_bouton
etat_bouton = digitalRead(3);
// SI Bouton pressé ET Leds éteintes
if (etat_bouton == LOW && etat_leds == false)
{
// Activer Moteur en desccente pendant 3s
digitalWrite(moteur_descente, HIGH);
digitalWrite(moteur_validation, HIGH);
// Activer leds_rampe
digitalWrite(leds_rampe, HIGH);
// Mémorisation état LEDS Rampe( allumées )
etat_leds = true;
// Moteur fonctionne pendant 3000ms
delay(3000);
// Arret Moteur
digitalWrite(moteur_validation, LOW);
digitalWrite(moteur_descente, LOW);
}
// SiNON SI Bouton pressé ET leds allumées
else if (etat_bouton == LOW && etat_leds == true)
{
// Activation Moteur en monté
digitalWrite(moteur_validation, HIGH);
digitalWrite(moteur_montee, HIGH);
// Moteur fonctionne pendant 3000ms
delay(3000);
// Arret Moteur
digitalWrite(moteur_validation, LOW);
digitalWrite(moteur_montee, LOW);
// Extinction Leds Rampe
digitalWrite(leds_rampe, LOW);
//Mémorisation état LEDS Rampe (éteintes)
etat_leds = false;
}
}
Et voici le programme à base de millis() qui ne fonctionne pas et où je me perds en comprehension et essais.
/*------------------------------ DECLARATIONS DES VARIABLES --------------- */
// Rampe
int etat_bouton;
int leds_rampe;
int moteur_descente;
int moteur_montee;
int moteur_validation;
// Variable qui stocke la mesure du temps.
unsigned long temps;
// Variable etat_leds à 0 (boolean prend que 2 valeurs: 0 ou 1
boolean etat_leds = false;
/*------------------------------------ INITIALISATION --------------------*/
void setup()
{
// Initialisation des pins pour le moteur.
// moteur_descente sur pin4 en sortie
pinMode(moteur_descente = 4, OUTPUT);
// Moteur_Montée sur pin5 en sortie
pinMode(moteur_montee = 5, OUTPUT);
// moteur_validation sur pin6 en sortie
pinMode(moteur_validation = 6, OUTPUT);
// déclaration du bouton en entrée avec la résistance pullup interne
pinMode(etat_bouton = 3, INPUT_PULLUP);
// Led_rampe sur pin7 en sortie
pinMode(leds_rampe = 7, OUTPUT);
// stockage millis() dans temps
temps = millis();
}
/*------------------------------------- EXECUTION -------------*/
void loop()
{
rampe();
}
/*-------------------------- Sous Programme pour la rampe --------------*/
void rampe()
{
//Lire la pin3 et stocker dans etat_bouton
etat_bouton = digitalRead(3);
// SI Bouton pressé ET Leds éteintes alors
if ( etat_bouton == LOW && etat_leds == false)
{
// Tempo de 3 secondes
// Activer Moteur en desccente pendant 3s
// Stockage valeur millis() dans temps
temps = millis();
// Activation des leds de la rampe
digitalWrite(leds_rampe, HIGH);
// Activation du moteur
digitalWrite(moteur_validation, HIGH);
// Le moteur descend
digitalWrite(moteur_descente, HIGH);
// Les leds_rampe sont allumées
etat_leds = true;
// Tempo de 3 sec puis arret moteur
if (millis() - temps > 3000)
{
// Arret moteur
digitalWrite(moteur_descente, LOW);
digitalWrite(moteur_validation, LOW);
temps = millis();
}
}
// SiNON SI Bouton pressé ET leds allumées
else if ( etat_bouton == LOW && etat_leds == true)
{
temps = millis(); // on demarre le comptage
// Activation Moteur en monté
digitalWrite(moteur_montee, HIGH);
digitalWrite(moteur_validation, HIGH);
if (millis() - temps > 3000)
{
// Arret moteur
digitalWrite(moteur_montee, LOW);
digitalWrite(moteur_validation, LOW);
// Extinction leds
etat_leds = false;
temps = millis();
}
}
}
Merci infiniment pour votre aide.