4180 Final Project - Siren Detection

Dependencies:   mbed mbed-rtos 4DGL-uLCD-SE Motor DRV2605

Revision:
0:43f5c4251f5d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon May 03 17:38:53 2021 +0000
@@ -0,0 +1,118 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "uLCD_4DGL.h"
+#include "DRV2605.h"
+//console debugging
+Serial pc(USBTX, USBRX);
+//manual testing
+DigitalIn PISig(p20);
+//status lite to confirm it's working
+DigitalOut myled(LED1);
+//bluetooth com with RPi
+RawSerial blue(p13,p14);
+//LCD screen
+uLCD_4DGL uLCD(p28,p27,p29);
+//Vibration motors
+PwmOut vib1(p24);
+PwmOut vib2(p25);
+//LED PINS
+PwmOut  redPin(p21);
+PwmOut  greenPin(p22);
+PwmOut  bluePin(p23);
+//haptic motor to simulate
+DRV2605 haptics(p9, p10);
+
+volatile char siren;
+Mutex lcd_mutex;
+
+void vibrate(){
+    while(1){
+        while(siren){
+            haptics.load_waveform_sequence(123,21,43,18,94,48,112,36);
+            haptics.play();
+        }
+    }
+}
+
+void notify(){
+    while(1){  
+        while(siren){
+            lcd_mutex.lock();
+            uLCD.color(RED);
+            uLCD.locate(0,5);
+            uLCD.printf("Siren Detected!");
+            uLCD.locate(0,7);
+            uLCD.printf("Use Caution!");
+            lcd_mutex.unlock();
+            Thread::wait(5000);
+        }
+        lcd_mutex.lock();
+        uLCD.cls();
+        lcd_mutex.unlock();
+        Thread::wait(1000);
+    }
+}
+
+void led_effect(){
+    while(1){
+        while(siren){
+            //flash three times on LED1
+            for(int i=0; i<3; i++) {
+                //ramp up brightness level
+                for(double x = 0.0; x <= 1.0; x = x+0.2) {
+                    redPin = x*x;
+                    wait(.02);
+                }
+            }
+            redPin=0.0; //LED1 off
+            //flash three times on LED2
+            for(int i=0; i<3; i++) {
+                //ramp up brightness level
+                for(double x = 0.0; x <= 1.0; x = x+0.2) {
+                    bluePin = x*x;
+                    wait(.02);
+                }
+            }
+            bluePin=0.0; //LED2 off
+        }
+    }
+}
+
+//void bluetooth(){
+//    while(1){
+//        if(blue.getc()=='1'){
+//            siren = 1;
+//            Thread::wait(5000);
+//        }else{
+//            siren = 0;
+//        }
+//        Thread::wait(1000);
+//    }
+//}
+
+int main() {
+    
+    Thread t1(vibrate);
+    Thread t2(notify);
+    Thread t3(led_effect);
+    //Thread t4(bluetooth);
+    PISig.mode(PullDown);
+    printf("Calibration Result: %X\n",haptics.init(3.3));
+    printf("Diagnostics Result: %X\n", haptics.diagnostics());
+    while(1) {
+        
+    
+    
+        myled = 1;
+        wait(0.2);
+        myled = 0;
+        wait(0.2);
+        
+        //for simulation purposes, adding a pb to confirm everything works.
+        //siren = 0;
+        siren = PISig.read();
+        pc.printf("siren: %d\n", siren);
+        Thread::wait(1000);
+        
+    }
+}