ECE 4180 Final Project

Dependencies:   mbed mbed-rtos 4DGL-uLCD-SE KeyPad X_NUCLEO_53L0A1

Committer:
sui3
Date:
Fri Dec 06 03:58:11 2019 +0000
Revision:
12:86cca789dc09
Parent:
11:5186cc367be0
Final Project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
johnAlexander 0:ce8359133ae6 1 #include "mbed.h"
sui3 12:86cca789dc09 2 #include "uLCD_4DGL.h"
Davidroid 10:891e10d3b4a6 3 #include "XNucleo53L0A1.h"
johnAlexander 0:ce8359133ae6 4 #include <stdio.h>
sui3 12:86cca789dc09 5 #include "KeyPad.h"
sui3 12:86cca789dc09 6 #include <iostream>
sui3 12:86cca789dc09 7 #include "rtos.h"
sui3 12:86cca789dc09 8
sui3 12:86cca789dc09 9 DigitalOut shdn1(p26);
sui3 12:86cca789dc09 10 DigitalOut myled(LED1);
sui3 12:86cca789dc09 11 DigitalOut myled2(LED2);
sui3 12:86cca789dc09 12 DigitalOut Lock(p8);
sui3 12:86cca789dc09 13 DigitalIn pb(p24);
sui3 12:86cca789dc09 14 KeyPad2 keypad(p15, p16, p12, p18, p19, p20, p25);
sui3 12:86cca789dc09 15 PwmOut pwm_pin(p21);
sui3 12:86cca789dc09 16 BusOut siren(LED4, LED3, LED2, LED1);
sui3 12:86cca789dc09 17 uLCD_4DGL display(p13, p14, p30); // serial tx, serial rx, reset pin;
sui3 12:86cca789dc09 18
4180_1 11:5186cc367be0 19 // This VL53L0X board test application performs a range measurement in polling mode
4180_1 11:5186cc367be0 20 // Use 3.3(Vout) for Vin, p28 for SDA, p27 for SCL, P26 for shdn on mbed LPC1768
johnAlexander 0:ce8359133ae6 21
4180_1 11:5186cc367be0 22 //I2C sensor pins
sui3 12:86cca789dc09 23 #define VL53L0_I2C_SDA_1 p28
sui3 12:86cca789dc09 24 #define VL53L0_I2C_SCL_1 p27
sui3 12:86cca789dc09 25
sui3 12:86cca789dc09 26 #define VOLUME 0.1
sui3 12:86cca789dc09 27 #define BPM 100.0
sui3 12:86cca789dc09 28
sui3 12:86cca789dc09 29 static XNucleo53L0A1 *board1=NULL;
sui3 12:86cca789dc09 30 uLCD_4DGL uLCD(p13, p14, p30); // serial tx, serial rx, reset pin;
sui3 12:86cca789dc09 31
sui3 12:86cca789dc09 32 unsigned int count = 0;
sui3 12:86cca789dc09 33 unsigned int entered = 0;
sui3 12:86cca789dc09 34
sui3 12:86cca789dc09 35 unsigned int pin = 4180;
johnAlexander 0:ce8359133ae6 36
sui3 12:86cca789dc09 37 Thread sirenThread;
sui3 12:86cca789dc09 38
sui3 12:86cca789dc09 39 void playAlarm(float frequency, float duration, float volume);
sui3 12:86cca789dc09 40
sui3 12:86cca789dc09 41 float beat_duration = 60.0 / BPM;
sui3 12:86cca789dc09 42
sui3 12:86cca789dc09 43 void sirenOn() {
sui3 12:86cca789dc09 44 while(true) {
sui3 12:86cca789dc09 45 siren=15;
sui3 12:86cca789dc09 46 playAlarm(587.330, (2*beat_duration - 0.4), VOLUME);
sui3 12:86cca789dc09 47 siren=0;
sui3 12:86cca789dc09 48 Thread::wait(400);
sui3 12:86cca789dc09 49 }
sui3 12:86cca789dc09 50 }
johnAlexander 1:3483e701ec59 51
johnAlexander 0:ce8359133ae6 52 int main()
4180_1 11:5186cc367be0 53 {
sui3 12:86cca789dc09 54 sirenThread.set_priority(osPriorityBelowNormal);
sui3 12:86cca789dc09 55 pb.mode(PullUp);
sui3 12:86cca789dc09 56 int distanceAtLock;
sui3 12:86cca789dc09 57 int status1;
sui3 12:86cca789dc09 58 int currentDistance;
sui3 12:86cca789dc09 59 uint32_t distance1;
sui3 12:86cca789dc09 60 DevI2C *device_i2c_1 = new DevI2C(VL53L0_I2C_SDA_1, VL53L0_I2C_SCL_1);
johnAlexander 7:c8087e7333b8 61 /* creates the 53L0A1 expansion board singleton obj */
sui3 12:86cca789dc09 62 board1 = XNucleo53L0A1::instance(device_i2c_1, A2, D8, D2);
sui3 12:86cca789dc09 63 shdn1 = 0; //must reset sensor for an mbed reset to work
4180_1 11:5186cc367be0 64 wait(0.1);
sui3 12:86cca789dc09 65 shdn1 = 1;
4180_1 11:5186cc367be0 66 wait(0.1);
4180_1 11:5186cc367be0 67 /* init the 53L0A1 board with default values */
sui3 12:86cca789dc09 68 status1 = board1->init_board();
sui3 12:86cca789dc09 69 while (status1) {
sui3 12:86cca789dc09 70
sui3 12:86cca789dc09 71 status1 = board1->init_board();
johnAlexander 7:c8087e7333b8 72 }
sui3 12:86cca789dc09 73 int pin[4]= {4,1,8,0};
sui3 12:86cca789dc09 74 int entry[4];
sui3 12:86cca789dc09 75 bool pinCorrect;
sui3 12:86cca789dc09 76 int k = 0;
sui3 12:86cca789dc09 77 std::vector<int> keys;
sui3 12:86cca789dc09 78
sui3 12:86cca789dc09 79
sui3 12:86cca789dc09 80 display.cls();
sui3 12:86cca789dc09 81 display.color(LGREY);
sui3 12:86cca789dc09 82 display.text_width(2);
sui3 12:86cca789dc09 83 display.text_height(2);
sui3 12:86cca789dc09 84 display.printf("ECE 4180\n\n Home\n\nSecurity\n\n System");
sui3 12:86cca789dc09 85 wait(2.5);
sui3 12:86cca789dc09 86 display.cls();
sui3 12:86cca789dc09 87 display.color(GREEN);
sui3 12:86cca789dc09 88 display.locate(0,4);
sui3 12:86cca789dc09 89 display.printf("System:");
sui3 12:86cca789dc09 90 display.locate(8,4);
sui3 12:86cca789dc09 91 display.printf("Disarmed ");
sui3 12:86cca789dc09 92 Lock = 1;
sui3 12:86cca789dc09 93
sui3 12:86cca789dc09 94
sui3 12:86cca789dc09 95 bool armed = false;
sui3 12:86cca789dc09 96 bool triggered = false;
sui3 12:86cca789dc09 97
4180_1 11:5186cc367be0 98 while (1) {
sui3 12:86cca789dc09 99
sui3 12:86cca789dc09 100 pinCorrect=false;
sui3 12:86cca789dc09 101 status1 = board1->sensor_centre->get_distance(&distance1);
sui3 12:86cca789dc09 102
sui3 12:86cca789dc09 103 if (status1 == VL53L0X_ERROR_NONE) {
sui3 12:86cca789dc09 104 currentDistance = distance1;
sui3 12:86cca789dc09 105
sui3 12:86cca789dc09 106 }
sui3 12:86cca789dc09 107
sui3 12:86cca789dc09 108 if (armed||triggered){
sui3 12:86cca789dc09 109 std::vector<int> keys = keypad.getkey();
sui3 12:86cca789dc09 110 if (keys.size() > 0)
sui3 12:86cca789dc09 111 {
sui3 12:86cca789dc09 112 if (k==0) {
sui3 12:86cca789dc09 113 display.locate(4,10);
sui3 12:86cca789dc09 114 display.printf(" ");
sui3 12:86cca789dc09 115 display.locate(1,13);
sui3 12:86cca789dc09 116 display.printf(" ");
sui3 12:86cca789dc09 117 }
sui3 12:86cca789dc09 118
sui3 12:86cca789dc09 119 if (keys[0]==11) {entry[k]=0;}
sui3 12:86cca789dc09 120 else {entry[k]=keys[0];}
sui3 12:86cca789dc09 121
sui3 12:86cca789dc09 122 display.locate(k*3+4,10);
sui3 12:86cca789dc09 123 display.printf("%d",entry[k]);
sui3 12:86cca789dc09 124 k++;
sui3 12:86cca789dc09 125 while (keys.size()){keys=keypad.getkey();}
sui3 12:86cca789dc09 126
sui3 12:86cca789dc09 127 }
sui3 12:86cca789dc09 128 }
sui3 12:86cca789dc09 129
sui3 12:86cca789dc09 130
sui3 12:86cca789dc09 131 if (k == 4) {
sui3 12:86cca789dc09 132 if (entry[0]==pin[0] and entry[1]==pin[1] and entry[2]==pin[2] and entry[3]==pin[3])
sui3 12:86cca789dc09 133 {
sui3 12:86cca789dc09 134 pinCorrect=true;
sui3 12:86cca789dc09 135 display.locate(4,13);
sui3 12:86cca789dc09 136 display.printf("Pin Correct");
sui3 12:86cca789dc09 137
sui3 12:86cca789dc09 138 } else {
sui3 12:86cca789dc09 139 display.locate(3,13);
sui3 12:86cca789dc09 140 display.printf("Pin Incorrect");
sui3 12:86cca789dc09 141
sui3 12:86cca789dc09 142 }
sui3 12:86cca789dc09 143 k = 0;
sui3 12:86cca789dc09 144 }
sui3 12:86cca789dc09 145
sui3 12:86cca789dc09 146 if (pb == 0) {
sui3 12:86cca789dc09 147 armed = 1;
sui3 12:86cca789dc09 148 Lock = 0;
sui3 12:86cca789dc09 149 distanceAtLock = currentDistance;
sui3 12:86cca789dc09 150
sui3 12:86cca789dc09 151 display.color(BLUE);
sui3 12:86cca789dc09 152 display.locate(8,4);
sui3 12:86cca789dc09 153 display.printf("Armed ");
sui3 12:86cca789dc09 154 display.locate(4,10);
sui3 12:86cca789dc09 155 display.printf(" ");
sui3 12:86cca789dc09 156 display.locate(1,13);
sui3 12:86cca789dc09 157 display.printf(" ");
sui3 12:86cca789dc09 158 }
sui3 12:86cca789dc09 159
sui3 12:86cca789dc09 160 if (armed and (currentDistance < (distanceAtLock - 30))) {
sui3 12:86cca789dc09 161 triggered = true;
sui3 12:86cca789dc09 162 }
sui3 12:86cca789dc09 163
sui3 12:86cca789dc09 164 if (triggered) {
sui3 12:86cca789dc09 165 display.color(RED);
sui3 12:86cca789dc09 166 display.locate(8,4);
sui3 12:86cca789dc09 167 display.printf("Triggered");
sui3 12:86cca789dc09 168 display.locate(0,7);
sui3 12:86cca789dc09 169 display.printf(" Disarm Now");
sui3 12:86cca789dc09 170 sirenThread.start(sirenOn);
sui3 12:86cca789dc09 171
sui3 12:86cca789dc09 172 display.locate(0,7);
sui3 12:86cca789dc09 173 display.printf(" ");
sui3 12:86cca789dc09 174 }
sui3 12:86cca789dc09 175
sui3 12:86cca789dc09 176 if (armed and pinCorrect) {
sui3 12:86cca789dc09 177 armed = 0;
sui3 12:86cca789dc09 178 triggered = 0;
sui3 12:86cca789dc09 179 sirenThread.terminate();
sui3 12:86cca789dc09 180 playAlarm(587.330, (0), VOLUME);
sui3 12:86cca789dc09 181 siren=0;
sui3 12:86cca789dc09 182 Lock = 1;
sui3 12:86cca789dc09 183
sui3 12:86cca789dc09 184 display.color(GREEN);
sui3 12:86cca789dc09 185 display.locate(8,4);
sui3 12:86cca789dc09 186 display.printf("Disarmed ");
johnAlexander 7:c8087e7333b8 187 }
4180_1 11:5186cc367be0 188 }
johnAlexander 0:ce8359133ae6 189 }
sui3 12:86cca789dc09 190
sui3 12:86cca789dc09 191
sui3 12:86cca789dc09 192 void playAlarm(float frequency, float duration, float volume)
sui3 12:86cca789dc09 193 {
sui3 12:86cca789dc09 194 pwm_pin.period(1.0/frequency);
sui3 12:86cca789dc09 195 pwm_pin = volume/2.0;
sui3 12:86cca789dc09 196 wait(duration);
sui3 12:86cca789dc09 197 pwm_pin = 0.0;
sui3 12:86cca789dc09 198 }