tone(buzzer,valeur_pwm);
Le sujet ne parle pas de note variable. Il parle de fréquence fixe:
La PWM émanant de la broche D5 de l'Arduino a une fréquence d'environ 980 Hz.
Dans votre projet, Arduino fabrique une seule fréquence, celle du PWM que vous ne pouvez pas changer facilement. Vous pouvez juste changer le rapport cyclique et comme il y a un buzzer derrière, cela impose la valeur. Pour plus d'info:
-> PWM
-> fonction analogWrite.
etat=digitalRead(bouton) ;
Pour être tranquile, on recommande de mettre le bouton en entrée. Mais cela devrait fonctionner car le micro met ses entrées par défaut à l'initialisation en entrée. Même moi qui suis économe en code, je programme mes pins en entrées.
mais sur le schéma, il n'y a pas de résistance de pulldonw comme demandé ("bouton poussoir avec résistance de pulldown"). Souvent avec une Uno, on utilise les pullup car il y an a dans le micro. Mais c'est plus compliqué à comprendre.
int pin=12;
int valeur_pwm=0;
char buzzer=12;
int bouton=7;
int etat;
int compteur=0;
Pour celui qui lit ce n'est pas facile à suivre. Dedans, il y a des n° de broches et des variables. Un nom un peu plus explicite ou mieux un commentaire permet d'éclaircir
le N°12 sort deux fois. C'est le numéro de la broche? c'est une valeur à envoyer?
la pin 12 doit être une entrée parce qu'elle est reliée à une sortie (celle du multiplexeur) et on ne relie pas deux sorties ensemble en général. Si l'une impose un 0V et que l'autre impose un 5V, il y a un problème. La pin 12 doit servir plus tard, dans une question ultérieure.
int pin=12;
Pin? laquelle? Pourquoi faire?
Il vaut mieux écrire:
int pinSortieMultiplexeur=12;
int pin; // Broche pour lire le signal en sortie du multiplexeur
....
void setup() {
pinMode(pin,OUTPUT);
etat=digitalRead(bouton);
}
Dans l'initialisation on est au moins obligé de déclarer les broches qui sont des sorties. Ici c'est D
, D3, D4 et D5. Si onne met pas ces broches en tant que sortie, elle resteront en entrée.
La broche pin doit être en entrée (voir plus haut)
Le setup est exécuté une fois pour toutes. Une fois seulement. Donc la lecture du bouton ne pouvant pas être fait qu'une seule fois, elle doit être dans loop et pas dans setup.
digitalWrite(pin,valeur_pwm);
Quel est le signal qui doit sortir du PWM? Sur quelle broche le signal doit sortir?
if(etat==LOW)
{
compteur++;
if(compteur>4)
compteur=0
}
Il n'est pas marqué le compteur s'incrémente tant que le bouton est LOW sinon si on laisse le doigt appuyé dessus, on aurait une incrémentation toutes les 10µs environ. Quand on lache on a plutôt une valeur au hasard. C'est au moment ou on appuie qu'il faut incrémenter le compteur. Il faut donc mémoriser que l'on en a déjà tenu compte. Une image: on te charge de donner une collation chaque fois qu'une personne franchit la porte. Quand une personne arrive tu lui donne l'apéro. Mais une fois le tour de salle fait, tu ne lui donne pas de nouveau l'apéro. Tu as mémorisé que tu lui a déjà offert. Quand elle sort, tu efface ta mémoire et ainsi si elle rentre de nouveau, elle aura un nouveau verre. C'est pareil pour le bouton.
Il y a aussi précisé un délai de 100ms pour l'anti rebond.
tone(buzzer,valeur_pwm);
delay(1000);
noTone(buzzer);
On n'a pas à faire du bruit ou pas, on récupère le bruit du PWM
je vois très bien mais j'ai pas vu comment le faire donc je vois pas.
Il y a beaucoup de choses à faire en même temps. au début, tu peux scinder le problème en plusieurs morceaux:
- mettre la sortie D5 pour qu'elle délivre un signal à 980Hz
- incrémenter le compteur quand on appuie sur le bouton
- envoyer le compteur sur le multiplexeur.
C'est presque trois tâches indépendantes. On peut en régler une puis l'autre... En essayant de faire tout en même temps, cela risque d'embrouiller. Si on fait une tâche après l'autre on a l'impression d'avancer. Et on peut dépanner facilement un petit code.