Je me demande, si je peux programmer avec un seul bouton sur une entrée de mon arduino une commande sois manuel sois auto de mon moteur..
je m'explique :
Si appuye long sur le bouton = mise en marche manu du moteur (et il s'arrete quand je relance le bouton)
si j'appuye qu'une fois , mis en marche auto du moteur (il va tourner quelsues tours pré-programmer)
Est-ce que la logique Arduino permet de faire cela ?
Exemple de code auquel je pense :
void setup() {
boolean buttonState = 0;
int buttonPin = 4;
int ledPin = 13;
}
void loop() {
// marche manuelle
buttonState = digitalRead(buttonPin);
if (buttonState ==0) {
digitalWrite(ledPin, buttonState); //allumage led.. mais idealement moteur en manuel
buttonState = !buttonState;
while (!digitalRead(buttonPin); // attendre que le bouton soit relaché
}
//marche auto
buttonState = digitalRead(buttonPin);
if (buttonState ==0) {
digitalWrite(ledPin, buttonState); //allumage led pedant 10s (mais idealement.. lanbcement fonction du moteur en auto)
delay(10000);
buttonState = !buttonState;
}
}
peut etre plus utiliser interupt ? genre.. le bouton de l'etat bas à haut.. ? donc juste un appuye simple.
byte buttonPin = 4;
byte ledPin = 13;
unsigned long tempo = 0;
void setup()
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin,LOW);
}
void loop()
{
if (digitalRead(buttonPin) == LOW) //si BP appuye
{
delay(200); //on filtre les rebonds
tempo=millis(); //on demarre la tempo
while (digitalRead(buttonPin) == LOW) //tant que le BP est appuye
{ //on mesure la durée de l'appui
if ((millis()-tempo)>1000 ) //si la duree est > que 1000 ms
{
digitalWrite(ledPin,HIGH) ; //on allume le moteur
} //marche manuelle
} //dès que le BP est relache
digitalWrite(ledPin,LOW); //on stoppe le moteur
if ((millis()-tempo)<1000 ) //si la durée était < 1000
{
tempo=millis(); //on reinitialise la tempo
while((millis()-tempo)<2000) //tant qu'il ne s'est pas écoule 5 secondes
{
digitalWrite(ledPin,HIGH) ; //on laisse le moteur allume pendant 5 secondes
}
digitalWrite(ledPin,LOW) ; //puis on le stoppe
}
}
}
J'ai bien adapté ton code et cela fonctionne très bien.. j'ai juste ajouté un 2° appuie pendant le mode auto afin d'arreter la fonction auto (au cas ou..)
mais le break ne semble pas etre la solution.. c'est mes yeux ou bien ?
byte buttonPin = 4;
byte ledPin = 13;
unsigned long tempo = 0;
int dureMoteur1 = 4000;
void setup()
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("Les croquettes aux touftoufs !");
Serial.println("V 1.0!");
Serial.println();
digitalWrite(ledPin,LOW);
}
///////////////////////////
// Fonctions du programme
//////////////////////////
void FunctionMarcheManu()
{
digitalWrite(ledPin,HIGH) ;
Serial.println("Fonction moteur Manu");//on allume le moteur
}
void FunctionMarcheAuto()
{
digitalWrite(ledPin,HIGH) ;
Serial.println("Fonction moteur Auto");//on allume le moteur
}
//////////
// boucle
//////////
void loop()
{
if (digitalRead(buttonPin) == LOW) //si BP appuye
{
delay(200); //on filtre les rebonds
tempo=millis(); //on demarre la tempo
while (digitalRead(buttonPin) == LOW) //tant que le BP est appuye
{ //on mesure la durée de l'appui
if ((millis()-tempo)>500 ) //si la duree est > que 500 ms
{
FunctionMarcheManu();
} //marche manuelle
} //dès que le BP est relache
digitalWrite(ledPin,LOW); //on stoppe le moteur
Serial.println("Fin de Fonction moteur Manu");
if ((millis()-tempo)<500 ) //si la durée était < 500ms
{
tempo=millis(); //on reinitialise la tempo
while((millis()-tempo)< dureMoteur1) //tant qu'il ne s'est pas écoule durée Moteur 1
{
FunctionMarcheAuto();
// stop si 2°eme appuye sur le bouton
if (digitalRead(buttonPin) == LOW)
{
digitalWrite(ledPin,LOW) ;
break;
}
}
digitalWrite(ledPin,LOW) ; //puis on le stoppe
Serial.println("Fin de Fonction moteur auto");
}
}
}
boolean flag_arret=false;
byte buttonPin = 4;
byte ledPin = 13;
unsigned long tempo = 0;
int dureMoteur1 = 4000;
void setup()
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("Les croquettes aux touftoufs !");
Serial.println("V 1.0!");
Serial.println();
digitalWrite(ledPin,LOW);
}
///////////////////////////
// Fonctions du programme
//////////////////////////
void FunctionMarcheManu()
{
digitalWrite(ledPin,HIGH) ;
Serial.println("Fonction moteur Manu");//on allume le moteur
}
void FunctionMarcheAuto()
{
digitalWrite(ledPin,HIGH) ;
Serial.println("Fonction moteur Auto");//on allume le moteur
}
//////////
// boucle
//////////
void loop()
{
if (digitalRead(buttonPin) == LOW) //si BP appuye
{
delay(200); //on filtre les rebonds
tempo=millis(); //on demarre la tempo
while (digitalRead(buttonPin) == LOW) //tant que le BP est appuye
{ //on mesure la durée de l'appui
if ((millis()-tempo)>500 ) //si la duree est > que 500 ms
{
FunctionMarcheManu();
} //marche manuelle
} //dès que le BP est relache
digitalWrite(ledPin,LOW); //on stoppe le moteur
Serial.println("Fin de Fonction moteur Manu");
if ((millis()-tempo)<500 ) //si la durée était < 500ms
{
tempo=millis(); //on reinitialise la tempo
flag_arret=false;
while((millis()-tempo)< dureMoteur1) //tant qu'il ne s'est pas écoule durée Moteur 1
{
if (flag_arret==true){digitalWrite(ledPin,LOW) ;}
else{FunctionMarcheAuto();}
// stop si 2°eme appuye sur le bouton
if (digitalRead(buttonPin) == LOW)
{
flag_arret=true;
}
}
digitalWrite(ledPin,LOW) ; //puis on le stoppe
Serial.println("Fin de Fonction moteur auto");
}
}
}