ECE 4180 Final Project
Dependencies: mbed mbed-rtos 4DGL-uLCD-SE KeyPad X_NUCLEO_53L0A1
main.cpp
- Committer:
- sui3
- Date:
- 2019-12-06
- Revision:
- 12:86cca789dc09
- Parent:
- 11:5186cc367be0
File content as of revision 12:86cca789dc09:
#include "mbed.h" #include "uLCD_4DGL.h" #include "XNucleo53L0A1.h" #include <stdio.h> #include "KeyPad.h" #include <iostream> #include "rtos.h" DigitalOut shdn1(p26); DigitalOut myled(LED1); DigitalOut myled2(LED2); DigitalOut Lock(p8); DigitalIn pb(p24); KeyPad2 keypad(p15, p16, p12, p18, p19, p20, p25); PwmOut pwm_pin(p21); BusOut siren(LED4, LED3, LED2, LED1); uLCD_4DGL display(p13, p14, p30); // serial tx, serial rx, reset pin; // This VL53L0X board test application performs a range measurement in polling mode // Use 3.3(Vout) for Vin, p28 for SDA, p27 for SCL, P26 for shdn on mbed LPC1768 //I2C sensor pins #define VL53L0_I2C_SDA_1 p28 #define VL53L0_I2C_SCL_1 p27 #define VOLUME 0.1 #define BPM 100.0 static XNucleo53L0A1 *board1=NULL; uLCD_4DGL uLCD(p13, p14, p30); // serial tx, serial rx, reset pin; unsigned int count = 0; unsigned int entered = 0; unsigned int pin = 4180; Thread sirenThread; void playAlarm(float frequency, float duration, float volume); float beat_duration = 60.0 / BPM; void sirenOn() { while(true) { siren=15; playAlarm(587.330, (2*beat_duration - 0.4), VOLUME); siren=0; Thread::wait(400); } } int main() { sirenThread.set_priority(osPriorityBelowNormal); pb.mode(PullUp); int distanceAtLock; int status1; int currentDistance; uint32_t distance1; DevI2C *device_i2c_1 = new DevI2C(VL53L0_I2C_SDA_1, VL53L0_I2C_SCL_1); /* creates the 53L0A1 expansion board singleton obj */ board1 = XNucleo53L0A1::instance(device_i2c_1, A2, D8, D2); shdn1 = 0; //must reset sensor for an mbed reset to work wait(0.1); shdn1 = 1; wait(0.1); /* init the 53L0A1 board with default values */ status1 = board1->init_board(); while (status1) { status1 = board1->init_board(); } int pin[4]= {4,1,8,0}; int entry[4]; bool pinCorrect; int k = 0; std::vector<int> keys; display.cls(); display.color(LGREY); display.text_width(2); display.text_height(2); display.printf("ECE 4180\n\n Home\n\nSecurity\n\n System"); wait(2.5); display.cls(); display.color(GREEN); display.locate(0,4); display.printf("System:"); display.locate(8,4); display.printf("Disarmed "); Lock = 1; bool armed = false; bool triggered = false; while (1) { pinCorrect=false; status1 = board1->sensor_centre->get_distance(&distance1); if (status1 == VL53L0X_ERROR_NONE) { currentDistance = distance1; } if (armed||triggered){ std::vector<int> keys = keypad.getkey(); if (keys.size() > 0) { if (k==0) { display.locate(4,10); display.printf(" "); display.locate(1,13); display.printf(" "); } if (keys[0]==11) {entry[k]=0;} else {entry[k]=keys[0];} display.locate(k*3+4,10); display.printf("%d",entry[k]); k++; while (keys.size()){keys=keypad.getkey();} } } if (k == 4) { if (entry[0]==pin[0] and entry[1]==pin[1] and entry[2]==pin[2] and entry[3]==pin[3]) { pinCorrect=true; display.locate(4,13); display.printf("Pin Correct"); } else { display.locate(3,13); display.printf("Pin Incorrect"); } k = 0; } if (pb == 0) { armed = 1; Lock = 0; distanceAtLock = currentDistance; display.color(BLUE); display.locate(8,4); display.printf("Armed "); display.locate(4,10); display.printf(" "); display.locate(1,13); display.printf(" "); } if (armed and (currentDistance < (distanceAtLock - 30))) { triggered = true; } if (triggered) { display.color(RED); display.locate(8,4); display.printf("Triggered"); display.locate(0,7); display.printf(" Disarm Now"); sirenThread.start(sirenOn); display.locate(0,7); display.printf(" "); } if (armed and pinCorrect) { armed = 0; triggered = 0; sirenThread.terminate(); playAlarm(587.330, (0), VOLUME); siren=0; Lock = 1; display.color(GREEN); display.locate(8,4); display.printf("Disarmed "); } } } void playAlarm(float frequency, float duration, float volume) { pwm_pin.period(1.0/frequency); pwm_pin = volume/2.0; wait(duration); pwm_pin = 0.0; }