A safe using the mbed, dc motor, solenoid, and more!
Dependencies: 4DGL-uLCD-SE DebounceIn Motordriver PinDetect SDFileSystem mbed-rtos mbed
Diff: main.cpp
- Revision:
- 0:6b5c0ae5acc6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Apr 29 20:01:29 2016 +0000 @@ -0,0 +1,386 @@ +#include "mbed.h" +#include <cmath> +#include "solenoid.h" +#include "rtos.h" +#include "uLCD_4DGL.h" +#include "TMP36.h" +#include "motordriver.h" +#include "PinDetect.h" +#include "mpr121.h" //touchpad +#include "DebounceIn.h" +#include "Speaker.h" //used for playing tones +Speaker mySpeaker(p18); +Serial blue(p13,p14); //blue tooth device +TMP36 myTMP36(p15); //Analog in +Mutex mut; //standard io mutex lock +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); +AnalogIn ir(p19); //Sharp IR sensor +uLCD_4DGL uLCD(p28,p27,p30); //create a global lcd object +I2C i2c(p9, p10); +Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); +InterruptIn interrupt(p25); +PinDetect pb1(p21);//push button 1 +PinDetect pb2(p22);//push button 2 +PinDetect pb3(p23);//push button 3 +PinDetect pb4(p24);//push button 4 +Motor left(p26, p16, p17, 1); // pwm, fwd, rev, has brake feature +Solenoid mySolenoid(p8); + char bnum=0; + char bhit=0; +float tempC = 0.0; +bool shadeDown = true; //true shade is down, false shade is up +bool tempMode = false; //false is celcius, true is fahrenheit +int combo[5]; +bool setUp = false; //boolean for initial setup of safe (will be set to true after passcode is entered) +bool locked = true; //boolean if safe is locked or not. +int passCode[5]; +int j = 0; +int passVal = 0; //keeps track of correct input values +bool passed = true; //this boolean will be used to unlock the safe +bool pb1push = false; //pushbutton 1 was pushed boolean +bool pb2push = false; +bool pb3push = false; +bool pb4push = false; +int failVal = 0; //counts failed attempts +int key_code = -17; //set this to a negative number that won't ever be in Simon's array and also isn't a possible value for drawing +void fallInterrupt() { + int i=0; + int value=mpr121.read(0x00); + value +=mpr121.read(0x01)<<8; + // LED demo mod + i=0; + // puts key number out to LEDs for demo + for (i=0; i<12; i++) { + if (((value>>i)&0x01)==1) key_code=i; + } + +} +void unlocker() { + mySolenoid =1; + + wait(2); + mySolenoid = 0; +} +void lockInterrupt() { + //button 1 + pb1push = true; + led1 = 1; + wait(0.5); + led1 = 0; + mySpeaker.PlayNote(400, 0.5, 1.0); +} +void shadeInterrupt() { + //button 2 + pb2push = true; + led2 = 1; + wait(0.5); + led2 = 0; + mySpeaker.PlayNote(800, 0.5, 1.0); +} +void settingsInterrupt() { + //button 3 + //will be able to change passcode. + //change temp display + //change display shade. + pb3push = true; + led3 = 1; + wait(0.5); + led3 = 0; + mySpeaker.PlayNote(1200, 0.5, 1.0); +} + +void exitInterrupt() { + //button 4 + pb4push = true; + led4 = 1; + wait(0.5); + led4 = 0; + mySpeaker.PlayNote(1600, 0.5, 1.0); +} +void setPassword() { + uLCD.cls(); + uLCD.color(WHITE); + uLCD.printf("Please put in your \n 5 digit passcode now \n \n \n \n"); + wait(0.5); + int i = 0; + while(i < 5 && !pb4push) { + if (key_code >= 0) { + combo[i] = key_code; + uLCD.text_height(4); + uLCD.text_width(2); + uLCD.printf("%d ",combo[i]); + i++; + key_code = -4; + } + } + wait(0.5); + uLCD.cls(); + uLCD.printf("Passcode saved. \nLock engaged. \n"); + wait(1); + uLCD.cls(); +} +void shadeMove() { + uLCD.cls(); + if(shadeDown) { + + shadeDown = false; + //turn motor backward. + for (int i = 0; i < 6 ; i ++) { + led1=!led1; + left.speed(.5); + wait(0.2); + } + left.speed(0); + uLCD.printf("Removing shade."); + wait(2); //might need to be longer dependent on actual mplementation speed + uLCD.cls(); + } else { + shadeDown = true; + for (int i = 0; i < 6 ; i ++) { + led1=!led1; + left.speed(-.5); + wait(0.2); + } + left.speed(0); + //turn motor forward + uLCD.printf("Placing shade."); + wait(2); //might need to be longer dependent on actual mplementation speed + uLCD.cls(); + } +} +void bluetoothOn() { + while (!pb4push) { + if (blue.getc()=='!') { + uLCD.locate(0,0); + uLCD.printf("In Bluetooth Mode."); + if (blue.getc()=='B') { //button data packet + bnum = blue.getc(); //button number + bhit = blue.getc(); //1=hit, 0=release + if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? + // myled = bnum - '0'; //current button number will appear on LEDs + switch (bnum) { + case '1': //number button 1 + if (bhit=='1') { + unlocker(); + //add hit code here + //open safe (or close safe) dependent on state + } else { + //add release code here + } + break; + case '2': //number button 2 + if (bhit=='1') { + //add hit code here + //move shade + shadeMove(); + } else { + + //add release code here + } + break; + case '3': //number button 3 + if (bhit=='1') { + tempMode = !tempMode; + } else { + //add release code here + } + break; + case '4': //number button 4 + if (bhit=='1') { + //add hit code here + pb4push = true; + } else { + //add release code here + } + break; + + } + } + } + } + } +} +int main() { + set_time(46800); // Set RTC time to Wed, 28 Oct 2009 11:35:37 let's change this to wahtever the presentation day is. +//clock stuff goes here + +pb1.mode(PullUp); //the safe unlock/lock method initiator +pb2.mode(PullUp); //the shade button +pb3.mode(PullUp); //temperature button +pb4.mode(PullUp); //exit routine button +wait(.01); +// Setup Interrupt callback functions for a pb hit +pb1.attach_deasserted(&lockInterrupt); +pb2.attach_deasserted(&shadeInterrupt); +pb3.attach_deasserted(&settingsInterrupt); +pb4.attach_deasserted(&exitInterrupt); +pb1.setSampleFrequency(); +pb2.setSampleFrequency(); +pb3.setSampleFrequency(); +pb4.setSampleFrequency(); +interrupt.fall(&fallInterrupt); //setting up the touch pad for use by assigning a method for the falling side of the touchpad interrupt +interrupt.mode(PullUp); //put the interrupt mode to pull up, so that interrupts will trigger when the touchpad is hit + while(1) { + time_t seconds = time(NULL); + //if ir.read is greater than .5 beep(?) + tempC = myTMP36.read(); + if (!setUp) { + mut.lock(); + uLCD.color(WHITE); + uLCD.printf("Welcome to \nSMART Safe."); + + wait(1.0); + uLCD.cls(); + setPassword(); + mut.unlock(); + setUp = true; + //put in clock + //put in temp + } else if (pb1push) { + pb1push = false; + pb4push = false; + uLCD.cls(); + uLCD.printf("Enter your pass code now.\n"); + while (passVal < 5 && failVal < 5 && !pb4push) { + if(key_code >= 0) { + uLCD.text_height(4); + uLCD.printf("%d ",key_code); + if (key_code == combo[j]) { + passVal++; + passed = true; + } else { + passed = false; + j = 0; + failVal++; + } + key_code = -1; + } + if (passVal == 5 && passed && failVal < 5) { + passed = true; + pb1push = false; + j = 0; + failVal = 0; + uLCD.cls(); + uLCD.printf("Safe unlocked."); + locked = false; + unlocker(); + locked = true; + break; + } + if (failVal == 5) { + uLCD.printf("You have put in \n the wrong password \n five times. \n You are locked out."); + } + } + if(pb4push){ + pb4push = false; + uLCD.printf("Unlocking \nsequence \naborted."); + } + passVal = 0; + failVal = 0; + wait(1); + uLCD.cls(); + } else if (pb2push) { + pb2push = false; + + shadeMove(); + + } else if(pb3push){ + pb3push = false; + uLCD.cls(); + while (!pb4push) { + uLCD.locate(0,0); + uLCD.printf("Change Temperature Format (1)\n"); + uLCD.printf("Change Passcode (2) \n"); + uLCD.printf("Enter BLUETOOTH \n mode (3)\n"); + uLCD.printf("Exit menu (4)"); + wait(1); + if (pb1push) { + pb1push = false; + uLCD.cls(); + uLCD.printf("Fahrenheit (1)\n"); + uLCD.printf("Celcius (2)"); + wait(1); + bool action = false; + while (!pb4push && !action) { + if (pb1push) { + action = true; + pb1push = false; + tempMode = true;//thermometer change to F + break; + } else if (pb2push) { + action = true; + pb2push = false; + tempMode = false;//themometer change to C + break; + } + led1 = !led1; + wait(.5); + } + uLCD.cls(); + } else if (pb2push) { //this is going to change the time of day. + pb2push = false; + uLCD.cls(); + setPassword(); + } else if (pb3push) { + pb3push = false; + bluetoothOn(); + + } + } + uLCD.cls(); + led1 =1; + led2 =1; + pb4push = false; + } else { + float temp = myTMP36.read(); + if (tempMode) { + temp = (temp * 1.8) + 32; + } + if (locked) { + uLCD.text_height(4); + uLCD.color(RED); + uLCD.locate(4,0); + uLCD.printf("Locked"); + uLCD.color(WHITE); + uLCD.text_height(3); + uLCD.locate(1,2); + char buffer[32]; + strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); + uLCD.printf("Time %s",buffer); + uLCD.locate(1,4); + if (tempMode) { + uLCD.printf("Temp %3.2f F",temp); + } else { + uLCD.printf("Temp %3.2f C",temp); + } + wait(2); + //uLCD.cls(); + } else { + uLCD.text_height(4); + uLCD.color(GREEN); + uLCD.locate(4,0); + uLCD.printf("Unlocked"); + uLCD.color(WHITE); + uLCD.text_height(3); + uLCD.locate(1,2); + char buffer[32]; + strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); + uLCD.printf("Time %s",buffer); + uLCD.locate(1,4); + if (tempMode) { + uLCD.printf("Temp %3.2f F",temp); + } else { + uLCD.printf("Temp %3.2f C",temp); + } + wait(2); + //uLCD.cls(); + + } + + } + + } +}