Jacob Dahleen
/
I2CSong
Project for playing a song on 2 meeds sending notes over I2C
main.cpp@7:b8f4ab589d16, 2014-02-13 (annotated)
- Committer:
- jad19925
- Date:
- Thu Feb 13 23:29:28 2014 +0000
- Revision:
- 7:b8f4ab589d16
- Parent:
- 6:84c34161559e
Republished
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jad19925 | 0:db7b3841b98f | 1 | #include "mbed.h" |
jad19925 | 0:db7b3841b98f | 2 | #include "C12832.h" |
jad19925 | 1:feca2dfd8753 | 3 | #include "mario.h" |
jad19925 | 6:84c34161559e | 4 | #include "lovesme.h" |
jad19925 | 0:db7b3841b98f | 5 | |
jad19925 | 7:b8f4ab589d16 | 6 | //#define MASTER |
jad19925 | 7:b8f4ab589d16 | 7 | #define SLAVE |
jad19925 | 2:c35c40bae96e | 8 | |
jad19925 | 0:db7b3841b98f | 9 | BusIn joy(p15,p12,p13,p16); |
jad19925 | 0:db7b3841b98f | 10 | DigitalIn fire(p14); |
jad19925 | 0:db7b3841b98f | 11 | PwmOut spkr(p26); |
jad19925 | 0:db7b3841b98f | 12 | C12832 lcd(p5, p7, p6, p8, p11); |
jad19925 | 5:432203c226ed | 13 | DigitalIn up(p15); |
jad19925 | 0:db7b3841b98f | 14 | DigitalIn down(p12); |
jad19925 | 3:eb63ba24e2bb | 15 | BusOut leds(LED1,LED2,LED3,LED4); |
jad19925 | 0:db7b3841b98f | 16 | |
jad19925 | 4:bd0675c58f5e | 17 | #ifdef MASTER |
jad19925 | 3:eb63ba24e2bb | 18 | I2C i2cPort(p9,p10); |
jad19925 | 4:bd0675c58f5e | 19 | #endif |
jad19925 | 4:bd0675c58f5e | 20 | #ifdef SLAVE |
jad19925 | 4:bd0675c58f5e | 21 | I2CSlave slave(p9,p10); |
jad19925 | 4:bd0675c58f5e | 22 | #endif |
jad19925 | 3:eb63ba24e2bb | 23 | char note; |
jad19925 | 3:eb63ba24e2bb | 24 | char length; |
jad19925 | 4:bd0675c58f5e | 25 | const int slaveAddress = 0x42; |
jad19925 | 5:432203c226ed | 26 | char received = 0; |
jad19925 | 6:84c34161559e | 27 | float waitBase=1; |
jad19925 | 0:db7b3841b98f | 28 | |
jad19925 | 0:db7b3841b98f | 29 | int main() |
jad19925 | 0:db7b3841b98f | 30 | { |
jad19925 | 4:bd0675c58f5e | 31 | #ifdef SLAVE |
jad19925 | 4:bd0675c58f5e | 32 | slave.address(slaveAddress); |
jad19925 | 4:bd0675c58f5e | 33 | #endif |
jad19925 | 0:db7b3841b98f | 34 | lcd.cls(); |
jad19925 | 0:db7b3841b98f | 35 | lcd.printf("hello world"); |
jad19925 | 5:432203c226ed | 36 | |
jad19925 | 0:db7b3841b98f | 37 | while(1) { |
jad19925 | 0:db7b3841b98f | 38 | if (fire) { |
jad19925 | 0:db7b3841b98f | 39 | leds=0xf; |
jad19925 | 6:84c34161559e | 40 | waitBase = 60.0/marioTempo; |
jad19925 | 0:db7b3841b98f | 41 | for(int i=0;i<(sizeof(marioNotes)/sizeof(NoteName));i++){ |
jad19925 | 0:db7b3841b98f | 42 | if(marioNotes[i] == R) { |
jad19925 | 0:db7b3841b98f | 43 | spkr=0.0; |
jad19925 | 6:84c34161559e | 44 | wait(waitBase*marioBeats[i]/12); |
jad19925 | 0:db7b3841b98f | 45 | } |
jad19925 | 0:db7b3841b98f | 46 | else{ |
jad19925 | 1:feca2dfd8753 | 47 | spkr.period(1/(notes[marioNotes[i]])); |
jad19925 | 0:db7b3841b98f | 48 | spkr=.5; |
jad19925 | 6:84c34161559e | 49 | wait(waitBase*marioBeats[i]/12); |
jad19925 | 0:db7b3841b98f | 50 | spkr=0.0; |
jad19925 | 0:db7b3841b98f | 51 | } |
jad19925 | 0:db7b3841b98f | 52 | } |
jad19925 | 0:db7b3841b98f | 53 | spkr=0.0; |
jad19925 | 0:db7b3841b98f | 54 | //end speaker code |
jad19925 | 5:432203c226ed | 55 | } else { |
jad19925 | 1:feca2dfd8753 | 56 | leds=joy; |
jad19925 | 1:feca2dfd8753 | 57 | #ifdef MASTER |
jad19925 | 6:84c34161559e | 58 | waitBase = 60.0/marioTempo; |
jad19925 | 5:432203c226ed | 59 | if(up) { |
jad19925 | 5:432203c226ed | 60 | //master sends its song to slave |
jad19925 | 4:bd0675c58f5e | 61 | i2cPort.start(); |
jad19925 | 4:bd0675c58f5e | 62 | //send address |
jad19925 | 4:bd0675c58f5e | 63 | i2cPort.write(slaveAddress); |
jad19925 | 4:bd0675c58f5e | 64 | //send tempo (BPM) |
jad19925 | 4:bd0675c58f5e | 65 | //loop through song |
jad19925 | 6:84c34161559e | 66 | for(int i=0;i<(sizeof(marioNotes)/sizeof(NoteName));i++){ |
jad19925 | 5:432203c226ed | 67 | if(marioNotes[i] == R) { |
jad19925 | 5:432203c226ed | 68 | i2cPort.write(R); |
jad19925 | 5:432203c226ed | 69 | spkr=0.0; |
jad19925 | 6:84c34161559e | 70 | wait(waitBase*marioBeats[i]/12); |
jad19925 | 5:432203c226ed | 71 | } |
jad19925 | 5:432203c226ed | 72 | else{ |
jad19925 | 5:432203c226ed | 73 | i2cPort.write(marioNotes[i]); |
jad19925 | 5:432203c226ed | 74 | spkr.period(1/(notes[marioNotes[i]])); |
jad19925 | 5:432203c226ed | 75 | spkr=.5; |
jad19925 | 6:84c34161559e | 76 | wait(waitBase*marioBeats[i]/12); |
jad19925 | 5:432203c226ed | 77 | spkr=0.0; |
jad19925 | 5:432203c226ed | 78 | } |
jad19925 | 5:432203c226ed | 79 | } |
jad19925 | 5:432203c226ed | 80 | spkr=0.0; |
jad19925 | 5:432203c226ed | 81 | //send stop code |
jad19925 | 5:432203c226ed | 82 | i2cPort.write(0xFF); |
jad19925 | 5:432203c226ed | 83 | wait(.5); |
jad19925 | 4:bd0675c58f5e | 84 | //close i2c port |
jad19925 | 4:bd0675c58f5e | 85 | i2cPort.stop(); |
jad19925 | 5:432203c226ed | 86 | } else if(down) { |
jad19925 | 5:432203c226ed | 87 | //slave should send it's song to master |
jad19925 | 5:432203c226ed | 88 | i2cPort.start(); |
jad19925 | 5:432203c226ed | 89 | //send address with read command |
jad19925 | 5:432203c226ed | 90 | i2cPort.write(slaveAddress|0x01); |
jad19925 | 1:feca2dfd8753 | 91 | |
jad19925 | 5:432203c226ed | 92 | do { |
jad19925 | 5:432203c226ed | 93 | received = i2cPort.read(1); |
jad19925 | 5:432203c226ed | 94 | spkr=0.0; |
jad19925 | 5:432203c226ed | 95 | if(received == R) { |
jad19925 | 5:432203c226ed | 96 | spkr=0.0; |
jad19925 | 5:432203c226ed | 97 | } |
jad19925 | 5:432203c226ed | 98 | else{ |
jad19925 | 5:432203c226ed | 99 | spkr.period(1/(notes[received])); |
jad19925 | 5:432203c226ed | 100 | spkr=.5; |
jad19925 | 5:432203c226ed | 101 | } |
jad19925 | 5:432203c226ed | 102 | lcd.cls(); |
jad19925 | 5:432203c226ed | 103 | lcd.locate(0,0); |
jad19925 | 5:432203c226ed | 104 | lcd.printf("Received: %d",received); |
jad19925 | 5:432203c226ed | 105 | } while(received != 0xFF); |
jad19925 | 5:432203c226ed | 106 | |
jad19925 | 5:432203c226ed | 107 | lcd.cls(); |
jad19925 | 5:432203c226ed | 108 | lcd.locate(0,0); |
jad19925 | 5:432203c226ed | 109 | lcd.printf("done"); |
jad19925 | 5:432203c226ed | 110 | i2cPort.stop(); |
jad19925 | 1:feca2dfd8753 | 111 | } |
jad19925 | 4:bd0675c58f5e | 112 | #endif |
jad19925 | 4:bd0675c58f5e | 113 | #ifdef SLAVE |
jad19925 | 6:84c34161559e | 114 | waitBase = 60.0/lovesMeTempo; |
jad19925 | 4:bd0675c58f5e | 115 | received = slave.receive(); |
jad19925 | 5:432203c226ed | 116 | if(I2CSlave::ReadAddressed==received) { //master is requesting slave song |
jad19925 | 6:84c34161559e | 117 | for(int i=0;i<(sizeof(loveFrequency)/sizeof(NoteName));i++){ |
jad19925 | 6:84c34161559e | 118 | if(loveFrequency[i] == R) { |
jad19925 | 5:432203c226ed | 119 | slave.write(R); |
jad19925 | 5:432203c226ed | 120 | spkr=0.0; |
jad19925 | 6:84c34161559e | 121 | wait(waitBase*loveBeat[i]/12); |
jad19925 | 5:432203c226ed | 122 | } |
jad19925 | 5:432203c226ed | 123 | else{ |
jad19925 | 6:84c34161559e | 124 | slave.write(loveFrequency[i]); |
jad19925 | 6:84c34161559e | 125 | spkr.period(1/(notes[loveFrequency[i]])); |
jad19925 | 5:432203c226ed | 126 | spkr=.5; |
jad19925 | 6:84c34161559e | 127 | wait(waitBase*loveBeat[i]/12); |
jad19925 | 5:432203c226ed | 128 | spkr=0.0; |
jad19925 | 5:432203c226ed | 129 | } |
jad19925 | 5:432203c226ed | 130 | } |
jad19925 | 5:432203c226ed | 131 | spkr=0.0; |
jad19925 | 5:432203c226ed | 132 | slave.write(0xFF); |
jad19925 | 5:432203c226ed | 133 | slave.stop(); |
jad19925 | 4:bd0675c58f5e | 134 | } |
jad19925 | 5:432203c226ed | 135 | else if(I2CSlave::WriteAddressed==received) { //master is sending its song |
jad19925 | 5:432203c226ed | 136 | do { |
jad19925 | 5:432203c226ed | 137 | received = slave.read(); |
jad19925 | 5:432203c226ed | 138 | spkr=0.0; |
jad19925 | 5:432203c226ed | 139 | if(received == R) { |
jad19925 | 5:432203c226ed | 140 | spkr=0.0; |
jad19925 | 5:432203c226ed | 141 | } |
jad19925 | 5:432203c226ed | 142 | else{ |
jad19925 | 5:432203c226ed | 143 | spkr.period(1/(notes[received])); |
jad19925 | 5:432203c226ed | 144 | spkr=.5; |
jad19925 | 5:432203c226ed | 145 | } |
jad19925 | 5:432203c226ed | 146 | lcd.cls(); |
jad19925 | 5:432203c226ed | 147 | lcd.locate(0,0); |
jad19925 | 5:432203c226ed | 148 | lcd.printf("Received: %d",received); |
jad19925 | 5:432203c226ed | 149 | } while(received != 0xFF); |
jad19925 | 4:bd0675c58f5e | 150 | lcd.cls(); |
jad19925 | 4:bd0675c58f5e | 151 | lcd.locate(0,0); |
jad19925 | 5:432203c226ed | 152 | lcd.printf("done"); |
jad19925 | 5:432203c226ed | 153 | slave.stop(); |
jad19925 | 4:bd0675c58f5e | 154 | } |
jad19925 | 5:432203c226ed | 155 | lcd.cls(); |
jad19925 | 5:432203c226ed | 156 | lcd.locate(0,0); |
jad19925 | 5:432203c226ed | 157 | lcd.printf("%d",received); |
jad19925 | 1:feca2dfd8753 | 158 | #endif |
jad19925 | 1:feca2dfd8753 | 159 | } |
jad19925 | 0:db7b3841b98f | 160 | } |
jad19925 | 0:db7b3841b98f | 161 | } |