switch button

Hello everyone

I have a DC motor powered by a joystick connected to a motor shield Arduino. I have two switch buttons which operate as a limit switch. I want to go back the other way with my engine so I want to ensure that when the push button is pressed more than 3 seconds it does not block the motor and the joystick.

Here is my current code base (without joystick)

thank you

[code] const byte PIN_VITESSE_MOTEUR_A = 3;
const byte PIN_SENS_MOTEUR_A = 12;
const byte PIN_FREIN_MOTEUR_A = 9;
const byte PIN_VITESSE_MOTEUR_B = 11;
const byte PIN_SENS_MOTEUR_B = 13;
const byte PIN_FREIN_MOTEUR_B = 8;

const int buttonPin_1 = 6; // crée un identifiant pour la broche utilisée avec le bouton poussoir
const int buttonPin_2 = 7; // crée un identifiant pour la broche utilisée avec le bouton poussoir

// Les variables sont modifiées au cours du programme
int buttonState_1 = 0; //Variable pour l’état actuel du bouton poussoir
int buttonState_2 = 0; //Variable pour l’état actuel du bouton poussoir

void setup() {

Serial.begin(115200);

pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT);
digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);

pinMode(PIN_VITESSE_MOTEUR_B, OUTPUT);
digitalWrite(PIN_VITESSE_MOTEUR_B, LOW);

pinMode(PIN_SENS_MOTEUR_A, OUTPUT);
digitalWrite(PIN_SENS_MOTEUR_A, LOW);

pinMode(PIN_SENS_MOTEUR_B, OUTPUT);
digitalWrite(PIN_SENS_MOTEUR_B, LOW);

pinMode(PIN_FREIN_MOTEUR_A, OUTPUT);

digitalWrite(PIN_FREIN_MOTEUR_A, LOW);

pinMode(PIN_FREIN_MOTEUR_B, OUTPUT);

digitalWrite(PIN_FREIN_MOTEUR_B, LOW);

pinMode(buttonPin_1, INPUT);
pinMode(buttonPin_2, INPUT);
// On initialise en général les OUTPUT au moment du pinmode pour éviter d’avoir deux blocs de
// code séparé pour une même série de broches.
// On se rend alors compte qu’ici la broche PIN_FREIN_MOTEUR_A n’a pas de valeur par défaut au setup() par exemple.
} // met la broche en entrée

void loop() {
// lit l’état actuel du bouton poussoir et le mémorise dans la variable
buttonState_1 = digitalRead(buttonPin_1);
buttonState_2 = digitalRead(buttonPin_2);

if (buttonState_1 == HIGH || buttonState_2 == HIGH) {

// Si le bouton est actif les moteurs sont éteints
digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);

}
else { // Sinon, si le bouton n’est pas actif

 // Si la valeur X est strictement supérieur à 700 le moteur A avance
 digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
 digitalWrite(PIN_SENS_MOTEUR_A, HIGH);

}  }[/code]

I’m not sure if I understand what you mean… Is it you want to ensure the button is pressed for 3 seconds before an action is taken?

BTW, you can also post to our forums in French if you wish…

OK merci. Je vais essayer en français c’est peut être mieux :slight_smile:
J’ai deux boutons poussoir qui fonctionnent comme des interrupteurs de fin de course. Je veux pouvoir repartir dans l’autre sens avec mon moteur quand le bouton est enclenché pendant une durée supérieure à 3 secondes.
Merci

Ok, alors tu veux que moteur bouge en une direction, arrête une fois qu’il se rend au bout, attends 3 seconds et ensuite repart dans l’autre direction? Et le moteur devrait faire pareil à l’autre bout? Alors, le moteur se promêne d’un bout à l’autre en arrêtant 3 secondes avant de changer de direction? Je veux m’assurer que je comprends bien…

Salut Jeffrey,

En fait j’ai posté un code simplifié. Le moteur est actionné par un joystick normalement (mais je l’ai enlevé pour faire fonctionner spécifiquement les interrupteurs de fin course). Donc mon moteur mobilise un objet de droite à gauche et sur cet axe se situent les interrupteurs de fin de course aux extrémités qui permettent que l’objet n’aille pas trop loin. Quand l’interrupteur est enclenché, l’objet est en appui dessus mais je veux pouvoir repartir dans l’autre sens au bout de 3 secondes si j’actionne de nouveau mon joystick. Donc si l’interrupteur est enclenché plus de 3 secondes je dois pouvoir faire redémarrer mon moteur.

Merci beaucoup

J’ai introduit la notion de temps avec millis() : si le bouton est appuyé + de 3 secondes le moteur doit redémarrer mais ça ne fonctionne pas le moteur ne redémarre jamais.

[code]void loop() {
// lit l’état actuel du bouton poussoir et le mémorise dans la variable
buttonState_1 = digitalRead(buttonPin_1);
buttonState_2 = digitalRead(buttonPin_2);
digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A, HIGH);

long duree;

if ((buttonState_1 == HIGH) | ( buttonState_2 == HIGH)) {
// Si le bouton vient d’être activé, les moteurs sont éteints
digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
digitalWrite(PIN_VITESSE_MOTEUR_A, LOW);
digitalWrite(PIN_SENS_MOTEUR_A, LOW);

//on regarde l’heure qu’il est et on la mémorise dans duree
duree= millis();
//On met à jour l’état du bouton
}

if (duree > 3000) {
//annuler la commande du bouton
digitalWrite(PIN_FREIN_MOTEUR_A, LOW);
digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A, HIGH);

}[/code]

Est-ce que t’as réussi à fonctionner ton délais de 3 secondes? Sinon, je recommanderais de faire quelque chose comme ceci :

void loop() {
 // lit l'état actuel du bouton poussoir et le mémorise dans la variable
 buttonState_1 = digitalRead(buttonPin_1);
 buttonState_2 = digitalRead(buttonPin_2);
 
 if (millis() < tempsDepart) {
   
   // Reste arrêté si on a pas dépassé le temps de départ
   
 } else if (buttonState_1 == HIGH || buttonState_2 == HIGH) {  
   
   // Si le bouton est actif les moteurs sont éteints
   digitalWrite(PIN_FREIN_MOTEUR_A, HIGH);
   digitalWrite(PIN_FREIN_MOTEUR_B, HIGH);
   
   tempsDepart = millis() + TEMPS_ARRETE;
   
 }
 else { // Sinon, si le bouton n'est pas actif
   
   // Si la valeur X est strictement supérieur à 700 le moteur A avance
   digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH);
   digitalWrite(PIN_SENS_MOTEUR_A, HIGH);
   
 }
}

Et il faudrait ajouter ceci au début :

#define TEMPS_ARRETE 3000
unsigned long tempsDepart = 0;