ECE 4180 Final Project
Dependencies: mbed mbed-rtos 4DGL-uLCD-SE KeyPad X_NUCLEO_53L0A1
main.cpp@12:86cca789dc09, 2019-12-06 (annotated)
- 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?
User | Revision | Line number | New 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 | } |