Pas tout a fait cela.
Déjà mon break était mal placé.
Voici une proposition de modification
void loop()
{
switch( etat )
{
//---------------------------------------------
case REPOS:
// on attend le bouton
if ( digitalRead( pushpin ) == LOW )
{
etat = EN_COURS;
// reinitialiser les variables pour etre sur
luminosite = 0;
variation = 5;
}
break;
//---------------------------------------------
case EN_COURS:
if ( (millis() - heure_dernier_changement) > 1000 )
{
analogWrite(ledpin, luminosite);
if ( variation > 0 )
{
luminosite = luminosite + variation;
if ( luminosite == 25)
variation = - variation;
}
else
{
if ( luminosite == 0 )
etat = REPOS;
else
luminosite = luminosite + variation;
}
heure_dernier_changement = millis();
}
break;
//---------------------------------------------
} // switch
} // loop
Comme tu le vois, le code de EN_COURS commence a s'alourdir avec des tests imbriqués un peu compliqués.
On peut prendre avantage de la notion d'automate en renommant EN_COURS comme UP et ajoutant un nouvel état DOWN :
enum {
REPOS, // Attente pression poussoir
START, // 1ere etape
UP, // gradateur up
DOWN // et down
} etat = REPOS;
void loop()
{
switch( etat )
{
//---------------------------------------------
case REPOS:
// on attend le bouton
if ( digitalRead( pushpin ) == LOW )
etat = START;
// pas de break : on enchaîne directement sur START sans repasser par loop();
//---------------------------------------------
case START:
// 1ere étape du gradateur avec luminosite = 0
analogWrite(ledpin, luminosite);
// on continue après avec UP
etat = UP;
// on mémorise l'heure
heure_dernier_changement = millis();
break;
//---------------------------------------------
case UP:
if ( (millis() - heure_dernier_changement) > 1000 )
{
// maintenant je pré-calcule la valeur avant de l'écrire
luminosite = luminosite + variation;
analogWrite(ledpin, luminosite);
// si la dernière écriture était 0, on passe en DOWN
if ( luminosite == 25)
etat = DOWN ;
// on mémorise l'heure
heure_dernier_changement = millis();
}
break;
//---------------------------------------------
case DOWN:
if ( (millis() - heure_dernier_changement) > 1000 )
{
luminosite = luminosite - variation; // note que je change le signe ici plutot que la valeur
analogWrite(ledpin, luminosite);
// si la dernière écriture était 0, on passe en REPOS
if ( luminosite == 0)
etat = REPOS ;
// on mémorise l'heure
heure_dernier_changement = millis();
}
break;
//---------------------------------------------
} // switch
} // loop
Ce code garantit parfaitement que l'on passe par 0 ... 25 ... 0