Bonjour,
Tout d'abord merci à tous ceux qui enrichissent ce forum par leur réponses/commentaires.
Je fais actuellement mes premiers pas dans la programmation Arduino uno et j'ai passé beaucoup de temps à lire ce qui est ici.
Mais je n'ai pas trouvé d'explication à mon problème...
.
Voilà mon code :
.
//////Déclaration des variables
//identifier LED et broches
const int LED1 = 8; //LED1 sur broche 8, renommée en "LED1"
const int LED2 = 9; //LED2 sur broche 9, renommée en "LED2"
const int LED3 = 10; //LED3 sur broche 10, renommée en "LED3", pour visualiser action sur Inter1
//identifier boutons et broches
const int Inter1 = 2; //Inter branché entre 2 et GND, renommé en "Inter1"
int stateInter1; //Variable pour l'état actuel d'Inter1
int lastStateInter1 = LOW; //Variable pour l'état précédent d'Inter1
//antirebond
long DebounceDelay = 2000; //durée du filtre anti-rebond
long lastDebounceTime = 0; //mémoriser le dernier changement d'état Inter1
//variable pour visualiser changement d'état Inter1
int Commut = LOW;
//////initialisation et déclaration des entrées-sorties
void setup()
{
pinMode(LED1, OUTPUT); //LED1 est une sortie
pinMode(LED2, OUTPUT); //LED2 est une sortie
pinMode(LED3, OUTPUT); //LED3 est une sortie
pinMode(Inter1, INPUT); //Inter1 est une entree
digitalWrite(Inter1,HIGH); //actionne la resistance pullup intégrée de l'Arduino sur Inter1
}
////// programme en boucle
void loop(){
int readInter1 = digitalRead(Inter1); //lit état de Inter1 et mémorise sous "readInter1"
//Inter1 vient d'être appuyé ?
if(readInter1 != lastStateInter1){
lastDebounceTime = millis(); //mémorise l'instant du chgt état Inter1 avec "millis"
Commut = HIGH;
digitalWrite(LED3,Commut); //montre si détection du chgt état Inter1, sans filtre antirebond
delay(200); //delay pour voir la détection du chgt état Inter1 (s'éteind en bas de boucle)
}
//antirebond : valide le changement seulement après la durée du DebounceDelay
if ((millis() - lastDebounceTime ) > DebounceDelay){
if(readInter1 != stateInter1){
stateInter1 = readInter1;
}
}
digitalWrite(LED1,stateInter1); //allume ou éteind la LED1 suivant état de Inter1
digitalWrite(LED2,!stateInter1); //l'inverse de LED1
digitalWrite(LED3,LOW); //eteind la LED3, pour prochaine visualisation d'action sur Inter1
lastStateInter1 = readInter1; //mémorise état Inter1 pour prochaine boucle
}
.
Mon montage :
1 Arduino Uno
1 inter
3 LEDs (avec résistances de limitation).
Ce que je voudrais faire :
Quand inter = 1, LED1 = 1, LED2 = 0
Quand inter = 0, LED1 = 0, LED2 = 1
Avec gestion Debounce et récupérer une variable (détection changement d'état de l'inter) pour plus tard (pour rajouter 2 boutons poussoirs, pour commander les mêmes LEDs)
.
Mon problème est au démarrage (mise sous tension, juste après download ou après un reset de la carte) :
Inter = 1, mais LED1=0 et LED2=1 pendant 2s (temps du Debounce important pour voir le problème).
Ensuite tout rentre dans l'ordre, sans aucune action sur l'inter...
J'ai un souci - je pense - lors de l'exécution du tout premier loop.
J'ai cherché et testé beaucoup de choses depuis 2 jours, mais là je cale...
Avant de partir dans une autre direction (utiliser un tableau ou autre), j'aimerai bien comprendre mon erreur dans ce code...
.
Si quelqu'un a une idée, ou commentaire, ou correctif ??
Merci merci.
Bonne soirée.
PS : l'idée plus tard est de gérer la rotation d'un motoréducteur DC.
Inter=1 : moteur tourne droite (simulé par LED1 ici)
Inter=0 : moteur tourne gauche (simulé par LED2 ici)
Bouton poussoir 1 : force la rotation à droite
Bouton poussoir 2 : force la rotation à gauche
Avec une tempo (delay) entre les 2 sens de rotation, évidemment...
=> d'où mon besoin de variable "Commut", histoire d'avoir pendant 6s LED1 et LED2=0 (pour freinage moteur avant de repartir dans l'autre sens)
Enfin c'est la voie choisie pour débuter et apprendre... Snif...