Bonjour à tous,
J'ai commencé un projet dans lequel j'utilise une RTC avec un afficheur, un buzzer et d'autres modules de toutes sortes et j'utilise des interruptions et des Timers pour éviter les délai mais pour le buzzer je n'arrive pas à le faire fonctionner sans délai.
Je suis obligé de faire ce genre de code :
tone(buzzer, 1500);
delay(300);
J'ai déjà essayé avec ce genre de code mais ça ne marche pas non plus :
if(millis() - temps > 300){
temps = millis();
tone(buzzer, 1500);
}
Mon idée est d'utiliser les interruptions avec les Timers (ce genre de truc : ISR(TIMER0_COMPA_vect) )
que j'utilise déjà pour le reste de mon code.
Et dans lequel je met ma ligne de code pour mon buzzer.
Mais ça veut dire qu'à chaque fois mon Timer est vrai mon buzzer va sonner et je voudrais le déclencher seulement quand j'ai ma condition d'alarme qui est vrai.
Du coup si quelqu'un a une idée je suis preneur ou pourrais me dire s'il est possible de d'activer/desactiver les interruptions quand elles sont en mode Timers 
Si j'ai pas bien expliqué, hésitez pas à redemander 
Bonjour,
j'ai bosser sur ce genre de problématique, voici quelques programmes:
//prog faire sonner le buzzer quand on appuie sur le bouton
int etatbouton = 7 ;
void setup()
{
Serial.begin( 9600 ) ;
pinMode( 7, INPUT_PULLUP ) ;
}
void loop()
{
boolean etatbouton = digitalRead( 7 ) ;
Serial.println( etatbouton ) ;
delay( 250 ) ;
if ( boolean etatbouton = digitalRead( 7 ) == 0 )
{
tone( 8, 65535 ) ;
Serial.println( "it's ok" ) ;
}
else
{
noTone( 8 ) ;
Serial.println( "nope" ) ;
}
}
//faire sonner le buzzer selon l'état de la led, si led allumé le busser sonne
const byte pinled = 2 ;
int buzzer = 8 ;
unsigned long tempoActive = 0 ;
unsigned long tempDepart = 0 ;
boolean etat_led ;
void setup()
{
Serial.begin( 9600 ) ;
pinMode( pinled, OUTPUT ) ;
pinMode( buzzer, OUTPUT ) ;
etat_led = 0 ;
tempDepart = millis() ;
}
void loop()
{
tempoActive = millis() ;
if ( ( tempoActive - tempDepart ) >= 750 )
{
etat_led = !etat_led ;
digitalWrite( pinled, etat_led ) ;
tempDepart = millis() ;
}
if ( digitalRead( pinled ) == HIGH )
{
digitalWrite( buzzer, HIGH ) ;
Serial.println( "it's ok" ) ;
}
else
{
digitalWrite( buzzer, LOW ) ;
Serial.println( "nope" ) ;
}
}
//correction prog faire sonner buzzer selon l'état de la led
const byte ledPin = 2 ;
const byte buzzerPin = 8 ;
unsigned long tempoActive = 0 ;
unsigned long tempDepart = 0 ;
boolean ledAllumee ;
const unsigned int dureeTempo = 750;
void setup()
{
Serial.begin( 115200 ) ; // POURQUOI aller à 9600?
pinMode( ledPin, OUTPUT ) ;
ledAllumee = false ; // 0 c'est ce n'est sémantiquement pas un booléen
digitalWrite( ledPin, LOW ); // pas nécessaire, juste pour bien montrer les conditions initiales
pinMode( buzzerPin, OUTPUT) ;
digitalWrite( buzzerPin, LOW ) ; // pas nécessaire, juste pour bien montrer les conditions initiales
tempDepart = millis() ;
}
void loop()
{
tempoActive = millis() ;
if ( ( tempoActive - tempDepart ) >= dureeTempo )
{
ledAllumee = ! ledAllumee ;
digitalWrite( ledPin, ledAllumee ? HIGH : LOW ) ; // pour la bonne sémantique
if (ledAllumee)
{
digitalWrite( buzzerPin, HIGH ) ;
Serial.println( "it's ok" ) ;
}
else
{
digitalWrite( buzzerPin, LOW ) ;
Serial.println( "nope" ) ;
}
tempDepart += dureeTempo ; // si vous voulez ne pas tenir compte du temps d'exécution
}
}
//faire sonner le buzzer->"bip","rien","bip","rien"...etc
int buzzer = 8 ;// Borne de sortie
void setup()
{
pinMode(buzzer, OUTPUT) ; // Définir la sortie du buzzer
}
void loop()
{
digitalWrite( buzzer, HIGH ) ;// Faire du bruit
delay( 250 ) ;// Attendre 250ms
digitalWrite( buzzer, LOW ) ;// Silence
delay( 250 ) ;// Attendre 250ms
}
Regarde dans ces programmes, j'ai souvent utiliser la fonction millis().
J’espère que tu trouveras se que tu cherche. ^^
Je vais jeter un coup d’œil à tout ça merci 
Derien ^^
Tu peux aussi aller jeter un coup d’œil à ce topic (il ma beaucoup aidé):
https://forum.arduino.cc/index.php?topic=484805.0