Led avec bouton et minuterie

bonjour au groupe, mon fils de 12 ans en est à ses premiers pas avec Arduino et il a une idée de projet en tête que nous somme capable de réaliser en 2 partie mais pas ensemble.

le projet:
allumer une led avec un bouton poussoir.
la led doit rester allumé pendant 30 minutes OU jusqu'à ce qu'on presse le bouton une deuxième fois.

Ce qu'on a:

int led = 3;
int buttonPin = 2;

void setup() {
// put your setup code here, to run once:
pinMode (led, OUTPUT);
pinMode (buttonPin, INPUT);
}

void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(buttonPin)==HIGH)
{
digitalWrite(led, HIGH);
delay(1800000);
}
else
{
digitalWrite(led, LOW);
}
delay(100);
}

ET

int led = 3;
int buttonPin = 2;
bool buttonState = false;

void setup()
{
pinMode(led, OUTPUT);
pinMode(buttonPin, INPUT);

}

void loop() {
// allumé led si éteinte
if (digitalRead(buttonPin) == HIGH && !buttonState)
{
digitalWrite(led, HIGH);
buttonState = !buttonState;
delay(500);
}

// étteindre si allumé
if (digitalRead(buttonPin) == HIGH && buttonState)
{
digitalWrite(led, LOW);
buttonState = !buttonState;
delay(500);
}
}

est-il possible de mettre ça ensemble ??

merci

There's a French subforum here: Français - Arduino Forum
I'll report your post with the question to move it there.

If you want to engage the international community, you might try Google Translate; it's pretty good these days.

ok done, it's in the french section, if you want to help us I can translate :wink:

This is your problem. Delay(x) locks the microcontroller for x milliseconds. In the example above, the microcontroller will simply not be capable of doing anything (including reading the button status) for the 1800000 milliseconds you locked it.

So instead you want to use something like the example 'blink without delay' which you can find in the Arduino IDE (or via Google). Essentially what you do is store the time when the led goes on using millis(), then keep looking at the button, and turn the led off if more than half an hour has passed OR the button has been pressed. This approach does not use delay() and hence it allows the microcontroller to keep track of the time AND 'listen' to the button at the same time.

Mon Français n'est pas très bien, mais assez bien pour comprendre la question :wink:

1 Like

Merci c'est gentils, nous allons travailler cette voie

Good luck; there are many examples of similar solutions in many places for inspiration.

Bonjour marts84 et à ton fils :wink:

Je te donne un exemple ou les fonctions LED et bouton sont ensemble.
Première chose dans ton programme, comme indiqué par @anon35827816 les temporisations avec delay() sont dites bloquantes, c'est à dire que ton Arduino ne peut plus rien faire pendant cette durée, même pas lire le bouton pour un éventuel arrêt de la séquence. Ceci se règle avec l'emploi des millis().
Dans les exemples de l'IDE Arduino il y a dans 01.Basics le sketch Blink (avec delay()), compares le avec le 02.Digital BlinkWithoutDelay.
Dans le câblage de ton bouton, tu le testes avec un if (digitalRead(buttonPin)==HIGH), ce qui suppose que tu as mis une résistance de PULL_DOWN sur la pin 2.
Il est préférable de faire l'inverse, initialiser l'entrée par un pinMode(boutonPin, INPUT_PULLUP); et bénéficier de la PULL_UP interne de l'Arduino. Il faut, par contre, câbler ton bouton, d'un côté sur GND et de l'autre sur la pin 2. Tu économises une résistance.
Si tu veux conserver ton câblage, dans mon programme, changes les digitalRead(boutonPin) == LOW en digitalRead(boutonPin) == HIGH et initialises l'entrée par un pinMode(boutonPin, INPUT);

Le programme:

/*
    Name:       ARDFR_marts84_BoutonLed.ino
    Created:	27.09.2021
    Author:     jpbbricole
*/

const int ledPin = 3;     // Pin de la LED
const int buttonPin = 2;     // Pin de la LED

const int allumageTemps = 30000;     // Temps d'allumage en millisecondes
unsigned long allumageTimer = 0;     // Chrono d'allumage

void setup()
{
	pinMode(ledPin, OUTPUT);     // Port de la LED en sortie
	digitalWrite(ledPin, LOW);     // Eteindre la LED
	pinMode(buttonPin, INPUT_PULLUP);     //Entrée du bouton, avec un LOW quand pressé.
}

void loop()
{
	// Si le bouton est pressé et l'allumage n'est pas en fonction
	if (digitalRead(buttonPin) == LOW && allumageTimer == 0)
	{
		delay(250);     // "anti-rebonds" du bouton
		digitalWrite(ledPin, HIGH);     // Allumer la LED
		allumageTimer = millis();     // Démarrage du chrono
	} 

	// Si allumage en fonction et allumageTemps échu
	if (allumageTimer != 0 && (millis()-allumageTimer >= allumageTemps))
	{
		digitalWrite(ledPin, LOW);     // Eteindre la LED
		allumageTimer = 0;     // Arrêt du chrono
	}
			
	// Si le bouton est pressé et l'allumage est en fonction
	if (digitalRead(buttonPin) == LOW && allumageTimer != 0)
	{
		delay(250);     // "anti-rebonds" du bouton
		digitalWrite(ledPin, LOW);     // Eteindre la LED
		allumageTimer = 0;     // Arrêt du chrono
	}
}

Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.