Project: ArduinoPhotosensitiveAlarmII

This week I did some improvement about this alarm.

  1. Change the song and add another
  2. Add a tilt switch to change between different music

The songs I choose are background music from mario game. I found the music notes and wrote it in the Arduino.

//Mario main theme melody
int melody[] = {
 NOTE_E7, NOTE_E7, 0, NOTE_E7,
 0, NOTE_C7, NOTE_E7, 0,
 NOTE_G7, 0, 0, 0,
 NOTE_G6, 0, 0, 0,
 
 NOTE_C7, 0, 0, NOTE_G6,
 0, 0, NOTE_E6, 0,
 0, NOTE_A6, 0, NOTE_B6,
 0, NOTE_AS6, NOTE_A6, 0,
 
 NOTE_G6, NOTE_E7, NOTE_G7,
 NOTE_A7, 0, NOTE_F7, NOTE_G7,
 0, NOTE_E7, 0, NOTE_C7,
 NOTE_D7, NOTE_B6, 0, 0,
 
 NOTE_C7, 0, 0, NOTE_G6,
 0, 0, NOTE_E6, 0,
 0, NOTE_A6, 0, NOTE_B6,
 0, NOTE_AS6, NOTE_A6, 0,
 
 NOTE_G6, NOTE_E7, NOTE_G7,
 NOTE_A7, 0, NOTE_F7, NOTE_G7,
 0, NOTE_E7, 0, NOTE_C7,
 NOTE_D7, NOTE_B6, 0, 0
};
//Mario main them tempo
int tempo[] = {
 12, 12, 12, 12,
 12, 12, 12, 12,
 12, 12, 12, 12,
 12, 12, 12, 12,
 
 12, 12, 12, 12,
 12, 12, 12, 12,
 12, 12, 12, 12,
 12, 12, 12, 12,
 
 9, 9, 9,
 12, 12, 12, 12,
 12, 12, 12, 12,
 12, 12, 12, 12,
 
 12, 12, 12, 12,
 12, 12, 12, 12,
 12, 12, 12, 12,
 12, 12, 12, 12,
 
 9, 9, 9,
 12, 12, 12, 12,
 12, 12, 12, 12,
 12, 12, 12, 12,
};
//Underworld melody
int underworld_melody[] = {
 NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
 NOTE_AS3, NOTE_AS4, 0,
 0,
 NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
 NOTE_AS3, NOTE_AS4, 0,
 0,
 NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
 NOTE_DS3, NOTE_DS4, 0,
 0,
 NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
 NOTE_DS3, NOTE_DS4, 0,
 0, NOTE_DS4, NOTE_CS4, NOTE_D4,
 NOTE_CS4, NOTE_DS4,
 NOTE_DS4, NOTE_GS3,
 NOTE_G3, NOTE_CS4,
 NOTE_C4, NOTE_FS4, NOTE_F4, NOTE_E3, NOTE_AS4, NOTE_A4,
 NOTE_GS4, NOTE_DS4, NOTE_B3,
 NOTE_AS3, NOTE_A3, NOTE_GS3,
 0, 0, 0
};
//Underwolrd tempo
int underworld_tempo[] = {
 12, 12, 12, 12,
 12, 12, 6,
 3,
 12, 12, 12, 12,
 12, 12, 6,
 3,
 12, 12, 12, 12,
 12, 12, 6,
 3,
 12, 12, 12, 12,
 12, 12, 6,
 6, 18, 18, 18,
 6, 6,
 6, 6,
 6, 6,
 18, 18, 18, 18, 18, 18,
 10, 10, 10,
 10, 10, 10,
 3, 3, 3
};

For the tilt switch, I changed the circuit as below:

circuit2.jpg

Then change the code to make sure when the status of tilt switch changes, the song will change.

void setup()
{
 
 Serial.begin(9600);
 pinMode(tonePin,OUTPUT);
 pinMode(switchPin,INPUT);
 length = sizeof(melody)/sizeof(melody[0]);
}
void loop()
{
 sing(2);
 sing(1); 
}
int song = 0;
 
void sing(int s) {
 song = s;
 if (song == 2) {
 //Serial.println(" 'Underworld Theme'");
 int size = sizeof(underworld_melody) / sizeof(int);
 for (int thisNote = 0; thisNote < size; thisNote++) {
int noteDuration = 1000 / underworld_tempo[thisNote];
 sensorValue = analogRead(A0);
Serial.println(sensorValue,DEC);
 switchState = digitalRead(switchPin);
 Serial.println(switchState);
 
 if(switchState ==HIGH){
 song = 1;
 break;
 }
 if(sensorValue<500){
 break;
 }
buzz(melodyPin, underworld_melody[thisNote], noteDuration);
 int pauseBetweenNotes = noteDuration * 1.30;
 delay(pauseBetweenNotes);
 
 // stop the tone playing:
 buzz(tonePin, 0, noteDuration);
 
 }
 
 } else {
 
 //Serial.println(" 'Mario Theme'");
 int size = sizeof(melody) / sizeof(int);
 for (int thisNote = 0; thisNote < size; thisNote++) {

int noteDuration = 1000 / tempo[thisNote];
 sensorValue = analogRead(A0);
 Serial.println(sensorValue,DEC);
 switchState = digitalRead(switchPin);
 Serial.println(switchState);

 if(switchState !=HIGH){
 song=2;
 break;
 }
 if(sensorValue<500){
 break;
 }
 buzz(tonePin, melody[thisNote], noteDuration);
 int pauseBetweenNotes = noteDuration * 1.30;
 delay(pauseBetweenNotes);
 // stop the tone playing:
 buzz(tonePin, 0, noteDuration);
 
 }
 }
}
// 
void buzz(int targetPin, long frequency, long length) {
 digitalWrite(13, HIGH);
 long delayValue = 1000000 / frequency / 2; // calculate the delay value between transitions
 //// 1 second's worth of microseconds, divided by the frequency, then split in half since
 //// there are two phases to each cycle
 long numCycles = frequency * length / 1000; // calculate the number of cycles for proper timing
 //// multiply frequency, which is really cycles per second, by the number of seconds to
 //// get the total number of cycles to produce
 for (long i = 0; i < numCycles; i++) { // for the calculated length of time...
 digitalWrite(targetPin, HIGH); // write the buzzer pin high to push out the diaphram
 delayMicroseconds(delayValue); // wait for the calculated delay value
 digitalWrite(targetPin, LOW); // write the buzzer pin low to pull back the diaphram
 delayMicroseconds(delayValue); // wait again or the calculated delay value
 }
 digitalWrite(13, LOW);
 
}
Publicités
Publié dans Uncategorized