Rain Ashford / Mbed 2 deprecated twinkle

Dependencies:   mbed

Committer:
Rainycat
Date:
Sun Apr 04 15:18:03 2010 +0000
Revision:
0:ace18d31cd7e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rainycat 0:ace18d31cd7e 1 #include "mbed.h"
Rainycat 0:ace18d31cd7e 2
Rainycat 0:ace18d31cd7e 3 //DigitalOut myled(LED1);
Rainycat 0:ace18d31cd7e 4
Rainycat 0:ace18d31cd7e 5 //int main() {
Rainycat 0:ace18d31cd7e 6 // while(1) {
Rainycat 0:ace18d31cd7e 7 // myled = 1;
Rainycat 0:ace18d31cd7e 8 // wait(0.2);
Rainycat 0:ace18d31cd7e 9 // myled = 0;
Rainycat 0:ace18d31cd7e 10 // wait(0.2);
Rainycat 0:ace18d31cd7e 11 // }
Rainycat 0:ace18d31cd7e 12 //}
Rainycat 0:ace18d31cd7e 13
Rainycat 0:ace18d31cd7e 14 void setup();
Rainycat 0:ace18d31cd7e 15 void loop();
Rainycat 0:ace18d31cd7e 16 void flash_eyes();
Rainycat 0:ace18d31cd7e 17 int read_accel();
Rainycat 0:ace18d31cd7e 18 void beep(DigitalOut speakerPin, int frequency, long duration);
Rainycat 0:ace18d31cd7e 19 void play(DigitalOut speakerPin, const char *note, long duration);
Rainycat 0:ace18d31cd7e 20 void play_tune();
Rainycat 0:ace18d31cd7e 21
Rainycat 0:ace18d31cd7e 22 //DigitalOut ledPin = 13; // LED is connected to digital pin 13
Rainycat 0:ace18d31cd7e 23 DigitalOut speakerPin(p8); // speaker connected to p8
Rainycat 0:ace18d31cd7e 24 DigitalOut catseye1(LED1); // cat's eye no1
Rainycat 0:ace18d31cd7e 25 DigitalOut catseye2(LED2); // cat's eye no2
Rainycat 0:ace18d31cd7e 26 //DigitalOut moveSensor = 3; // analogue input for accelerometer
Rainycat 0:ace18d31cd7e 27 //DigitalOut buttonPin = 11; // button input
Rainycat 0:ace18d31cd7e 28
Rainycat 0:ace18d31cd7e 29 // A note in one octave is twice the frequency of the same note in the octave
Rainycat 0:ace18d31cd7e 30 // below. We define here the frequencies of the notes in octave 8. To get
Rainycat 0:ace18d31cd7e 31 // notes in lower octaves, we just divide by two however many times.
Rainycat 0:ace18d31cd7e 32
Rainycat 0:ace18d31cd7e 33 #define NOTE_C8 4186
Rainycat 0:ace18d31cd7e 34 #define NOTE_CSHARP8 4434
Rainycat 0:ace18d31cd7e 35 #define NOTE_D8 4698
Rainycat 0:ace18d31cd7e 36 #define NOTE_DSHARP8 4978
Rainycat 0:ace18d31cd7e 37 #define NOTE_E8 5274
Rainycat 0:ace18d31cd7e 38 #define NOTE_F8 5587
Rainycat 0:ace18d31cd7e 39 #define NOTE_FSHARP8 5919
Rainycat 0:ace18d31cd7e 40 #define NOTE_G8 6271
Rainycat 0:ace18d31cd7e 41 #define NOTE_GSHARP8 6644
Rainycat 0:ace18d31cd7e 42 #define NOTE_A8 7040
Rainycat 0:ace18d31cd7e 43 #define NOTE_ASHARP8 7458
Rainycat 0:ace18d31cd7e 44 #define NOTE_B8 7902
Rainycat 0:ace18d31cd7e 45
Rainycat 0:ace18d31cd7e 46 // This is an array of note frequencies. Index the array essentially by note
Rainycat 0:ace18d31cd7e 47 // letter multiplied by two (A = 0, B = 2, C = 4, etc.). Add one to index for
Rainycat 0:ace18d31cd7e 48 // "sharp" note. Where no sharp note exists, the natural note is just
Rainycat 0:ace18d31cd7e 49 // duplicated to make this indexing work. The play() function below does all
Rainycat 0:ace18d31cd7e 50 // of this for you :)
Rainycat 0:ace18d31cd7e 51
Rainycat 0:ace18d31cd7e 52 int octave_notes[14] = {
Rainycat 0:ace18d31cd7e 53 NOTE_A8, NOTE_ASHARP8,
Rainycat 0:ace18d31cd7e 54 NOTE_B8, NOTE_B8,
Rainycat 0:ace18d31cd7e 55 NOTE_C8, NOTE_CSHARP8,
Rainycat 0:ace18d31cd7e 56 NOTE_D8, NOTE_DSHARP8,
Rainycat 0:ace18d31cd7e 57 NOTE_E8, NOTE_E8,
Rainycat 0:ace18d31cd7e 58 NOTE_F8, NOTE_FSHARP8,
Rainycat 0:ace18d31cd7e 59 NOTE_G8, NOTE_GSHARP8,
Rainycat 0:ace18d31cd7e 60 };
Rainycat 0:ace18d31cd7e 61
Rainycat 0:ace18d31cd7e 62 // This variable tracks the current state of the eye LEDs.
Rainycat 0:ace18d31cd7e 63 int eyes = 0;
Rainycat 0:ace18d31cd7e 64
Rainycat 0:ace18d31cd7e 65 // Arduino runs this bit of code first, then repeatedly calls loop() below. So
Rainycat 0:ace18d31cd7e 66 // all initialisation of variables and setting of initial pin modes (input or
Rainycat 0:ace18d31cd7e 67 // output) can be done here.
Rainycat 0:ace18d31cd7e 68
Rainycat 0:ace18d31cd7e 69 void setup() {
Rainycat 0:ace18d31cd7e 70 //pinMode(ledPin, OUTPUT); // sets the ledPin to be an output
Rainycat 0:ace18d31cd7e 71 //pinMode(speakerPin, OUTPUT); // sets the speakerPin to be an output
Rainycat 0:ace18d31cd7e 72 //eyes = LOW; // initial state of cats eyes is LOW
Rainycat 0:ace18d31cd7e 73 //pinMode(catseye1, OUTPUT); // sets the cats eye1 to be an output
Rainycat 0:ace18d31cd7e 74 //pinMode(catseye2, OUTPUT); // sets the cats eye2 to be an output
Rainycat 0:ace18d31cd7e 75 //pinMode(buttonPin, INPUT); // sets the cats eye2 to be an output
Rainycat 0:ace18d31cd7e 76 // Serial.begin(9600);
Rainycat 0:ace18d31cd7e 77 }
Rainycat 0:ace18d31cd7e 78
Rainycat 0:ace18d31cd7e 79 // Arduino will run this over and over again once setup() is done.
Rainycat 0:ace18d31cd7e 80
Rainycat 0:ace18d31cd7e 81 void loop()
Rainycat 0:ace18d31cd7e 82 {
Rainycat 0:ace18d31cd7e 83 //read_accel();
Rainycat 0:ace18d31cd7e 84 play_tune(); // call the play_tune() function
Rainycat 0:ace18d31cd7e 85 wait(1.0); // delay for 1 second
Rainycat 0:ace18d31cd7e 86 }
Rainycat 0:ace18d31cd7e 87
Rainycat 0:ace18d31cd7e 88 // -------------------------------------------------------------------------
Rainycat 0:ace18d31cd7e 89
Rainycat 0:ace18d31cd7e 90 // A function to toggle the cat's eyes on and off.
Rainycat 0:ace18d31cd7e 91 void flash_eyes()
Rainycat 0:ace18d31cd7e 92 {
Rainycat 0:ace18d31cd7e 93 // Invert the desired state of the cat's eyes:
Rainycat 0:ace18d31cd7e 94 eyes = !eyes;
Rainycat 0:ace18d31cd7e 95 // if (eyes == LOW) {
Rainycat 0:ace18d31cd7e 96 // eyes = HIGH;
Rainycat 0:ace18d31cd7e 97 // } else {
Rainycat 0:ace18d31cd7e 98 // eyes = LOW;
Rainycat 0:ace18d31cd7e 99 // }
Rainycat 0:ace18d31cd7e 100
Rainycat 0:ace18d31cd7e 101 catseye1 = eyes;
Rainycat 0:ace18d31cd7e 102 catseye2 = eyes;
Rainycat 0:ace18d31cd7e 103 // Write the new value to all the LED pins:
Rainycat 0:ace18d31cd7e 104 //digitalWrite(ledPin, eyes);
Rainycat 0:ace18d31cd7e 105 //digitalWrite(catseye1, eyes);
Rainycat 0:ace18d31cd7e 106 //digitalWrite(catseye2, eyes);
Rainycat 0:ace18d31cd7e 107 }
Rainycat 0:ace18d31cd7e 108
Rainycat 0:ace18d31cd7e 109 // -------------------------------------------------------------------------
Rainycat 0:ace18d31cd7e 110
Rainycat 0:ace18d31cd7e 111 // Read accelerometer
Rainycat 0:ace18d31cd7e 112 int read_accel()
Rainycat 0:ace18d31cd7e 113 {
Rainycat 0:ace18d31cd7e 114 // static int last_accel = 0;
Rainycat 0:ace18d31cd7e 115 // int in = analogRead(moveSensor);
Rainycat 0:ace18d31cd7e 116 // int diff = last_accel - in;
Rainycat 0:ace18d31cd7e 117 // last_accel = in;
Rainycat 0:ace18d31cd7e 118 // if (diff < -5 || diff > 5) {
Rainycat 0:ace18d31cd7e 119 // return diff;
Rainycat 0:ace18d31cd7e 120 // }
Rainycat 0:ace18d31cd7e 121 return 0;
Rainycat 0:ace18d31cd7e 122 }
Rainycat 0:ace18d31cd7e 123
Rainycat 0:ace18d31cd7e 124 // To produce a tone, this function toggles the speaker output pin at the
Rainycat 0:ace18d31cd7e 125 // desired frequency (in Hz). It calculates how many times to do this to
Rainycat 0:ace18d31cd7e 126 // produce a note of the desired length (in milliseconds).
Rainycat 0:ace18d31cd7e 127
Rainycat 0:ace18d31cd7e 128 void beep(DigitalOut speakerPin, int frequency, long duration)
Rainycat 0:ace18d31cd7e 129 {
Rainycat 0:ace18d31cd7e 130
Rainycat 0:ace18d31cd7e 131 int i;
Rainycat 0:ace18d31cd7e 132 long delayAmount = (long)(1000000/frequency);
Rainycat 0:ace18d31cd7e 133 long loopTime = (long)((duration*1000)/(delayAmount*2));
Rainycat 0:ace18d31cd7e 134
Rainycat 0:ace18d31cd7e 135 //int accel_diff = 0;
Rainycat 0:ace18d31cd7e 136 // int button_in = digitalRead(buttonPin);
Rainycat 0:ace18d31cd7e 137 for (i = 0; i < loopTime; i++) {
Rainycat 0:ace18d31cd7e 138 speakerPin = 1;
Rainycat 0:ace18d31cd7e 139 wait_us(delayAmount);
Rainycat 0:ace18d31cd7e 140 speakerPin = 0;
Rainycat 0:ace18d31cd7e 141 wait_us(delayAmount);
Rainycat 0:ace18d31cd7e 142 }
Rainycat 0:ace18d31cd7e 143 }
Rainycat 0:ace18d31cd7e 144
Rainycat 0:ace18d31cd7e 145 void play(DigitalOut speakerPin, const char *note, long duration)
Rainycat 0:ace18d31cd7e 146 {
Rainycat 0:ace18d31cd7e 147 int octave_number = 4; // default to octave 4
Rainycat 0:ace18d31cd7e 148 int i = 0;
Rainycat 0:ace18d31cd7e 149
Rainycat 0:ace18d31cd7e 150 // Check for valid note letter
Rainycat 0:ace18d31cd7e 151 if (note[i] >= 'A' && note[i] <= 'G') {
Rainycat 0:ace18d31cd7e 152 // Calculate index into octave_notes[]
Rainycat 0:ace18d31cd7e 153 int note_index = (note[i] - 'A') * 2;
Rainycat 0:ace18d31cd7e 154 i++;
Rainycat 0:ace18d31cd7e 155 // Check for sharp sign
Rainycat 0:ace18d31cd7e 156 if (note[i] == '#') {
Rainycat 0:ace18d31cd7e 157 note_index++;
Rainycat 0:ace18d31cd7e 158 i++;
Rainycat 0:ace18d31cd7e 159 }
Rainycat 0:ace18d31cd7e 160 // Check for an octave number
Rainycat 0:ace18d31cd7e 161 if (note[i] >= '0' && note[i] <= '8') {
Rainycat 0:ace18d31cd7e 162 octave_number = note[i] - '0';
Rainycat 0:ace18d31cd7e 163 i++;
Rainycat 0:ace18d31cd7e 164 }
Rainycat 0:ace18d31cd7e 165 // Fetch the note frequency from the octave_notes[] table
Rainycat 0:ace18d31cd7e 166 int frequency = octave_notes[note_index];
Rainycat 0:ace18d31cd7e 167
Rainycat 0:ace18d31cd7e 168 // That will be the frequency for the note in octave 8, so we
Rainycat 0:ace18d31cd7e 169 // need to divide it by two for each octave lower that we
Rainycat 0:ace18d31cd7e 170 // actually want.
Rainycat 0:ace18d31cd7e 171
Rainycat 0:ace18d31cd7e 172 // The '>>' operator is a useful shorthand that (for integers
Rainycat 0:ace18d31cd7e 173 // >= 0) basically translates to "divide by two this many
Rainycat 0:ace18d31cd7e 174 // times", so we will use that:
Rainycat 0:ace18d31cd7e 175
Rainycat 0:ace18d31cd7e 176 frequency = frequency >> (8 - octave_number);
Rainycat 0:ace18d31cd7e 177
Rainycat 0:ace18d31cd7e 178 // Actually play the note!
Rainycat 0:ace18d31cd7e 179 beep(speakerPin, frequency, duration);
Rainycat 0:ace18d31cd7e 180 }
Rainycat 0:ace18d31cd7e 181 }
Rainycat 0:ace18d31cd7e 182
Rainycat 0:ace18d31cd7e 183 void play_tune()
Rainycat 0:ace18d31cd7e 184 {
Rainycat 0:ace18d31cd7e 185 flash_eyes(); play(speakerPin, "C6", 500); // twin-
Rainycat 0:ace18d31cd7e 186 flash_eyes(); play(speakerPin, "C6", 500); // -kle
Rainycat 0:ace18d31cd7e 187 flash_eyes(); play(speakerPin, "G6", 500); // twin-
Rainycat 0:ace18d31cd7e 188 flash_eyes(); play(speakerPin, "G6", 500); // -kle
Rainycat 0:ace18d31cd7e 189 flash_eyes(); play(speakerPin, "A6", 500); // lit-
Rainycat 0:ace18d31cd7e 190 flash_eyes(); play(speakerPin, "A6", 500); // -tle
Rainycat 0:ace18d31cd7e 191 flash_eyes(); play(speakerPin, "G6", 1000); // star
Rainycat 0:ace18d31cd7e 192 flash_eyes(); play(speakerPin, "F6", 500); // how
Rainycat 0:ace18d31cd7e 193 flash_eyes(); play(speakerPin, "F6", 500); // i
Rainycat 0:ace18d31cd7e 194 flash_eyes(); play(speakerPin, "E6", 500); // won-
Rainycat 0:ace18d31cd7e 195 flash_eyes(); play(speakerPin, "E6", 500); // -der
Rainycat 0:ace18d31cd7e 196 flash_eyes(); play(speakerPin, "D6", 500); // what
Rainycat 0:ace18d31cd7e 197 flash_eyes(); play(speakerPin, "D6", 500); // you
Rainycat 0:ace18d31cd7e 198 flash_eyes(); play(speakerPin, "C6", 1000); // are
Rainycat 0:ace18d31cd7e 199
Rainycat 0:ace18d31cd7e 200 flash_eyes(); play(speakerPin, "G6", 500); // up
Rainycat 0:ace18d31cd7e 201 flash_eyes(); play(speakerPin, "G6", 500); // a-
Rainycat 0:ace18d31cd7e 202 flash_eyes(); play(speakerPin, "F6", 500); // -bove
Rainycat 0:ace18d31cd7e 203 flash_eyes(); play(speakerPin, "F6", 500); // the
Rainycat 0:ace18d31cd7e 204 flash_eyes(); play(speakerPin, "E6", 500); // world
Rainycat 0:ace18d31cd7e 205 flash_eyes(); play(speakerPin, "E6", 500); // so
Rainycat 0:ace18d31cd7e 206 flash_eyes(); play(speakerPin, "D6", 1000); // high
Rainycat 0:ace18d31cd7e 207 flash_eyes(); play(speakerPin, "G6", 500); // like
Rainycat 0:ace18d31cd7e 208 flash_eyes(); play(speakerPin, "G6", 500); // a
Rainycat 0:ace18d31cd7e 209 flash_eyes(); play(speakerPin, "F6", 500); // dia-
Rainycat 0:ace18d31cd7e 210 flash_eyes(); play(speakerPin, "F6", 500); // -mond
Rainycat 0:ace18d31cd7e 211 flash_eyes(); play(speakerPin, "E6", 500); // in
Rainycat 0:ace18d31cd7e 212 flash_eyes(); play(speakerPin, "E6", 500); // the
Rainycat 0:ace18d31cd7e 213 flash_eyes(); play(speakerPin, "D6", 1000); // sky
Rainycat 0:ace18d31cd7e 214
Rainycat 0:ace18d31cd7e 215 flash_eyes(); play(speakerPin, "C6", 500); // twin-
Rainycat 0:ace18d31cd7e 216 flash_eyes(); play(speakerPin, "C6", 500); // -kle
Rainycat 0:ace18d31cd7e 217 flash_eyes(); play(speakerPin, "G6", 500); // twin-
Rainycat 0:ace18d31cd7e 218 flash_eyes(); play(speakerPin, "G6", 500); // -kle
Rainycat 0:ace18d31cd7e 219 flash_eyes(); play(speakerPin, "A6", 500); // lit-
Rainycat 0:ace18d31cd7e 220 flash_eyes(); play(speakerPin, "A6", 500); // -tle
Rainycat 0:ace18d31cd7e 221 flash_eyes(); play(speakerPin, "G6", 1000); // star
Rainycat 0:ace18d31cd7e 222 flash_eyes(); play(speakerPin, "F6", 500); // how
Rainycat 0:ace18d31cd7e 223 flash_eyes(); play(speakerPin, "F6", 500); // i
Rainycat 0:ace18d31cd7e 224 flash_eyes(); play(speakerPin, "E6", 500); // won-
Rainycat 0:ace18d31cd7e 225 flash_eyes(); play(speakerPin, "E6", 500); // -der
Rainycat 0:ace18d31cd7e 226 flash_eyes(); play(speakerPin, "D6", 500); // what
Rainycat 0:ace18d31cd7e 227 flash_eyes(); play(speakerPin, "D6", 500); // you
Rainycat 0:ace18d31cd7e 228 flash_eyes(); play(speakerPin, "C6", 1000); // are
Rainycat 0:ace18d31cd7e 229
Rainycat 0:ace18d31cd7e 230 }
Rainycat 0:ace18d31cd7e 231
Rainycat 0:ace18d31cd7e 232 int main(void)
Rainycat 0:ace18d31cd7e 233 {
Rainycat 0:ace18d31cd7e 234 //init();
Rainycat 0:ace18d31cd7e 235
Rainycat 0:ace18d31cd7e 236 setup();
Rainycat 0:ace18d31cd7e 237
Rainycat 0:ace18d31cd7e 238 while (1) {
Rainycat 0:ace18d31cd7e 239 loop();
Rainycat 0:ace18d31cd7e 240 }
Rainycat 0:ace18d31cd7e 241
Rainycat 0:ace18d31cd7e 242 return 0;
Rainycat 0:ace18d31cd7e 243 }
Rainycat 0:ace18d31cd7e 244