![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Final project
Dependencies: mbed wave_player mbed-rtos 4DGL-uLCD-SE SDFileSystem 4180_Lab3_rtos_basic
main.cpp
- Committer:
- astovall21
- Date:
- 2021-05-03
- Revision:
- 10:a644e4e16cf4
- Parent:
- 9:1b37fd4bf5ea
File content as of revision 10:a644e4e16cf4:
/* -------------------AUTHORS----------------------- \\\\\\\\\\\\\\\\\\\\\\/////////////////////////// JACQUES CRAWFORD ALTON STOVALL JAYLA WILLIAMS MILES BARROS -----------------DEPENDECIES--------------------- \\\\\\\\\\\\\\\\\\\\\\/////////////////////////// ---HARDWARE--- - TEMPERATURE SENSOR: TMP36 - LIDAR SENSOR: VL53L0X - MICRPHONE: SPW2430 - CLASS D AUIO AMP: TPA2005D1 - SPEAKER: NaN - SHIFTBRITE: COM-10075 - SD CARD READER: NaN - PUSHBUTTON: NaN - BARREL JACK (5V): NaN ---I/O PIN ASSIGMENTS--- TMP36 -------------------------------- mbed | TMP36 -------------------------------- GND | GND Vout(3.3V) | Vs p19 | Vout VL53L0X ---------------- Mbed | VL53L0X ---------------- 3.3V | VIN GND | GND P28 | SDA P27 | SCL P26 | SHDN SPW2430 --------------------------------- mbed | microphone --------------------------------- gnd | gnd VU(+5VDC) | Vin p16 | (AnalogIn) DC TPA2005D1 -------------------------------------------------------- mbed | TPA2005D1 | Speaker -------------------------------------------------------- gnd | pwr - (gnd), in - | Vout (3.3V) or 5V | pwr + | p18 (A/D) | in + | | out + | + | out - | - SHIFTBRITE -------------------- mbed | ShiftBrite -------------------- gnd | Gnd p11 | DI p15 | LI p20 | EI p13 | CI VU(5V)| V+* SD CARD READER ----------------------------------- mbed | sd card reader ----------------------------------- p8 | CS p5 | DI VOUT | VCC p7 | SCK gnd | GND p6 | DO NC | CD PUHBUTTON --------------------------- mbed | pushbutton --------------------------- gnd | - p22 | + */ //required libraries #include "mbed.h" #include <stdio.h> #include "rtos.h" #include "VL53L0X.h" #include "wave_player.h" #include "SDFileSystem.h" #include "DebounceIn.h" #include <string> using namespace std; //ShiftBrite pin assignments DigitalOut latch(p15); DigitalOut enable(p20); SPI SB_LED(p11, p12, p13); //onboard led DigitalOut myled(LED1); //pushbutton pin assignments InterruptIn pb(p22); //sdcard pin assignments SDFileSystem sd(p5, p6, p7, p8, "sd"); //speaker pin assignment AnalogOut Speaker(p18); //wave player pin assignments and instantiation wave_player waver(&Speaker); bool PLAY = true; bool *PlayStopPtr = &PLAY; FILE *wave_file; //pc terminal communication Serial pc(USBTX,USBRX); DigitalOut shdn(p26); //thread mutexes Mutex waver_mutex; Mutex led_mutex; // Lidar sensor I2C i2c(p28, p27); VL53L0X lidar(&i2c); // connect p19(WIZwiki-W7500) to Vout(Temp36) AnalogIn temp(p19); //bluetooth serial connection Serial blue(p9,p10); //boolean trigger variables (intuitively named) bool soundAlarm = false; bool tempAlarm = false; bool distAlarm = false; bool ledStatus = false; bool armed = false; bool distNotified = false; bool soundNotified = false; bool tempNotified = false; /////////////////////////////////// // Microphone class for SPW2430 /////////////////////////////////// class microphone { public : microphone(PinName pin); float read(); operator float (); private : AnalogIn _pin; }; microphone::microphone (PinName pin): _pin(pin) { } float microphone::read() { return _pin.read(); } inline microphone::operator float () { return _pin.read(); } // microphone pin assignment and object creation microphone mymicrophone(p16); //shiftbrite RBG function. this function controls the color of the led based on the alarm trigger void RGB_LED(int red, int green, int blue) { unsigned int low_color=0; unsigned int high_color=0; high_color=(blue<<4)|((red&0x3C0)>>6); low_color=(((red&0x3F)<<10)|(green)); SB_LED.write(high_color); SB_LED.write(low_color); latch=1; latch=0; } //Reset all parameter i.e. reset alarm device void reset(void) { soundAlarm = false; tempAlarm = false; distAlarm = false; ledStatus = false; armed = false; bool distNotified = false; bool soundNotified = false; bool tempNotified = false; pc.printf("LED STATUS: %d\r\nTEMP STATUS: %d\r\nDIST STATUS: %d\r\nLED STATUS: %d\r\n", soundAlarm, tempAlarm, distAlarm, ledStatus); } //Handle motion detected flag bool distanceTrigger(uint16_t dist) { if (dist < 400 && dist != 20 && armed) { distAlarm = true; } if (distAlarm && armed) { pc.printf("DIST_EVENT_STATUS: %d\r\n", distAlarm); // 1 for true, 0 for false pc.printf("Distance: %d mm\r\n\n", dist); if (distNotified == false) { blue.printf("DISTANCE ALARM HAS BEEN TRIGGERED! Type \"stop\" to disarm.\n"); } distNotified = true; } return distAlarm; } //Handle temperature warning flag bool tempTrigger(float temp) { pc.printf("TEMP_EVENT_STATUS: %d\r\n", tempAlarm);// 1 for true, 0 for false pc.printf("Temperature: %5.2f F \r\n\n", temp); if (temp > 60.0 && armed) { tempAlarm = true; } if (tempAlarm && armed) { pc.printf("TEMP_EVENT_STATUS: %d\r\n", tempAlarm);// 1 for true, 0 for false pc.printf("Temperature: %5.2f F \r\n\n", temp); if (tempNotified == false) { blue.printf("TEMPERATURE ALARM HAS BEEN TRIGGERED! Type \"stop\" to disarm.\n"); } tempNotified = true; } return tempAlarm; } //Handle sound detected flag bool soundTrigger(int snd) { if (snd > 10 && armed) { soundAlarm = true; } if (soundAlarm && armed) { pc.printf("SOUND_EVENT_STATUS: %d\r\n", soundAlarm);// 1 for true, 0 for false pc.printf("Sound level: %d\r\n\n", snd); if (soundNotified == false) { blue.printf("SOUND ALARM HAS BEEN TRIGGERED! Type \"stop\" to disarm.\n"); } soundNotified = true; } return soundAlarm; } //Thread for continuos microphone reading and flag setting --> (soundTrigger(sound)) void SOUND_THREAD() { float sound; while (1) { sound = int(abs((mymicrophone - (0.67/3.3)))*500.0); soundTrigger(sound); Thread::wait(1000); } } //Thread for continuos temperature reading and flag setting --> (tempTrigger(distance)) void TEMP_THREAD() { while(1) { float V = temp.read() * 3.3; // connect Vs(Temp36) to 3.3V(WIZwiki-W7500) float tempC = (V - 0.5) * 100; // calculate temperature C float tempF = (tempC * 9 / 5) + 32.0; // calculate temperature F tempTrigger(tempF); Thread::wait(1000); } } //Thread for playing wave file based on respective alarm triggers void WAVE_THREAD() { while (1) { if (soundAlarm && armed) { waver_mutex.lock(); wave_file=fopen("/sd/sound_new_speed.wav","r"); waver.play(wave_file, PlayStopPtr); fclose(wave_file); waver_mutex.unlock(); Thread::wait(500); } if (distAlarm && armed) { waver_mutex.lock(); wave_file=fopen("/sd/motion_new_speed.wav","r"); waver.play(wave_file, PlayStopPtr); fclose(wave_file); waver_mutex.unlock(); Thread::wait(500); } if (tempAlarm && armed) { waver_mutex.lock(); wave_file=fopen("/sd/temp_new_speed.wav","r"); waver.play(wave_file, PlayStopPtr); fclose(wave_file); waver_mutex.unlock(); Thread::wait(500); } Thread::wait(1000); } } //Thread for checking any and all bluetooth commands void BLUETOOTH_THREAD() { char request[10]; string alarm_state = "disarmed"; while(1) { //check for user input to bluetooth if(blue.readable()) { blue.scanf("%s", request); if (strcmp(request, "stop") == 0) { alarm_state = "armed"; reset(); blue.printf("Alarm has been terminated.\n"); } else if (strcmp(request, "disarm") == 0) { alarm_state = "disarmed"; armed = false; blue.printf("Alarm has been disarmed.\n"); } else if (strcmp(request, "arm") == 0) { alarm_state = "armed"; armed = true; blue.printf("Alarm has been armed!\n"); } else if (strcmp(request, "status") == 0) { blue.printf("Alarm's current state is: %s\n", alarm_state); } } } } //Thread for turning on/changing color of shiftbrite led based on respective alarm triggers //red for sound //green for motion //blue for temperature void LED_THREAD() { SB_LED.format(16,0); SB_LED.frequency(500000); enable=0; latch=0; while (1) { if (soundAlarm && armed) { ledStatus = true; led_mutex.lock(); RGB_LED(100, 0, 0); led_mutex.unlock(); Thread::wait(100); } if (distAlarm && armed) { ledStatus = true; led_mutex.lock(); RGB_LED(0, 100, 0); led_mutex.unlock(); Thread::wait(100); } if (tempAlarm && armed) { ledStatus = true; led_mutex.lock(); RGB_LED(0, 0, 100); led_mutex.unlock(); Thread::wait(100); } if (ledStatus == false) { RGB_LED(0, 0, 0); } RGB_LED(0, 0, 0); pc.printf("LED TRIGGER: %d\r\n\n", ledStatus); Thread::wait(500); } } //Thread for detecting pushbutton intterupts thus triggering reset void PB_THREAD() { //set mode PullUp pb.mode(PullUp); // Delay for initial pullup to take effect Thread:: wait(10); while (1) { if (pb == 0) { reset(); Thread::wait(10); } } } int main() { Thread sound_sensor(SOUND_THREAD); //start microphone thread Thread temp_sensor(TEMP_THREAD); //start temperature sensor thread Thread play_alarm(WAVE_THREAD); //start wave file alarm thread Thread led_light(LED_THREAD); //start shiftbrite led thread Thread pushbutton(PB_THREAD); //start pushbutton interrupt thread Thread bluetooth(BLUETOOTH_THREAD); //start bluetooth thread uint16_t distance; //for VL53L0X shdn = 0; //must reset sensor for an mbed reset to work wait(0.1); shdn = 1; wait(0.1); //initializations for lidar sensor (VL53L0X) lidar.init(); lidar.setModeContinuous(); lidar.startContinuous(); while (1) { // read distance for Lidar distance = lidar.getRangeMillimeters(); distanceTrigger(distance); wait(1.0); } }