ECE 4180 final project. Sound and Bluetooth activated coffee maker

Dependencies:   mbed wave_player mbed-rtos C12832_lcd 4DGL-uLCD-SE LCD_fonts SDFileSystem

Committer:
nhummel3
Date:
Thu Dec 05 15:30:50 2019 +0000
Revision:
6:e4aba042979b
Parent:
5:18b2796e4847
Child:
7:2e274cc18797
ECE 4180 Final Project. Sound and Bluetooth activated coffee maker;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 2:a69c8c5f5b03 1 // example to test the mbed Lab Board lcd lib with the mbed rtos
4180_1 4:79863d2ea5a0 2 // Pot1 changes the contrast
4180_1 4:79863d2ea5a0 3 // Pot2 changes the speed of the sin wave
dreschpe 1:1c6a9eaf55b5 4
dreschpe 0:f6a57b843f79 5 #include "mbed.h"
dreschpe 0:f6a57b843f79 6 #include "rtos.h"
dreschpe 0:f6a57b843f79 7 #include "Small_6.h"
dreschpe 0:f6a57b843f79 8 #include "Small_7.h"
dreschpe 0:f6a57b843f79 9 #include "Arial_9.h"
dreschpe 0:f6a57b843f79 10 #include "stdio.h"
dreschpe 1:1c6a9eaf55b5 11 #include "C12832_lcd.h"
nhummel3 5:18b2796e4847 12 #include "sound.h"
nhummel3 6:e4aba042979b 13 #include "unsigned_fire_truck.h"
nhummel3 6:e4aba042979b 14 #include "uLCD_4DGL.h"
nhummel3 6:e4aba042979b 15 #include <mpr121.h>
dreschpe 0:f6a57b843f79 16
nhummel3 5:18b2796e4847 17 #define sample_freq 11025.0
nhummel3 5:18b2796e4847 18 //get and set the frequency from wav conversion tool GUI
4180_1 4:79863d2ea5a0 19
nhummel3 6:e4aba042979b 20 //set variables used to track throughout program
nhummel3 6:e4aba042979b 21 int reset = 1; //check if coffee pot is reset and ready to brew again
nhummel3 6:e4aba042979b 22 volatile int blink = 0; // check if blinking LED
nhummel3 6:e4aba042979b 23 int tmp_blue = 0; // check if bluetooth has been triggered at least 2 times
nhummel3 6:e4aba042979b 24 int noise = 0; // check if still playing alarm
nhummel3 6:e4aba042979b 25 int i=0; //index for audio array
nhummel3 6:e4aba042979b 26 int d = 0;
nhummel3 6:e4aba042979b 27 volatile int trigger = 0; // check if coffeepot has been triggered via sound or bluetooth
nhummel3 6:e4aba042979b 28
nhummel3 6:e4aba042979b 29 //Declarations
nhummel3 6:e4aba042979b 30 Ticker sampletick; //audio interrupt
nhummel3 6:e4aba042979b 31 uLCD_4DGL uLCD(p9,p10,p11);
nhummel3 6:e4aba042979b 32 AnalogIn Therm0(p18);
nhummel3 6:e4aba042979b 33 AnalogIn Therm1(p19);
nhummel3 6:e4aba042979b 34 DigitalOut key(p20);
nhummel3 6:e4aba042979b 35
4180_1 4:79863d2ea5a0 36 PwmOut Speaker(p26);
4180_1 4:79863d2ea5a0 37 PwmOut RGBLED_r(p23);
nhummel3 6:e4aba042979b 38 PwmOut RGBLED_g(p22);
nhummel3 6:e4aba042979b 39 PwmOut RGBLED_b(p21);
nhummel3 6:e4aba042979b 40 DigitalIn user_button(p12);
nhummel3 6:e4aba042979b 41 Serial blue(p28,p27);
dreschpe 2:a69c8c5f5b03 42
nhummel3 6:e4aba042979b 43 // Mutex declarations
dreschpe 1:1c6a9eaf55b5 44 Mutex lcd_mutex;
nhummel3 6:e4aba042979b 45 Mutex leds_mutex;
nhummel3 6:e4aba042979b 46 Mutex bmut;
nhummel3 6:e4aba042979b 47 Mutex mic_mutex;
nhummel3 6:e4aba042979b 48 Mutex trigger_mutex;
dreschpe 0:f6a57b843f79 49
nhummel3 6:e4aba042979b 50 volatile float r = 0.0;
nhummel3 6:e4aba042979b 51 volatile float g = 0.0;
nhummel3 6:e4aba042979b 52 volatile float b = 0.0;
nhummel3 6:e4aba042979b 53
nhummel3 6:e4aba042979b 54 //Audio ISR
nhummel3 5:18b2796e4847 55 void audio_sample ()
dreschpe 0:f6a57b843f79 56 {
nhummel3 6:e4aba042979b 57 //if noise flag set, play audio
nhummel3 6:e4aba042979b 58 if(noise){
nhummel3 6:e4aba042979b 59 Speaker = fire_truck_data[i%NUM_ELEMENTS_FIRE]/255.0;//scale to 0.0 to 1.0 for PWM
nhummel3 6:e4aba042979b 60 i++;
nhummel3 6:e4aba042979b 61 } else {
nhummel3 6:e4aba042979b 62 Speaker = 0;
dreschpe 0:f6a57b843f79 63 }
dreschpe 0:f6a57b843f79 64 }
dreschpe 0:f6a57b843f79 65
nhummel3 6:e4aba042979b 66 // Temporary debug variables
nhummel3 6:e4aba042979b 67 int tmp = 0;
nhummel3 6:e4aba042979b 68 int tmp2 = 0;
nhummel3 6:e4aba042979b 69 int num_trig = 0;
nhummel3 6:e4aba042979b 70
nhummel3 6:e4aba042979b 71 //Microphone class
nhummel3 6:e4aba042979b 72 class microphone
nhummel3 6:e4aba042979b 73 {
nhummel3 6:e4aba042979b 74 public :
nhummel3 6:e4aba042979b 75 microphone(PinName pin);
nhummel3 6:e4aba042979b 76 float read();
nhummel3 6:e4aba042979b 77 operator float ();
nhummel3 6:e4aba042979b 78 private :
nhummel3 6:e4aba042979b 79 AnalogIn _pin;
nhummel3 6:e4aba042979b 80 };
nhummel3 6:e4aba042979b 81 microphone::microphone (PinName pin):
nhummel3 6:e4aba042979b 82 _pin(pin)
nhummel3 6:e4aba042979b 83 {
nhummel3 6:e4aba042979b 84 }
nhummel3 6:e4aba042979b 85 float microphone::read()
nhummel3 6:e4aba042979b 86 {
nhummel3 6:e4aba042979b 87 return _pin.read();
nhummel3 6:e4aba042979b 88 }
nhummel3 6:e4aba042979b 89 inline microphone::operator float ()
nhummel3 6:e4aba042979b 90 {
nhummel3 6:e4aba042979b 91 return _pin.read();
nhummel3 6:e4aba042979b 92 }
nhummel3 6:e4aba042979b 93
nhummel3 6:e4aba042979b 94 microphone mymicrophone(p16);
nhummel3 6:e4aba042979b 95
nhummel3 6:e4aba042979b 96
nhummel3 5:18b2796e4847 97 //
nhummel3 6:e4aba042979b 98 // Thread 1
nhummel3 6:e4aba042979b 99 // Debug thread for microphone on LCD
nhummel3 6:e4aba042979b 100 void thread1(void const *args)
nhummel3 6:e4aba042979b 101 {
nhummel3 6:e4aba042979b 102 int i2;
nhummel3 6:e4aba042979b 103 while(true) { // thread loop
nhummel3 6:e4aba042979b 104 lcd_mutex.lock();
nhummel3 6:e4aba042979b 105
nhummel3 6:e4aba042979b 106 //uLCD.cls();
nhummel3 6:e4aba042979b 107 mic_mutex.lock();
nhummel3 6:e4aba042979b 108 tmp = int(abs((mymicrophone - (0.67/3.3)))*500.0);
nhummel3 6:e4aba042979b 109 //tmp2 = user_button;
nhummel3 6:e4aba042979b 110 mic_mutex.unlock();
nhummel3 6:e4aba042979b 111 trigger_mutex.lock();
nhummel3 6:e4aba042979b 112 uLCD.printf("%d",trigger);
nhummel3 6:e4aba042979b 113 trigger_mutex.unlock();
nhummel3 6:e4aba042979b 114
nhummel3 6:e4aba042979b 115 lcd_mutex.unlock();
nhummel3 6:e4aba042979b 116 Thread::wait(100);
nhummel3 6:e4aba042979b 117 }
nhummel3 6:e4aba042979b 118 }
nhummel3 5:18b2796e4847 119 //
nhummel3 5:18b2796e4847 120 //// Thread 3
nhummel3 6:e4aba042979b 121 //// Blink LED
nhummel3 6:e4aba042979b 122 void thread3(void const *args)
nhummel3 6:e4aba042979b 123 {
nhummel3 6:e4aba042979b 124 while(1) {
nhummel3 6:e4aba042979b 125 // if blink flag is set then blink red LED with PWM fade
nhummel3 6:e4aba042979b 126 if(blink) {
nhummel3 6:e4aba042979b 127 leds_mutex.lock();
nhummel3 6:e4aba042979b 128 RGBLED_g = 0;
nhummel3 6:e4aba042979b 129 RGBLED_b = 0;
nhummel3 6:e4aba042979b 130 leds_mutex.unlock();
nhummel3 6:e4aba042979b 131 for(float j = 0.2; j<= 1.0; j+=0.1) {
nhummel3 6:e4aba042979b 132 leds_mutex.lock();
nhummel3 6:e4aba042979b 133 RGBLED_r = j;
nhummel3 6:e4aba042979b 134 leds_mutex.unlock();
nhummel3 6:e4aba042979b 135 Thread::wait(20);
nhummel3 6:e4aba042979b 136 }
nhummel3 6:e4aba042979b 137 Thread::wait(100);
nhummel3 6:e4aba042979b 138 for(float j = 1.0; j>= 0.2; j-=0.1) {
nhummel3 6:e4aba042979b 139 leds_mutex.lock();
nhummel3 6:e4aba042979b 140 RGBLED_r = j;
nhummel3 6:e4aba042979b 141 leds_mutex.unlock();
nhummel3 6:e4aba042979b 142 Thread::wait(10);
nhummel3 6:e4aba042979b 143 }
nhummel3 6:e4aba042979b 144 Thread::wait(100); // value of pot1 / 100
nhummel3 6:e4aba042979b 145 }
nhummel3 6:e4aba042979b 146 }
nhummel3 6:e4aba042979b 147 }
nhummel3 5:18b2796e4847 148 //
nhummel3 5:18b2796e4847 149 //// Thread 4
nhummel3 6:e4aba042979b 150 //// Microphone parser, triggers coffee pot when over certain value
nhummel3 6:e4aba042979b 151 void thread4(void const *args)
nhummel3 6:e4aba042979b 152 {
nhummel3 6:e4aba042979b 153 while(1) {
nhummel3 6:e4aba042979b 154 //read in, subtract 0.67 DC bias, take absolute value, and scale up .1Vpp to 15 for builtin LED display
nhummel3 6:e4aba042979b 155 mic_mutex.lock();
nhummel3 6:e4aba042979b 156 tmp = int(abs((mymicrophone - (0.67/3.3)))*500.0);
nhummel3 6:e4aba042979b 157 mic_mutex.unlock();
nhummel3 6:e4aba042979b 158 if(tmp > 9) {
nhummel3 6:e4aba042979b 159 num_trig = num_trig+1;
nhummel3 6:e4aba042979b 160 //only trigger if get sample above value 3 times in a row
nhummel3 6:e4aba042979b 161 if(num_trig == 3){
nhummel3 6:e4aba042979b 162 trigger_mutex.lock();
nhummel3 6:e4aba042979b 163 trigger = 1;
nhummel3 6:e4aba042979b 164 trigger_mutex.unlock();
nhummel3 6:e4aba042979b 165 tmp = 0;
nhummel3 6:e4aba042979b 166 Thread::wait(200);
nhummel3 6:e4aba042979b 167 }
nhummel3 6:e4aba042979b 168 } else {
nhummel3 6:e4aba042979b 169 num_trig = 0;
nhummel3 6:e4aba042979b 170 }
nhummel3 6:e4aba042979b 171 }
nhummel3 6:e4aba042979b 172 }
nhummel3 6:e4aba042979b 173 // Thread 5
nhummel3 6:e4aba042979b 174 // Bluetooth parser to trigger coffee pot
nhummel3 6:e4aba042979b 175 void thread5(void const *args)
nhummel3 6:e4aba042979b 176 {
nhummel3 6:e4aba042979b 177 while(true) {
nhummel3 6:e4aba042979b 178 //if recieve any button from bluetooth, increment tmp_blue
nhummel3 6:e4aba042979b 179 if (blue.readable()){
nhummel3 6:e4aba042979b 180 bmut.lock();
nhummel3 6:e4aba042979b 181 if (blue.getc() == '!') {
nhummel3 6:e4aba042979b 182 if (blue.getc() == 'B') {
nhummel3 6:e4aba042979b 183 tmp_blue++;
nhummel3 6:e4aba042979b 184 }
nhummel3 6:e4aba042979b 185 }
nhummel3 6:e4aba042979b 186
nhummel3 6:e4aba042979b 187 bmut.unlock();
nhummel3 6:e4aba042979b 188 }
nhummel3 6:e4aba042979b 189 // if receive message from bluetooth twice in a row, trigger coffee pot
nhummel3 6:e4aba042979b 190 if(tmp_blue == 2) {
nhummel3 6:e4aba042979b 191 trigger_mutex.lock();
nhummel3 6:e4aba042979b 192 trigger = 1;
nhummel3 6:e4aba042979b 193 trigger_mutex.unlock();
nhummel3 6:e4aba042979b 194 tmp_blue = 0;
nhummel3 6:e4aba042979b 195 }
nhummel3 6:e4aba042979b 196 }
nhummel3 6:e4aba042979b 197 }
4180_1 4:79863d2ea5a0 198
dreschpe 0:f6a57b843f79 199 int main()
dreschpe 0:f6a57b843f79 200 {
nhummel3 6:e4aba042979b 201 // ---------Enter Initialize State---------
nhummel3 6:e4aba042979b 202 //set key to high initially to not trigger coffee pot
nhummel3 6:e4aba042979b 203 key = 1;
nhummel3 6:e4aba042979b 204 RGBLED_r = 0.5;
nhummel3 6:e4aba042979b 205 wait(0.1);
nhummel3 6:e4aba042979b 206 //set baud rate
nhummel3 6:e4aba042979b 207 blue.baud(9600);
nhummel3 6:e4aba042979b 208 //set speaker period
nhummel3 5:18b2796e4847 209 Speaker.period(1.0/250000.0);
nhummel3 5:18b2796e4847 210 //Thread t1(thread1); //start thread1
dreschpe 0:f6a57b843f79 211
nhummel3 6:e4aba042979b 212 Thread t3(thread3); //start thread3
nhummel3 6:e4aba042979b 213 Thread t4(thread4); //start thread4
nhummel3 6:e4aba042979b 214 Thread t5(thread5); //start thread5
nhummel3 6:e4aba042979b 215
nhummel3 6:e4aba042979b 216 //set button mode
nhummel3 6:e4aba042979b 217 user_button.mode(PullUp);
nhummel3 6:e4aba042979b 218 wait(0.001);
nhummel3 6:e4aba042979b 219
nhummel3 6:e4aba042979b 220 //---------Enter Ready State---------
nhummel3 6:e4aba042979b 221
nhummel3 6:e4aba042979b 222 //lcd_mutex.lock();
nhummel3 6:e4aba042979b 223 uLCD.cls();
nhummel3 6:e4aba042979b 224 uLCD.printf("READY");
nhummel3 6:e4aba042979b 225 //lcd_mutex.unlock();
nhummel3 6:e4aba042979b 226
nhummel3 6:e4aba042979b 227 //attach audio interrupt
nhummel3 6:e4aba042979b 228 sampletick.attach(&audio_sample, 1.0 / sample_freq);
nhummel3 5:18b2796e4847 229
nhummel3 6:e4aba042979b 230 while(1){
nhummel3 6:e4aba042979b 231 Thread::wait(100);
nhummel3 6:e4aba042979b 232 //set mutex lock for trigger
nhummel3 6:e4aba042979b 233 trigger_mutex.lock();
nhummel3 6:e4aba042979b 234 //if trigger flag is set, start coffee pot
nhummel3 6:e4aba042979b 235 if(trigger) {
nhummel3 6:e4aba042979b 236 // ---------Enter Brewing State---------
nhummel3 6:e4aba042979b 237
nhummel3 6:e4aba042979b 238 //write to LCD
nhummel3 6:e4aba042979b 239 //lcd_mutex.lock();
nhummel3 6:e4aba042979b 240 uLCD.cls();
nhummel3 6:e4aba042979b 241 uLCD.printf("BREWING...");
nhummel3 6:e4aba042979b 242 //lcd_mutex.unlock();
nhummel3 6:e4aba042979b 243
nhummel3 6:e4aba042979b 244 //set microphone mutex lock to prevent false trigger while running
nhummel3 6:e4aba042979b 245 mic_mutex.lock();
nhummel3 6:e4aba042979b 246
nhummel3 6:e4aba042979b 247 // set coffee pot trigger to low
nhummel3 6:e4aba042979b 248 key = 0;
nhummel3 6:e4aba042979b 249 //changing LED to indicate trigger
nhummel3 6:e4aba042979b 250 leds_mutex.lock();
nhummel3 6:e4aba042979b 251 RGBLED_r = 0;
nhummel3 6:e4aba042979b 252 RGBLED_b = 0;
nhummel3 6:e4aba042979b 253 RGBLED_g = 1;
nhummel3 6:e4aba042979b 254 leds_mutex.unlock();
nhummel3 6:e4aba042979b 255 Thread::wait(200);
nhummel3 6:e4aba042979b 256
nhummel3 6:e4aba042979b 257 // set coffee pot trigger back to high after pulse
nhummel3 6:e4aba042979b 258 key = 1;
nhummel3 6:e4aba042979b 259
nhummel3 6:e4aba042979b 260 // change LED to indicate running
nhummel3 6:e4aba042979b 261 leds_mutex.lock();
nhummel3 6:e4aba042979b 262 RGBLED_g = 0;
nhummel3 6:e4aba042979b 263 RGBLED_b = 1;
nhummel3 6:e4aba042979b 264 leds_mutex.unlock();
nhummel3 6:e4aba042979b 265 wait(100);
nhummel3 6:e4aba042979b 266
nhummel3 6:e4aba042979b 267 // ---------Enter Reset State---------
nhummel3 6:e4aba042979b 268
nhummel3 6:e4aba042979b 269 // set noise flag high
nhummel3 6:e4aba042979b 270 noise = 1;
nhummel3 6:e4aba042979b 271 //lcd_mutex.lock();
nhummel3 6:e4aba042979b 272 uLCD.cls();
nhummel3 6:e4aba042979b 273 uLCD.printf("COFFEE READY\n\n\rPLEASE RESET\n\rMACHINE");
nhummel3 6:e4aba042979b 274 //lcd_mutex.unlock();
nhummel3 6:e4aba042979b 275
nhummel3 6:e4aba042979b 276 // set led blink flag high
nhummel3 6:e4aba042979b 277 blink = 1;
nhummel3 6:e4aba042979b 278
nhummel3 6:e4aba042979b 279 //wait for reset button press from user
nhummel3 6:e4aba042979b 280 while(reset) {
nhummel3 6:e4aba042979b 281 reset = user_button;
nhummel3 6:e4aba042979b 282 Thread::wait(1);
nhummel3 6:e4aba042979b 283 }
nhummel3 6:e4aba042979b 284
nhummel3 6:e4aba042979b 285 //---------Enter Ready State---------
nhummel3 6:e4aba042979b 286
nhummel3 6:e4aba042979b 287 // set led blink flag low
nhummel3 6:e4aba042979b 288 blink = 0;
nhummel3 6:e4aba042979b 289 //lcd_mutex.lock();
nhummel3 6:e4aba042979b 290 uLCD.cls();
nhummel3 6:e4aba042979b 291 uLCD.printf("READY");
nhummel3 6:e4aba042979b 292 //lcd_mutex.unlock();
nhummel3 6:e4aba042979b 293
nhummel3 6:e4aba042979b 294 // set noise flag low
nhummel3 6:e4aba042979b 295 noise = 0;
nhummel3 6:e4aba042979b 296 // set reset flag high
nhummel3 6:e4aba042979b 297 reset = 1;
nhummel3 6:e4aba042979b 298
nhummel3 6:e4aba042979b 299 // change leds to indicate ready state
nhummel3 6:e4aba042979b 300 leds_mutex.lock();
nhummel3 6:e4aba042979b 301 RGBLED_g = 0;
nhummel3 6:e4aba042979b 302 RGBLED_b = 0;
nhummel3 6:e4aba042979b 303 RGBLED_r = 1;
nhummel3 6:e4aba042979b 304 leds_mutex.unlock();
nhummel3 6:e4aba042979b 305
nhummel3 6:e4aba042979b 306 // set trigger flag low
nhummel3 6:e4aba042979b 307 trigger = 0;
nhummel3 6:e4aba042979b 308 mic_mutex.unlock();
nhummel3 6:e4aba042979b 309 }
nhummel3 6:e4aba042979b 310 trigger_mutex.unlock();
dreschpe 0:f6a57b843f79 311 }
nhummel3 6:e4aba042979b 312 }