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 17:56:38 2019 +0000
Revision:
7:2e274cc18797
Parent:
6:e4aba042979b
Child:
8:a9b5acc63388
Removed unused variable i2

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 while(true) { // thread loop
nhummel3 6:e4aba042979b 103 lcd_mutex.lock();
nhummel3 6:e4aba042979b 104
nhummel3 6:e4aba042979b 105 //uLCD.cls();
nhummel3 6:e4aba042979b 106 mic_mutex.lock();
nhummel3 6:e4aba042979b 107 tmp = int(abs((mymicrophone - (0.67/3.3)))*500.0);
nhummel3 6:e4aba042979b 108 //tmp2 = user_button;
nhummel3 6:e4aba042979b 109 mic_mutex.unlock();
nhummel3 6:e4aba042979b 110 trigger_mutex.lock();
nhummel3 6:e4aba042979b 111 uLCD.printf("%d",trigger);
nhummel3 6:e4aba042979b 112 trigger_mutex.unlock();
nhummel3 6:e4aba042979b 113
nhummel3 6:e4aba042979b 114 lcd_mutex.unlock();
nhummel3 6:e4aba042979b 115 Thread::wait(100);
nhummel3 6:e4aba042979b 116 }
nhummel3 6:e4aba042979b 117 }
nhummel3 5:18b2796e4847 118 //
nhummel3 5:18b2796e4847 119 //// Thread 3
nhummel3 6:e4aba042979b 120 //// Blink LED
nhummel3 6:e4aba042979b 121 void thread3(void const *args)
nhummel3 6:e4aba042979b 122 {
nhummel3 6:e4aba042979b 123 while(1) {
nhummel3 6:e4aba042979b 124 // if blink flag is set then blink red LED with PWM fade
nhummel3 6:e4aba042979b 125 if(blink) {
nhummel3 6:e4aba042979b 126 leds_mutex.lock();
nhummel3 6:e4aba042979b 127 RGBLED_g = 0;
nhummel3 6:e4aba042979b 128 RGBLED_b = 0;
nhummel3 6:e4aba042979b 129 leds_mutex.unlock();
nhummel3 6:e4aba042979b 130 for(float j = 0.2; j<= 1.0; j+=0.1) {
nhummel3 6:e4aba042979b 131 leds_mutex.lock();
nhummel3 6:e4aba042979b 132 RGBLED_r = j;
nhummel3 6:e4aba042979b 133 leds_mutex.unlock();
nhummel3 6:e4aba042979b 134 Thread::wait(20);
nhummel3 6:e4aba042979b 135 }
nhummel3 6:e4aba042979b 136 Thread::wait(100);
nhummel3 6:e4aba042979b 137 for(float j = 1.0; j>= 0.2; j-=0.1) {
nhummel3 6:e4aba042979b 138 leds_mutex.lock();
nhummel3 6:e4aba042979b 139 RGBLED_r = j;
nhummel3 6:e4aba042979b 140 leds_mutex.unlock();
nhummel3 6:e4aba042979b 141 Thread::wait(10);
nhummel3 6:e4aba042979b 142 }
nhummel3 6:e4aba042979b 143 Thread::wait(100); // value of pot1 / 100
nhummel3 6:e4aba042979b 144 }
nhummel3 6:e4aba042979b 145 }
nhummel3 6:e4aba042979b 146 }
nhummel3 5:18b2796e4847 147 //
nhummel3 5:18b2796e4847 148 //// Thread 4
nhummel3 6:e4aba042979b 149 //// Microphone parser, triggers coffee pot when over certain value
nhummel3 6:e4aba042979b 150 void thread4(void const *args)
nhummel3 6:e4aba042979b 151 {
nhummel3 6:e4aba042979b 152 while(1) {
nhummel3 6:e4aba042979b 153 //read in, subtract 0.67 DC bias, take absolute value, and scale up .1Vpp to 15 for builtin LED display
nhummel3 6:e4aba042979b 154 mic_mutex.lock();
nhummel3 6:e4aba042979b 155 tmp = int(abs((mymicrophone - (0.67/3.3)))*500.0);
nhummel3 6:e4aba042979b 156 mic_mutex.unlock();
nhummel3 6:e4aba042979b 157 if(tmp > 9) {
nhummel3 6:e4aba042979b 158 num_trig = num_trig+1;
nhummel3 6:e4aba042979b 159 //only trigger if get sample above value 3 times in a row
nhummel3 6:e4aba042979b 160 if(num_trig == 3){
nhummel3 6:e4aba042979b 161 trigger_mutex.lock();
nhummel3 6:e4aba042979b 162 trigger = 1;
nhummel3 6:e4aba042979b 163 trigger_mutex.unlock();
nhummel3 6:e4aba042979b 164 tmp = 0;
nhummel3 6:e4aba042979b 165 Thread::wait(200);
nhummel3 6:e4aba042979b 166 }
nhummel3 6:e4aba042979b 167 } else {
nhummel3 6:e4aba042979b 168 num_trig = 0;
nhummel3 6:e4aba042979b 169 }
nhummel3 6:e4aba042979b 170 }
nhummel3 6:e4aba042979b 171 }
nhummel3 6:e4aba042979b 172 // Thread 5
nhummel3 6:e4aba042979b 173 // Bluetooth parser to trigger coffee pot
nhummel3 6:e4aba042979b 174 void thread5(void const *args)
nhummel3 6:e4aba042979b 175 {
nhummel3 6:e4aba042979b 176 while(true) {
nhummel3 6:e4aba042979b 177 //if recieve any button from bluetooth, increment tmp_blue
nhummel3 6:e4aba042979b 178 if (blue.readable()){
nhummel3 6:e4aba042979b 179 bmut.lock();
nhummel3 6:e4aba042979b 180 if (blue.getc() == '!') {
nhummel3 6:e4aba042979b 181 if (blue.getc() == 'B') {
nhummel3 6:e4aba042979b 182 tmp_blue++;
nhummel3 6:e4aba042979b 183 }
nhummel3 6:e4aba042979b 184 }
nhummel3 6:e4aba042979b 185
nhummel3 6:e4aba042979b 186 bmut.unlock();
nhummel3 6:e4aba042979b 187 }
nhummel3 6:e4aba042979b 188 // if receive message from bluetooth twice in a row, trigger coffee pot
nhummel3 6:e4aba042979b 189 if(tmp_blue == 2) {
nhummel3 6:e4aba042979b 190 trigger_mutex.lock();
nhummel3 6:e4aba042979b 191 trigger = 1;
nhummel3 6:e4aba042979b 192 trigger_mutex.unlock();
nhummel3 6:e4aba042979b 193 tmp_blue = 0;
nhummel3 6:e4aba042979b 194 }
nhummel3 6:e4aba042979b 195 }
nhummel3 6:e4aba042979b 196 }
4180_1 4:79863d2ea5a0 197
dreschpe 0:f6a57b843f79 198 int main()
dreschpe 0:f6a57b843f79 199 {
nhummel3 6:e4aba042979b 200 // ---------Enter Initialize State---------
nhummel3 6:e4aba042979b 201 //set key to high initially to not trigger coffee pot
nhummel3 6:e4aba042979b 202 key = 1;
nhummel3 6:e4aba042979b 203 RGBLED_r = 0.5;
nhummel3 6:e4aba042979b 204 wait(0.1);
nhummel3 6:e4aba042979b 205 //set baud rate
nhummel3 6:e4aba042979b 206 blue.baud(9600);
nhummel3 6:e4aba042979b 207 //set speaker period
nhummel3 5:18b2796e4847 208 Speaker.period(1.0/250000.0);
nhummel3 5:18b2796e4847 209 //Thread t1(thread1); //start thread1
dreschpe 0:f6a57b843f79 210
nhummel3 6:e4aba042979b 211 Thread t3(thread3); //start thread3
nhummel3 6:e4aba042979b 212 Thread t4(thread4); //start thread4
nhummel3 6:e4aba042979b 213 Thread t5(thread5); //start thread5
nhummel3 6:e4aba042979b 214
nhummel3 6:e4aba042979b 215 //set button mode
nhummel3 6:e4aba042979b 216 user_button.mode(PullUp);
nhummel3 6:e4aba042979b 217 wait(0.001);
nhummel3 6:e4aba042979b 218
nhummel3 6:e4aba042979b 219 //---------Enter Ready State---------
nhummel3 6:e4aba042979b 220
nhummel3 6:e4aba042979b 221 //lcd_mutex.lock();
nhummel3 6:e4aba042979b 222 uLCD.cls();
nhummel3 6:e4aba042979b 223 uLCD.printf("READY");
nhummel3 6:e4aba042979b 224 //lcd_mutex.unlock();
nhummel3 6:e4aba042979b 225
nhummel3 6:e4aba042979b 226 //attach audio interrupt
nhummel3 6:e4aba042979b 227 sampletick.attach(&audio_sample, 1.0 / sample_freq);
nhummel3 5:18b2796e4847 228
nhummel3 6:e4aba042979b 229 while(1){
nhummel3 6:e4aba042979b 230 Thread::wait(100);
nhummel3 6:e4aba042979b 231 //set mutex lock for trigger
nhummel3 6:e4aba042979b 232 trigger_mutex.lock();
nhummel3 6:e4aba042979b 233 //if trigger flag is set, start coffee pot
nhummel3 6:e4aba042979b 234 if(trigger) {
nhummel3 6:e4aba042979b 235 // ---------Enter Brewing State---------
nhummel3 6:e4aba042979b 236
nhummel3 6:e4aba042979b 237 //write to LCD
nhummel3 6:e4aba042979b 238 //lcd_mutex.lock();
nhummel3 6:e4aba042979b 239 uLCD.cls();
nhummel3 6:e4aba042979b 240 uLCD.printf("BREWING...");
nhummel3 6:e4aba042979b 241 //lcd_mutex.unlock();
nhummel3 6:e4aba042979b 242
nhummel3 6:e4aba042979b 243 //set microphone mutex lock to prevent false trigger while running
nhummel3 6:e4aba042979b 244 mic_mutex.lock();
nhummel3 6:e4aba042979b 245
nhummel3 6:e4aba042979b 246 // set coffee pot trigger to low
nhummel3 6:e4aba042979b 247 key = 0;
nhummel3 6:e4aba042979b 248 //changing LED to indicate trigger
nhummel3 6:e4aba042979b 249 leds_mutex.lock();
nhummel3 6:e4aba042979b 250 RGBLED_r = 0;
nhummel3 6:e4aba042979b 251 RGBLED_b = 0;
nhummel3 6:e4aba042979b 252 RGBLED_g = 1;
nhummel3 6:e4aba042979b 253 leds_mutex.unlock();
nhummel3 6:e4aba042979b 254 Thread::wait(200);
nhummel3 6:e4aba042979b 255
nhummel3 6:e4aba042979b 256 // set coffee pot trigger back to high after pulse
nhummel3 6:e4aba042979b 257 key = 1;
nhummel3 6:e4aba042979b 258
nhummel3 6:e4aba042979b 259 // change LED to indicate running
nhummel3 6:e4aba042979b 260 leds_mutex.lock();
nhummel3 6:e4aba042979b 261 RGBLED_g = 0;
nhummel3 6:e4aba042979b 262 RGBLED_b = 1;
nhummel3 6:e4aba042979b 263 leds_mutex.unlock();
nhummel3 6:e4aba042979b 264 wait(100);
nhummel3 6:e4aba042979b 265
nhummel3 6:e4aba042979b 266 // ---------Enter Reset State---------
nhummel3 6:e4aba042979b 267
nhummel3 6:e4aba042979b 268 // set noise flag high
nhummel3 6:e4aba042979b 269 noise = 1;
nhummel3 6:e4aba042979b 270 //lcd_mutex.lock();
nhummel3 6:e4aba042979b 271 uLCD.cls();
nhummel3 6:e4aba042979b 272 uLCD.printf("COFFEE READY\n\n\rPLEASE RESET\n\rMACHINE");
nhummel3 6:e4aba042979b 273 //lcd_mutex.unlock();
nhummel3 6:e4aba042979b 274
nhummel3 6:e4aba042979b 275 // set led blink flag high
nhummel3 6:e4aba042979b 276 blink = 1;
nhummel3 6:e4aba042979b 277
nhummel3 6:e4aba042979b 278 //wait for reset button press from user
nhummel3 6:e4aba042979b 279 while(reset) {
nhummel3 6:e4aba042979b 280 reset = user_button;
nhummel3 6:e4aba042979b 281 Thread::wait(1);
nhummel3 6:e4aba042979b 282 }
nhummel3 6:e4aba042979b 283
nhummel3 6:e4aba042979b 284 //---------Enter Ready State---------
nhummel3 6:e4aba042979b 285
nhummel3 6:e4aba042979b 286 // set led blink flag low
nhummel3 6:e4aba042979b 287 blink = 0;
nhummel3 6:e4aba042979b 288 //lcd_mutex.lock();
nhummel3 6:e4aba042979b 289 uLCD.cls();
nhummel3 6:e4aba042979b 290 uLCD.printf("READY");
nhummel3 6:e4aba042979b 291 //lcd_mutex.unlock();
nhummel3 6:e4aba042979b 292
nhummel3 6:e4aba042979b 293 // set noise flag low
nhummel3 6:e4aba042979b 294 noise = 0;
nhummel3 6:e4aba042979b 295 // set reset flag high
nhummel3 6:e4aba042979b 296 reset = 1;
nhummel3 6:e4aba042979b 297
nhummel3 6:e4aba042979b 298 // change leds to indicate ready state
nhummel3 6:e4aba042979b 299 leds_mutex.lock();
nhummel3 6:e4aba042979b 300 RGBLED_g = 0;
nhummel3 6:e4aba042979b 301 RGBLED_b = 0;
nhummel3 6:e4aba042979b 302 RGBLED_r = 1;
nhummel3 6:e4aba042979b 303 leds_mutex.unlock();
nhummel3 6:e4aba042979b 304
nhummel3 6:e4aba042979b 305 // set trigger flag low
nhummel3 6:e4aba042979b 306 trigger = 0;
nhummel3 6:e4aba042979b 307 mic_mutex.unlock();
nhummel3 6:e4aba042979b 308 }
nhummel3 6:e4aba042979b 309 trigger_mutex.unlock();
dreschpe 0:f6a57b843f79 310 }
nhummel3 6:e4aba042979b 311 }