Musik melodi som låter i mörkret (5 / 5 steg)
Steg 5:
så det u gå, ett trevligt och enkelt sätt att använda Arduino bara för skojs skull, här är den fullständiga koden
// TONES ==========================================
Börja med att definiera förhållandet mellan
Obs, period, och frekvens.
#define 3830 / / 261 Hz
#define RE 3400 / / 294 Hz
#define MI 3038 / / 329 Hz
#define FA 2864 / / 349 Hz
#define SOL 2550 / / 392 Hz
#define LA 2272 / / 440 Hz
#define SI 2028 / / 493 Hz
#define DOM 1912 / / 523 Hz
Definiera en särskild anmärkning, "R", som representerar en vila
#define resten 0
// SETUP ============================================
Ställ in högtalare på en PWM stift (digital 9, 10 eller 11)
int speakerOut = 9;
Vill vi felsökning på serial ut? 1 för Ja, 0 för no
int DEBUG = 1;
int sensorPin = A0; Välj input PIN-koden för ldr
unsigned int sensorValue = 0; variabel för att lagra värdet kommer från ldr
void setup() {
pinMode (speakerOut, produktionen);
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
om (DEBUG) {
Serial.BEGIN(9600); Ställa in följetong ut om vi vill felsökning
}
}
MELODI och TIMING ===
Melody [] är en matris av anteckningar, tillsammans med beats [],
som sätter varje ton relativa längd (högre #, längre anteckning)
int melodi [] = {RE, MI, RE, SI, vila, RE, MI, RE, SI, resten, LA, LA, FA, vila, SOL, SOL, RE, resten};
int slår [] = {8, 8, 8, 16, 64, 8, 8, 8, 16, 64,8,8,16,32,8,8,16,128};
int MAX_COUNT = sizeof(melody) / 2; Melody längd, för looping.
Ange övergripande tempo
långa tempo = 80000;
Ange längden på paus mellan anteckningar
int paus = 1000;
Loop variabel att öka resten längd
int rest_count = 100; <-BLETCHEROUS hacka; Se anteckningar
Initiera core variabler
int tone_ = 0;
int slå = 0;
lång varaktighet = 0;
// PLAY TONE ==============================================
Puls talaren att spela en ton för en viss varaktighet
void playTone() {
lång elapsed_time = 0;
om (tone_ > 0) {om (tone_ == 3400 || tone_ == 3038) {
digitalWrite (2, hög).
digitalWrite (3, låg).
digitalWrite (4, låg).
}
annat if (tone_ == 2028 || tone_ == 2272) {
digitalWrite (2, låg).
digitalWrite (3, hög).
digitalWrite (4, låg). }
annat if (tone_ == 2864 || tone_ == 2550) {digitalWrite (2, låg).
digitalWrite (3, låg).
digitalWrite (4, hög). } / / om detta inte är en resten beat, medan tonen har
spelat mindre långt än "varaktighet", puls högtalare hög och låg
medan (elapsed_time < varaktighet) {
digitalWrite(speakerOut,HIGH);
delayMicroseconds(tone_ / 2);
NED
digitalWrite (speakerOut, låg);
delayMicroseconds(tone_ / 2);
Hålla reda på hur länge vi pulsade
elapsed_time += (tone_);
}
}
annat {/ / resten slå, loop gånger försenar
för (int j = 0; j < rest_count; j ++) {/ / se anmärkning på rest_count
delayMicroseconds(duration);
}
}
}
LÅT VILDA BRÅK BÖRJA ===
void loop() {
Ställ in en räknare för att dra från melody [] och [slag]
Läs värdet från ldr:
sensorValue = analogRead(sensorPin);
IF(sensorValue<500) {
//
//
för (int jag = 0; jag < MAX_COUNT; i ++) {
tone_ = melodi [i];
slå = beats [i];
längd = beat * tempo; Ställ in timing
playTone();
En paus mellan anteckningar...
delayMicroseconds(pause);
om (DEBUG) {/ / om felsökning, rapport loop, tonar, beat, och varaktighet
Serial.Print(i);
Serial.Print(":");
Serial.Print(Beat);
Serial.Print("");
Serial.Print(tone_);
Serial.Print("");
Serial.println(duration);
}
{}} / / Ställ lampan på
annat {
digitalWrite (2, låg).
digitalWrite (3, låg).
digitalWrite (4, låg). } / / Ställ lampan på
}
den felsökning del kan vara till hjälp för utbildningsändamål, eftersom du kan se värdena att plockas och vilka toner som spelas av enheten