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;
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.
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
}
}