il faut 2 variables
unsigned long TempsDebut;
boolean boutonAppuye; // vrai si le bouton est appuyé
Initialiser boutonAppuye = false ; dans le setup()
Dans la loop()
vous regardez l'état du bp
S' il est enfoncé (lire digitalRead(bpPin) == LOW ou == HIGH // (suivant si vous utilisez un pull up ou pas) et qu'il n'était pas enfoncé juste avant (boutonAppuye == false) vous enregistrez millis() TempsDebut = millis(); et mettez le booléen "bouton enfoncé" à vrai boutonAppuye = true;
S'il est relâché alors boutonAppuye = false ;
Si boutonAppuye ET si (millis()-TempsDebut >= 20000UL) alors 20 secondes se sont écoulées, mettre l'état actif