Étape 2: Code
// TONES ==========================================
Commencez par définir la relation entre / / note, période et fréquence. #define c 3830 / / 261 Hz #define d 3400 / / 294 Hz #define e 3038 / / 329 Hz #define f 2864 / / 349 Hz #define g 2550 / / 392 Hz #define a 2272 / / b 440 Hz #define 2028 / / 493 Hz #define 1912 C / / 523 Hz / / définir une note spéciale, « R », pour représenter un repos #define R 0 / / SETUP === / / Set up haut-parleur sur une goupille PWM (numérique 9 10 ou 11) int speakerOut = 9 ; int speakerOnTime = 250 ; Déclarer redOnTime un int et la valeur 250 mseconds int speakerOffTime = 0 ; Déclarer redOffTime un int et de 250 / / voulons-nous débogage sur hors série ? 1 pour Oui, 0 pour aucune int DEBUG = 1 ; int redled = 10 ; Déclarer redLEDPin un int et la valeur broche 20 int redledOnTime = 250 ; Déclarer redOnTime un int et la valeur 250 mseconds int redledOffTime = 0 ; Déclarer redOffTime un int et la valeur 250 int yellowled = 11 ; Déclarer redLEDPin un int et la valeur broche 20 int yellowledOnTime = 250 ; Déclarer redOnTime un int et la valeur 250 mseconds int yellowledOffTime = 0 ; Déclarer redOffTime un int et la valeur 250 bouton int = 2 ; int statePin = faible ; void setup() {pinMode (redled, sortie); / / Arduino dire que redLEDPin est une sortie pin pinMode (yellowled, sortie); / / Arduino dire que redLEDPin est une sortie pin pinMode (bouton, sortie); pinMode(speakerOut, OUTPUT) ; if (déboguer) {Serial.begin(9600); / / Set série out si nous voulons que le débogage}} / / mélodie et le calendrier === / / mélodie [] est un tableau de notes, accompagnée de battements [], / / qui définit longueur relative (# supérieur, note plus longue) int mélodie [] de chaque note = {c g, a, g, f, e, d, c, g, f, e, d, g} ; int bat [] = {8, 8, 8, 8, 16, 8, 8, 8, 16, 16, 8, 8} ; int elements_valides = sizeof(melody) / 2 ; Longueur de la mélodie, pour une boucle. Set global tempo longue de tempo = 10000 ; Régler la durée de pause entre les notes int pause = 1000 ; La variable de boucle pour augmenter la longueur de repos int rest_count = 100 ; <-BLETCHEROUS HACK ; Voir les NOTES / / Initialize core variables int tone_ = 0 ; battre int = 0 ; longue durée = 0 ; JOUER un son === / / impulsion l’orateur pour jouer une tonalité pour un playTone() Sub durée particulière {long elapsed_time = 0; if (digitalRead(button)==HIGH) {si (tone_ > 0) {/ / si ce n’est pas un battement de repos, alors que le ton a / / joué moins longtemps que « duration », pulse haut-parleur hautes et basses tout en (elapsed_time < durée) {digitalWrite(speakerOut,HIGH) ; delayMicroseconds(tone_ / 2); / / bas digitalWrite (speakerOut FAIBLE) ; delayMicroseconds(tone_ / 2) ; Garder une trace de combien de temps nous avons pulsé += elapsed_time (tone_) ; {}} else {/ / repos battre ; fois boucle retardent pour (int j = 0; j < rest_count; j ++) {/ / Voir NOTE sur rest_count delayMicroseconds(duration);}}} } / / LET THE WILD commence RUMPUS === void loop() {/ / mettre en place un compteur pour tirer de la mélodie [] et [] bat pour (int j’ai = 0; j’ai playTone(); / / une pause entre les notes... delayMicroseconds(pause) ; analogWrite(speakerOut,500) ; digitalWrite(redled,HIGH) ; //Turn rouge allumée delay(redledOnTime) ; //Leave sur des redOnTime digitalWrite(redled,LOW) ; //Turn rouge LED off //Leave off pour redOffTime digitalWrite(yellowled,HIGH), delay(redledOffTime) ; //Turn LED rouge allumée delay(yellowledOnTime) ; //Leave sur pour redOnTime digitalWrite (yellowled FAIBLE) ; Tourner à LED rouge éteinte delay(yellowledOffTime) ; digitalWrite(speakerOut,HIGH) ; delayMicroseconds(tone_ / 2) ; Delay(speakerOnTime) ; Laisser redOnTime digitalWrite (speakerOut, basse) ; delayMicroseconds(tone_ / 2) ; Delay(speakerOffTime) ; Abandonner pour redOffTime digitalWrite(redled,HIGH) ; Tourner la LED rouge de delay(redledOnTime) ; Laisser redOnTime digitalWrite(redled,LOW) ; Tourner à LED rouge éteinte delay(redledOffTime) ; Abandonner pour redOffTime digitalWrite(yellowled,HIGH) ; Tourner la LED rouge de delay(yellowledOnTime) ; Laisser redOnTime digitalWrite(yellowled,LOW) ; Tourner à LED rouge éteinte delay(yellowledOffTime) ; Abandonner pour redOffTime}} / * * NOTES * le programme est censé tenir une tonalité pour microsecondes "duration". * Mensonges lies lies! Qu’elle détient pour au moins microsecondes « duration », _plus_ * toute charge créée par incremeting elapsed_time (pourrait être plus de * K 3 microsecondes) _plus_ surcharge due à une boucle et deux digitalWrites() ** ainsi, un ton de « duration » joue beaucoup plus lentement qu’un repos * de « durée. » rest_count crée une variable de boucle pour amener les battements « repos » * conformément aux battements de "ton" de la même longueur. ** rest_count sera affecté par l’architecture de circuit intégré et vitesse, ainsi que * généraux de n’importe quel mods de programme. Comportement passé y a aucune garantie d’avenir * performance. Votre kilométrage peut varier. Fusible lumineux et vous échapper. ** Cela pourrait utiliser un certain nombre d’améliorations: * ajouter le code à permettent au programmeur de spécifier combien de fois la mélodie doit * boucle avant de s’arrêter * ajouter une autre octave * MOVE tempo, pause et rest_count aux instructions #define * ré-écrire inclure le volume, à l’aide d’analogWrite, comme avec le deuxième programme à * http://www.arduino.cc/en/Tutorial/PlayMelody * ajoutez le code pour faire le tempo peut être définie par pot ou autre périphérique d’entrée * ajoutez le code pour prendre le tempo ou volume réglable de communication série * (0005 nécessite ou supérieur.) * Ajoutez le code pour créer un décalage de tonalité (supérieur ou inférieur) par le biais de pot etc * remplacer mélodie aléatoire avec l’ouverture des bars à 'Smoke on the Water' * /