Créer un compte à rebours sonore

Hey la compagnie, jeunes (et vieux) arduiniens, j'ai besoin de vous !

Je vous expose mon soucis. Je souhaite créer une bombe pour le airsoft, alors rassurez-vous, pas une vraie bombe, surtout que la NSA nous surveille. Non, je veux juste faire une bombe, à activer et à désactiver. Mon problème se pose sur le compte à rebours. Je voudrais faire un bip par seconde pour les 30 premières secondes, 2 bips/sec pour les 10 secondes qui suivent, et 3 bips/sec pour les 5 dernières. Le tout donc pour un total de 45sec.
Note, j'utilise un ATTiny85 programmé avec une Arduino Mega 2560. C'est à dire que je ne peux pas utiliser certaines fonctions, dont tone(), qui m'aurait été bien utile. J'ai cependant recréé la fonction en faisant un signal carré à 600Hz, dont le son qui en sort est, je trouve, idéal pour un bip de bombe.

long temps_son;
boolean etat_son = LOW;

void setup ()
{
pinMode(son, OUTPUT);
}

void loop()
{
if (micros() - temps_son > 830) 
{
	temps_son = micros();
	etat_son = !etat_son; 
	digitalWrite(son, etat_son);
	
}
}

Ce code fonctionne parfaitement, testé avec un HP de 8?. Je pendrais sans aucun doute un buzzer avec un petit ampli, pour le faire gueuler bien comme il faut.

Alors, je me suis dis, que je vais simplement créer des for, qui vont changer l'état d'un booléan, pour activer une boucle while vérifiant ce booléan.
Voilà ce que ça donne

for(int compte_a_rebours; compte_a_rebours < 30; compte_a_rebours++) // Si nombre de secondes écoulés < à 35s
{
		
if((millis() - temps_sortie_audio > 10) && sortie_audio == HIGH) 
	temps_sortie_audio = millis();
	
	sortie_audio = LOW;
	
}

if ((millis() -  temps_sortie_audio > 990) && sortie_audio == LOW) 
{
	temps_sorti_audio = millis();
	sortie_audio = HIGH:
	}
	
	
}
for(int compte_a_rebour; compte_a_rebours < 40; compte_a_rebours++) // Si nombre de secondes écoulés < 10s
{
	if((millis() - temps_sortie_audio > 10) && sortie_audio == HIGH) 
{
	temps_sortie_audio = millis();
	
	sortie_audio = LOW;
	
}

if ((millis() -  temps_sortie_audio > 490) && sortie_audio == LOW) {
	temps_sorti_audio = millis();
	sortie_audio = HIGH:
	}
	
}
for(int compte_a_rebours; compte_a_rebours < 45; compte_a_rebours++) // Si nombre de secondes écoulés < 10s
{
	if((millis() - temps_sortie_audio > 10) && sortie_audio == HIGH) 
{
	temps_sortie_audio = millis();
	
	sortie_audio = LOW;
	
}

if ((millis() -  temps_sortie_audio > 320) && sortie_audio == LOW) {
	temps_sorti_audio = millis();
	sortie_audio = HIGH:
	}
	
}

while(sortie_audio == HIGH)
{
	if (micros() - temps_son > 830) // Fonction si micros() > à 830ms
{
	temps_son = micros();
	etat_son = !etat_son; // Inversion de l'état
	digitalWrite(son, etat_son);
	
}
}

Voilà, seulement, quand je transferts ce code sur ma belle Arduino (pour tester le code avant de l'inscrire sur mon ATTiny). Je n'entends rien pendant environ 1sec, puis j'entends le son sortir, sans arrêt. Voilà, c'est là où je bloque. C'est pas normal que ça sonne sans arrêt.

J'espère que vous pourrez m'aider.
Binairement, Adri

Dejà ici problème :

for(int compte_a_rebour; compte_a_rebours < 40; compte_a_rebours++)

compte_a_rebour =/= compte_a_rebours

bonjour,
+1
mais pourquoi melanger micros et millis?
mais découpe ton coupe en plusieurs sections, ca sera plus simple et tu pourras modifier les temps dans les déclarations.
temps3
bip3
temps2
bip2
temps1
bip1

Bonjour,

Un truc dans ce genre ne t'irai pas ?
Ça peut au moins servir de base pour ton code.

@B@tto

Héhé, j'ai fait l'erreur de mettre le premier jet du code. Du coup, il y a plein d'erreurs. Le code sur l'arduino est lui sans faute, enfin normalement.

@infobarquee

micros() pour pouvoir faire une fréquence plus haute que 500Hz.
Par contre j'ai pas bien saisie ce que tu as dit par la suite.

@skywodd

Ah tient heureux de te voir ici =)

Le problème avec ton code, c'est qu'il utilise delay(), je ne peux pas l'utiliser, cela créerai des soucis avec les autres fonctions de ma bombe. Autres chose, il faut bien se remettre dans le contexte. La bombe sera en plein milieu d'un terrain, entre les billes des airsoft. On ne peut que savoir où en est le compte à rebours de la bombe avec du son, c'est pour cela que je voulais faire :
30sec => 1bip/s pour signaler que la bombe a été enclenchée.
10sec => 2bip/s pour signaler que ça urge, qui faut se grouiller !
5sec => 3bip/s pour signaler que c'est trop tard, sachant qu'il faut rester 5 sec sur le bouton pour activer/désactiver la bombe.

Je pense vraiment que cela doit pouvoir se faire sans trop de difficulté. J'imaginais donc avec des for et un while, mais apparemment ça ne marche pas =(

EDIT :

Une partie du code marche si je ne place qu'une boucle for et que je modifie pour mettre

	if ((micros() - temps_son > 830) && sortie_audio == HIGH) // Fonction si micros() > à 830ms

cela marche, cependant, si je place ensuite les deux autres for, la fréquence des bips ne change pas.

EDIT 2 :

J'ai finalement viré le for pour passer tout en if. Ce n'est peut-être pas propre mais ça marche !

 long temps_sortie_audio;
int compte_a_rebours = 0;
boolean sortie_audio = LOW;
boolean etat_son = LOW;
int son = 8;
long temps_son;
void setup()
{
	pinMode(son, OUTPUT);
	}

void loop()
 // Si nombre de secondes écoulés < à 35s
{
		
if (compte_a_rebours < 30)
{
if((millis() - temps_sortie_audio > 30) && sortie_audio == HIGH) 
{
	temps_sortie_audio = millis();
	sortie_audio = LOW;
}

if ((millis() -  temps_sortie_audio > 970) && sortie_audio == LOW) 
{
	temps_sortie_audio = millis();
	sortie_audio = HIGH;
	compte_a_rebours++;
	}
}

if(compte_a_rebours < 50  && compte_a_rebours >= 30)
{
	if((millis() - temps_sortie_audio > 30) && sortie_audio == HIGH) 
{
	temps_sortie_audio = millis();
	sortie_audio = LOW;
}

if ((millis() -  temps_sortie_audio > 470) && sortie_audio == LOW) 
{
	temps_sortie_audio = millis();
	sortie_audio = HIGH;
	compte_a_rebours++;
	}
}


if(compte_a_rebours < 65 && compte_a_rebours >= 50)
{
	if((millis() - temps_sortie_audio > 30) && sortie_audio == HIGH) 
{
	temps_sortie_audio = millis();
	sortie_audio = LOW;
}

if ((millis() -  temps_sortie_audio > 300) && sortie_audio == LOW) 
{
	temps_sortie_audio = millis();
	sortie_audio = HIGH;
	compte_a_rebours++;
	}
}

if ((micros() - temps_son > 830) && sortie_audio == HIGH)// Fonction si micros() > à 830ms
{
	temps_son = micros();
	etat_son = !etat_son; // Inversion de l'état
	digitalWrite(son, etat_son);
	
}
}

Merci en tout cas d'avoir pris le temps de m'aider. Adri