Le principe est de ne gérer que les transitions sans bloquer
Donc il faut savoir dans quel état tu es pour que à l'expiration de la tempo tu sache ce que tu dois faire.
Ton code me parait parfait et tu dis qu'il marche sauf que la période n'évolue pas dans le bon sens.
Cela ne me surprend pas puisque dans ton code initial, le delay() est proportionel à val
delay (val * 5); // Temps de l'activation qui sera d'une valeur = val x 5
Alors que dans ce nouveau code c'est le contraire :
interval = 500 - val;
Pourquoi n'as tu pas utilisé
interval = 5 * val comme dans le 1er code ?
Deuxieme hic, je ne vois pas comment integrer un ligne me permettant de faire un bip continue lorsque je suis a moins de 1 m
Dans beep, il faut gérer ce cas. Il faut gérer les 3 cas d'ailleurs comme dans ton code initial.
unsigned long currentMillis = millis();
if ( val < 100)
{
beep_state = 1;
digitalWrite(11, HIGH); // active la LED (ON)
tone(8, 1319);
previousMillis = currentMillis;
}
else if (val < 150)
{
if ( currentMillis - previousMillis > interval )
{
// save the last time you blinked the LED
previousMillis = currentMillis;
if (beep_state == 0)
{
beep_state = 1;
digitalWrite(11, HIGH); // active la LED (ON)
tone(8, 1319);
}
else
{
beep_state = 0;
digitalWrite(11, LOW ); // active la LED (Off)
noTone(8);
}
}
}
else
{
beep_state = 0;
digitalWrite(11, LOW ); // active la LED (Off)
noTone(8);
previousMillis = currentMillis;
}
Tu remarqueras que je met à jour previousMillis chaque fois qu'il y a un changement d'état de façon a ce que le compteur de temps soit à jour si brutalement la distance change.