Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:ace18d31cd7e, 2010-04-04 (annotated)
- Committer:
- Rainycat
- Date:
- Sun Apr 04 15:18:03 2010 +0000
- Revision:
- 0:ace18d31cd7e
Who changed what in which revision?
| User | Revision | Line number | New 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 |