Petit code pour un buzzer compteur de minutes...

Bonjour,

j’ai pondu ce petit code pour un ami. Il a besoin d’entendre compter les minutes sur une radiocommande de modélisme pour savoir à peu près quand l’accu sera vide…
Le principe : 1 beep = 1 minute écoulée, 2 beeps = 2 minute écoulées, etc…
J’ai ajouté un changement de fréquence de la note à chaque minute…

//petit programme pour faire bipper un buzzer du nombre de minutes qui s'écoulent.

// --------------connexion matérielles des broches(pins) ---------------
//const int PinBuzzer = 9; // sortie 9 connecté au buzzer
#define PinBuzzer 9

//----------------------     variables pour debug
int minutes=0;       // compteur pour jouer autant de beep que de minutes
int millisecondes=60000;    // 1 minute en millisecondes
int delta_freq=10;   // évolution de la frequence du beep
int duree=50;        // duree d'un beep
int freq=440;        // fréquence du beep (ici un La) 
int temp=0;          // utilisé dans la boucle
//-------------------------------------------------------

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

void loop() {

  if ( millis() > temp + millisecondes ) { // on teste si la durée est dépassée
    temp = millis();
    minutes++;
	for (int i=0; i<=minutes; i++){
	  tone( PinBuzzer, freq, duree );
	  freq += delta_freq;
	  delay(500);
    }
  }
  
}

Bien sûr pas besoin d’un nano pour faire ça ( un atTiny85 suffisait ) mais mon ami l’a déjà acheté quelques euro en chine évidamment.

Le soucis c’est que j’essai mon code sur le simulateur Tinkercad Circuits et cela ne produit pas du tout ce que j’espérai…

Etant débutant je ne vois pas trop ma bétise :slight_smile:

De plus mon ami me demande maintenant que le montage bipe à 3.30 minute env. : ben mince, comment faire avec mon petit code qui n’est prévu que pour compter les minutes ?

Merci d’avance du petit coup de main :slight_smile:

Gilles

Bonjour,

Tu ne réinitialises pas la valeur de freq. Il faut la réinitialiser après la boucle for.

Il y a aussi une problème ici:
int millisecondes=60000; // 1 minute en millisecondes
La valeur excède la taille d'un int. ce devrait être
unsigned long millisecondes=60000L; // 1 minute en millisecondes

idem pour temps

merci kamill je vais essayer :slight_smile:

//petit programme pour faire bipper un buzzer du nombre de minutes qui s'écoulent.

// --------------connexion matérielles des broches(pins) ---------------
//const int PinBuzzer = 9; // sortie 9 connecté au buzzer
#define PinBuzzer 9

//----------------------     variables pour debug
int minutes=0;       // compteur pour jouer autant de beep que de minutes
unsigned long millisecondes=2000L;  // 1 minute en millisecondes
unsigned long temp=0L;     // utilisé dans la boucle
int delta_freq=20;   // évolution de la frequence du beep
int start_freq=440;  // fréquence initiale (ici un La)
int duree=60;        // duree d'un beep
int freq=0;          // fréquence du beep joué
//-------------------------------------------------------

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

void loop() {
  freq =start_freq;
  
  if ( millis() > temp + millisecondes ) { // on teste si la durée est dépassée
    temp = millis();
    minutes++;
	for (int i=0; i<=minutes; i++){
	  tone( PinBuzzer, freq, duree );
	  freq += delta_freq;
	  delay(400);
    }
  }
  
}

mais je ne comprends pas pourquoi il fait 1 beep de plus !? ( pour la simulation j’ai paramétré pour qu’il compte toutes les 2 secondes )

edit: ah oui c’est le “<=minutes” du “for” qui fait ça il me semble… mais très vite il bipe sans arrêt !!!

Aussi comment le faire biper à 3.30 minutes ?

faut réviser les commentaires même quand on bidouille pour le test:)unsigned long millisecondes=2000L;  // 1 minute en millisecondes

ça dans une cinquantaine de jours ça va merder if ( millis() > temp + millisecondes ) { // on teste si la durée est dépassée il faut toujours procéder par soustraction if ( millis() - temp > millisecondes ) { // on teste si la durée est dépassée

Aussi comment le faire biper à 3.30 minutes ?

vous pourriez vérifier toutes les 30 secondes au lieu de toutes les minutes et faire un test spécial pour 3:30

mais très vite il bipe sans arrêt !!!

oui c'est à cause de vos 2 secondes au lieu de la minute d'attente --> dans la boucle for vous avez un   delay(400); donc dès que vous en êtes à 5 bips (5 x 400ms = 2s) la boucle for prend plus de 2 secondes à s'exécuter et donc le test sur millis() suivant dit que c'est déjà le moment de re-biper

Merci J-M-L,

super

merci beaucoup

Faut que je modifie tout ça pour compter toutes les 30 secondes et biper toute les minutes quand même et agir quand on arrive à 7 x 30 secondes.
Y-aurait-il une astuce pour détecter un nombre pair par exemple ?

PS: je ne pense pas que mon ami pilote son hélicoptère rc pendant 50 jours sans s'arréter :slight_smile: :slight_smile: :slight_smile:

cassiope34:
Faut que je modifie tout ça pour compter toutes les 30 secondes et biper toute les minutes quand même et agir quand on arrive à 7 x 30 secondes.
Y-aurait-il une astuce pour détecter un nombre pair par exemple ?

oui si vous comptez le nombre de fois que 30 secondes se sont écoulées en nombre entier int nbTicks; alors

if (nbTicks % 2 == 0) { // le modulo par 2 est nul ==> nombre pair
   ...
} else { // nombre impair
   ...
}

si on veut faire sans le modulo - on se souvient qu'en binaire le bit de poids faible représente les unités. si ce bit est à 0 alors on est pair, sinon on est impair (puisque tout le reste ce sont des puissance de 2, donc pair) --> il suffit de faire une masque sur le bit de poids faible

if (nbTicks & 0x1 == 0) {
   ... // bit de poids faible nul on est pair
} else {
   ... // bit de poids faible vaut 1, on est impair
}

cassiope34:
PS: je ne pense pas que mon ami pilote son hélicoptère rc pendant 50 jours sans s'arréter :slight_smile: :slight_smile: :slight_smile:

ce n'est pas une raison pour laisser des bugs :), faut prendre de bonnes habitudes dès le début

c'est vrai c'est vrai :slight_smile:

merci J-M-L

Bonjour,

j’ai essayé d’appliquer scrupuleusement vos conseils (merci J-M-L).
Comment cette version pourrait-elle être optimisée ?

Je rappelle le cahier des charges :

  • à chaque minute, autant de beep que de minutes passées.
  • des beeps en permanence lorsqu’on atteind 3.30 minutes
// petit programme pour faire bipper un buzzer du nombre de minutes qui s'écoulent.

#include "Pitches.h"   // uniquement si on veut jouer des notes précises enregistréees dans le fichier pitches.h
                       // voir https://www.arduino.cc/en/Tutorial/toneMelody

// --------------connexion matérielles des broches(pins) ---------------
//const int PinBuzzer = 9; // sortie 9 connecté au buzzer
#define PinBuzzer 9

//----------------------     variables pour debug
int minutes=0;       // compteur pour jouer autant de beep que de minutes
int demi_min=0;     // compteur du nombre de fois 30 sec
unsigned long trente_sec=30000L;  // 30 secondes en millisecondes
unsigned long temp=0L;     // utilisé dans la boucle
int delta_freq=10;   // évolution de la frequence du beep
int duree=50;        // duree d'un beep
int freq=440;        // fréquence du beep (ici un La) 
//-------------------------------------------------------

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

void loop() {

  if ( millis() - temp > trente_sec ) { // on teste si la durée est dépassée
    temp = millis();
    demi_min++;
    if (demi_min % 2 == 0) {    // le modulo par 2 est nul ==> nombre pair
      minutes++;
      for (int i=0; i<=minutes; i++){
        tone( PinBuzzer, freq, duree );
        freq += delta_freq;
        delay(100);
      }
    } else {
        if ( demi_min == 7 ) {          //  7 x 30 sec = 3.30 minutes
          for (int i=0; i<=100; i++){   //  que des beep sans arrêt... c'est l'alarme qu'il faut se poser.
            tone( PinBuzzer, freq, duree );
            delay(500);
          }
        }
      }
    }
  }

Peut-être peut-on se passer de la deuxième boucle “for” pour jouer un beep toute les 500 millisecondes sans arrêt… mais je ne vois pas trop comment faire !

merci à vous

Pitches.h (2.67 KB)

Il y a toujours le même problème
temp et trente_sec doivent être des unsigned long

oups ! oui oui, merci kamill

cassiope34:
Peut-être peut-on se passer de la deuxième boucle “for” pour jouer un beep toute les 500 millisecondes sans arrêt… mais je ne vois pas trop comment faire !

Comme ça (par exemple):

void loop() {
 if ( millis() - temp > trente_sec ) { // on teste si la durée est dépassée
   temp = millis();
   demi_min++;
   if (demi_min<7)
   {
     if (demi_min % 2 == 0) {    // le modulo par 2 est nul ==> nombre pair
       minutes++;
       for (int i = 0; i < minutes; i++) {
         tone( PinBuzzer, freq, duree );
         freq += delta_freq;
         delay(500);
       }
     }
   }
 }
 if ( demi_min >= 7 ) {          //  7 x 30 sec = 3.30 minutes
  tone( PinBuzzer, freq, duree );
  delay(500);
 }
}

Ah oui, tout simplement :slight_smile:

mais “demi_min” va continuer de s’implémenter sans arrêt ! c’est grave ?

Ce n’est pas grave tant que le programme fonctionne moins que 32768 demi-minutes (car déclaré comme int).
Si tu veux que demi_minute ne s’incrémente plus, tu mets l’incrémentation après le test “if (demi_min<7)”