ECE 4180 Georiga Tech - Smart House Project: mbed1 (v1)
Dependencies: Camera_LS_Y201 Servo mbed
Fork of mbed1 by
mbed1.cpp@1:547b5918a132, 2013-04-22 (annotated)
- Committer:
- Jgreub
- Date:
- Mon Apr 22 18:38:07 2013 +0000
- Revision:
- 1:547b5918a132
- Parent:
- 0:0b4164532b17
Test 2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jgreub | 0:0b4164532b17 | 1 | /********************************** |
Jgreub | 0:0b4164532b17 | 2 | MBED1: Contains code for -> |
Jgreub | 0:0b4164532b17 | 3 | 1) Servo for Door Lock |
Jgreub | 0:0b4164532b17 | 4 | 2) JPG Camera (URL: http://mbed.org/cookbook/Camera_LS_Y201) |
Jgreub | 0:0b4164532b17 | 5 | 3) Distance Sensor |
Jgreub | 0:0b4164532b17 | 6 | 4) Lock LED / Pushbutton |
Jgreub | 0:0b4164532b17 | 7 | |
Jgreub | 0:0b4164532b17 | 8 | Sends to Atom w/o Command: |
Jgreub | 0:0b4164532b17 | 9 | 1) BreakIn -> Signal and Pic |
Jgreub | 0:0b4164532b17 | 10 | 2) Door Open |
Jgreub | 0:0b4164532b17 | 11 | 3) Door Close |
Jgreub | 0:0b4164532b17 | 12 | ***********************************/ |
Jgreub | 0:0b4164532b17 | 13 | #include "mbed.h" |
Jgreub | 0:0b4164532b17 | 14 | #include "Camera_LS_Y201.h" |
Jgreub | 0:0b4164532b17 | 15 | #include "Servo.h" |
Jgreub | 0:0b4164532b17 | 16 | |
Jgreub | 0:0b4164532b17 | 17 | Serial pc(USBTX,USBRX); |
Jgreub | 0:0b4164532b17 | 18 | Servo servo(p21); |
Jgreub | 0:0b4164532b17 | 19 | AnalogIn door(p20); |
Jgreub | 0:0b4164532b17 | 20 | Camera_LS_Y201 cam(p9, p10); |
Jgreub | 0:0b4164532b17 | 21 | DigitalOut lockLED(p11); //1 = locked |
Jgreub | 0:0b4164532b17 | 22 | |
Jgreub | 0:0b4164532b17 | 23 | //Pushbuttons |
Jgreub | 1:547b5918a132 | 24 | InterruptIn lockPB(p13); |
Jgreub | 0:0b4164532b17 | 25 | |
Jgreub | 0:0b4164532b17 | 26 | //Globals |
Jgreub | 0:0b4164532b17 | 27 | char signal; |
Jgreub | 0:0b4164532b17 | 28 | int isDoorOpen; |
Jgreub | 0:0b4164532b17 | 29 | int isDoorLocked; |
Jgreub | 0:0b4164532b17 | 30 | |
Jgreub | 0:0b4164532b17 | 31 | |
Jgreub | 0:0b4164532b17 | 32 | |
Jgreub | 0:0b4164532b17 | 33 | |
Jgreub | 0:0b4164532b17 | 34 | |
Jgreub | 0:0b4164532b17 | 35 | |
Jgreub | 0:0b4164532b17 | 36 | |
Jgreub | 0:0b4164532b17 | 37 | |
Jgreub | 0:0b4164532b17 | 38 | /***************************************/ |
Jgreub | 0:0b4164532b17 | 39 | /* HELPER FUNCTIONS */ |
Jgreub | 0:0b4164532b17 | 40 | /***************************************/ |
Jgreub | 1:547b5918a132 | 41 | inline void servoLockDoor() {servo = .5;lockLED = 1;} |
Jgreub | 1:547b5918a132 | 42 | inline void servoUnlockDoor() {servo = .8;lockLED = 0;} |
Jgreub | 1:547b5918a132 | 43 | inline void sendID() {pc.printf("1\n\r");} |
Jgreub | 1:547b5918a132 | 44 | inline int checkLock() {return isDoorLocked;} |
Jgreub | 1:547b5918a132 | 45 | inline float checkDist() {return door;} |
Jgreub | 1:547b5918a132 | 46 | int i; |
Jgreub | 1:547b5918a132 | 47 | |
Jgreub | 1:547b5918a132 | 48 | void writePic(int done, int total, uint8_t *buf, size_t siz) { |
Jgreub | 1:547b5918a132 | 49 | pc.printf("HERE\n\r"); |
Jgreub | 1:547b5918a132 | 50 | pc.printf((char*)buf); |
Jgreub | 0:0b4164532b17 | 51 | } |
Jgreub | 0:0b4164532b17 | 52 | |
Jgreub | 1:547b5918a132 | 53 | void capture(Camera_LS_Y201 *cam1) { |
Jgreub | 1:547b5918a132 | 54 | if((i=cam1->takePicture()) != 0) { |
Jgreub | 1:547b5918a132 | 55 | pc.printf("ERROR TAKEPIC = %d\n\r", i); |
Jgreub | 1:547b5918a132 | 56 | return; |
Jgreub | 1:547b5918a132 | 57 | } |
Jgreub | 1:547b5918a132 | 58 | if(cam1->readJpegFileContent(writePic) != 0) { |
Jgreub | 1:547b5918a132 | 59 | pc.printf("ERROR FILECONTENT\n\r"); |
Jgreub | 1:547b5918a132 | 60 | return; |
Jgreub | 1:547b5918a132 | 61 | } |
Jgreub | 1:547b5918a132 | 62 | cam1->stopTakingPictures(); |
Jgreub | 0:0b4164532b17 | 63 | } |
Jgreub | 0:0b4164532b17 | 64 | |
Jgreub | 0:0b4164532b17 | 65 | void lockPushed() { |
Jgreub | 0:0b4164532b17 | 66 | char out[50]; |
Jgreub | 0:0b4164532b17 | 67 | if(checkLock()) { |
Jgreub | 0:0b4164532b17 | 68 | servoUnlockDoor(); |
Jgreub | 0:0b4164532b17 | 69 | isDoorLocked = 0; |
Jgreub | 0:0b4164532b17 | 70 | sprintf(out, "USERUNLOCK\n\r"); |
Jgreub | 0:0b4164532b17 | 71 | } |
Jgreub | 0:0b4164532b17 | 72 | else { |
Jgreub | 0:0b4164532b17 | 73 | servoLockDoor(); |
Jgreub | 0:0b4164532b17 | 74 | isDoorLocked = 1; |
Jgreub | 0:0b4164532b17 | 75 | sprintf(out, "USERLOCK\n\r"); |
Jgreub | 0:0b4164532b17 | 76 | } |
Jgreub | 1:547b5918a132 | 77 | pc.printf(out); |
Jgreub | 0:0b4164532b17 | 78 | } |
Jgreub | 0:0b4164532b17 | 79 | |
Jgreub | 0:0b4164532b17 | 80 | void sendCurrPic() { |
Jgreub | 0:0b4164532b17 | 81 | pc.printf("SENDINGPIC\n\r"); |
Jgreub | 1:547b5918a132 | 82 | capture(&cam); |
Jgreub | 0:0b4164532b17 | 83 | pc.printf("PICSENT\n\r"); |
Jgreub | 0:0b4164532b17 | 84 | } |
Jgreub | 0:0b4164532b17 | 85 | |
Jgreub | 0:0b4164532b17 | 86 | void breakIn() { |
Jgreub | 0:0b4164532b17 | 87 | char out[50]; |
Jgreub | 0:0b4164532b17 | 88 | sprintf(out, "BREAKIN\n\r"); |
Jgreub | 0:0b4164532b17 | 89 | pc.printf(out); |
Jgreub | 0:0b4164532b17 | 90 | sendCurrPic(); |
Jgreub | 1:547b5918a132 | 91 | //ADD ALARM |
Jgreub | 1:547b5918a132 | 92 | while(1); |
Jgreub | 0:0b4164532b17 | 93 | } |
Jgreub | 0:0b4164532b17 | 94 | |
Jgreub | 0:0b4164532b17 | 95 | void lockDoor() { |
Jgreub | 0:0b4164532b17 | 96 | char out[50]; |
Jgreub | 0:0b4164532b17 | 97 | if(isDoorLocked) { |
Jgreub | 0:0b4164532b17 | 98 | sprintf(out, "ALREADYLOCKED\n\r"); |
Jgreub | 0:0b4164532b17 | 99 | } |
Jgreub | 0:0b4164532b17 | 100 | else { |
Jgreub | 0:0b4164532b17 | 101 | servoLockDoor(); |
Jgreub | 0:0b4164532b17 | 102 | isDoorLocked = 1; |
Jgreub | 0:0b4164532b17 | 103 | sprintf(out, "NOWLOCKED\n\r"); |
Jgreub | 0:0b4164532b17 | 104 | } |
Jgreub | 0:0b4164532b17 | 105 | pc.printf(out); |
Jgreub | 0:0b4164532b17 | 106 | } |
Jgreub | 0:0b4164532b17 | 107 | |
Jgreub | 0:0b4164532b17 | 108 | void unlockDoor() { |
Jgreub | 0:0b4164532b17 | 109 | char out[50]; |
Jgreub | 0:0b4164532b17 | 110 | if(!isDoorLocked) { |
Jgreub | 0:0b4164532b17 | 111 | sprintf(out, "ALREADYUNLOCKED\n\r"); |
Jgreub | 0:0b4164532b17 | 112 | } |
Jgreub | 0:0b4164532b17 | 113 | else { |
Jgreub | 0:0b4164532b17 | 114 | servoUnlockDoor(); |
Jgreub | 0:0b4164532b17 | 115 | isDoorLocked = 0; |
Jgreub | 0:0b4164532b17 | 116 | sprintf(out, "NOWUNLOCKED\n\r"); |
Jgreub | 0:0b4164532b17 | 117 | } |
Jgreub | 0:0b4164532b17 | 118 | pc.printf(out); |
Jgreub | 0:0b4164532b17 | 119 | } |
Jgreub | 0:0b4164532b17 | 120 | |
Jgreub | 0:0b4164532b17 | 121 | void sendCheckLock() { |
Jgreub | 0:0b4164532b17 | 122 | char out[50]; |
Jgreub | 0:0b4164532b17 | 123 | sprintf(out,"LOCK:%d\n\r", checkLock()); |
Jgreub | 0:0b4164532b17 | 124 | pc.printf(out); |
Jgreub | 0:0b4164532b17 | 125 | } |
Jgreub | 0:0b4164532b17 | 126 | |
Jgreub | 0:0b4164532b17 | 127 | void sendCheckDist() { |
Jgreub | 0:0b4164532b17 | 128 | char out[50]; |
Jgreub | 0:0b4164532b17 | 129 | sprintf(out,"DIST:%0.3f\n\r", checkDist()); |
Jgreub | 0:0b4164532b17 | 130 | pc.printf(out); |
Jgreub | 0:0b4164532b17 | 131 | } |
Jgreub | 0:0b4164532b17 | 132 | |
Jgreub | 0:0b4164532b17 | 133 | void sendFullStatus() { |
Jgreub | 0:0b4164532b17 | 134 | char out[50]; |
Jgreub | 0:0b4164532b17 | 135 | sprintf(out,"LOCK:%d|DIST:%0.3f\n\r", checkLock(), checkDist()); |
Jgreub | 0:0b4164532b17 | 136 | pc.printf(out); |
Jgreub | 0:0b4164532b17 | 137 | } |
Jgreub | 0:0b4164532b17 | 138 | |
Jgreub | 0:0b4164532b17 | 139 | void getMessage() { |
Jgreub | 0:0b4164532b17 | 140 | //Check for Message |
Jgreub | 0:0b4164532b17 | 141 | signal = pc.getc(); |
Jgreub | 0:0b4164532b17 | 142 | |
Jgreub | 0:0b4164532b17 | 143 | //Switch on Buffer |
Jgreub | 0:0b4164532b17 | 144 | switch(signal) { |
Jgreub | 1:547b5918a132 | 145 | case 'o': |
Jgreub | 0:0b4164532b17 | 146 | sendID(); |
Jgreub | 0:0b4164532b17 | 147 | break; |
Jgreub | 1:547b5918a132 | 148 | case 'p': |
Jgreub | 0:0b4164532b17 | 149 | sendFullStatus(); |
Jgreub | 0:0b4164532b17 | 150 | break; |
Jgreub | 1:547b5918a132 | 151 | case 'q': |
Jgreub | 0:0b4164532b17 | 152 | sendCheckDist(); |
Jgreub | 0:0b4164532b17 | 153 | break; |
Jgreub | 1:547b5918a132 | 154 | case 'w': |
Jgreub | 0:0b4164532b17 | 155 | sendCheckLock(); |
Jgreub | 0:0b4164532b17 | 156 | break; |
Jgreub | 1:547b5918a132 | 157 | case 's': |
Jgreub | 0:0b4164532b17 | 158 | lockDoor(); |
Jgreub | 0:0b4164532b17 | 159 | break; |
Jgreub | 1:547b5918a132 | 160 | case 'x': |
Jgreub | 0:0b4164532b17 | 161 | unlockDoor(); |
Jgreub | 0:0b4164532b17 | 162 | break; |
Jgreub | 1:547b5918a132 | 163 | case 't': |
Jgreub | 0:0b4164532b17 | 164 | sendCurrPic(); |
Jgreub | 0:0b4164532b17 | 165 | break; |
Jgreub | 0:0b4164532b17 | 166 | default: |
Jgreub | 0:0b4164532b17 | 167 | pc.printf("BADCOMMAND\n\r"); |
Jgreub | 0:0b4164532b17 | 168 | break; |
Jgreub | 0:0b4164532b17 | 169 | } |
Jgreub | 0:0b4164532b17 | 170 | } |
Jgreub | 0:0b4164532b17 | 171 | |
Jgreub | 0:0b4164532b17 | 172 | |
Jgreub | 0:0b4164532b17 | 173 | |
Jgreub | 0:0b4164532b17 | 174 | |
Jgreub | 0:0b4164532b17 | 175 | |
Jgreub | 0:0b4164532b17 | 176 | |
Jgreub | 0:0b4164532b17 | 177 | |
Jgreub | 0:0b4164532b17 | 178 | |
Jgreub | 0:0b4164532b17 | 179 | |
Jgreub | 0:0b4164532b17 | 180 | |
Jgreub | 0:0b4164532b17 | 181 | /***************************************/ |
Jgreub | 0:0b4164532b17 | 182 | /* MAIN */ |
Jgreub | 0:0b4164532b17 | 183 | /***************************************/ |
Jgreub | 0:0b4164532b17 | 184 | int main() { |
Jgreub | 0:0b4164532b17 | 185 | //Variables |
Jgreub | 0:0b4164532b17 | 186 | int DOOR_DISTANCE = door + .05; |
Jgreub | 0:0b4164532b17 | 187 | |
Jgreub | 0:0b4164532b17 | 188 | //Setup |
Jgreub | 1:547b5918a132 | 189 | lockLED = 1; |
Jgreub | 1:547b5918a132 | 190 | isDoorLocked = 1; |
Jgreub | 1:547b5918a132 | 191 | servo = .5; |
Jgreub | 0:0b4164532b17 | 192 | |
Jgreub | 0:0b4164532b17 | 193 | //Setup for freopen |
Jgreub | 1:547b5918a132 | 194 | pc.baud(9600); |
Jgreub | 1:547b5918a132 | 195 | pc.attach(&getMessage); |
Jgreub | 1:547b5918a132 | 196 | pc.printf("It is connected\n\r"); |
Jgreub | 0:0b4164532b17 | 197 | |
Jgreub | 0:0b4164532b17 | 198 | //Setup Interrupts |
Jgreub | 1:547b5918a132 | 199 | lockPB.mode(PullUp); |
Jgreub | 1:547b5918a132 | 200 | wait(0.1); |
Jgreub | 1:547b5918a132 | 201 | lockPB.fall(&lockPushed); |
Jgreub | 0:0b4164532b17 | 202 | |
Jgreub | 1:547b5918a132 | 203 | //Camera |
Jgreub | 1:547b5918a132 | 204 | wait(1); |
Jgreub | 1:547b5918a132 | 205 | pc.printf("Reseting Camera...\n\r"); |
Jgreub | 1:547b5918a132 | 206 | if(cam.reset() != 0) { |
Jgreub | 1:547b5918a132 | 207 | pc.printf("RESET ERROR\n\r"); |
Jgreub | 1:547b5918a132 | 208 | return 1; |
Jgreub | 1:547b5918a132 | 209 | } |
Jgreub | 1:547b5918a132 | 210 | wait(1); |
Jgreub | 1:547b5918a132 | 211 | |
Jgreub | 1:547b5918a132 | 212 | while(1);// { |
Jgreub | 1:547b5918a132 | 213 | /* |
Jgreub | 0:0b4164532b17 | 214 | //Check Door Dist and Send if needed |
Jgreub | 0:0b4164532b17 | 215 | if(isDoorOpen) { |
Jgreub | 0:0b4164532b17 | 216 | if(door < DOOR_DISTANCE) { |
Jgreub | 0:0b4164532b17 | 217 | isDoorOpen = 0; |
Jgreub | 1:547b5918a132 | 218 | pc.printf("DOORCLOSE\n\r"); |
Jgreub | 0:0b4164532b17 | 219 | } |
Jgreub | 0:0b4164532b17 | 220 | } |
Jgreub | 0:0b4164532b17 | 221 | else { |
Jgreub | 0:0b4164532b17 | 222 | if(door > DOOR_DISTANCE) { |
Jgreub | 0:0b4164532b17 | 223 | isDoorOpen = 1; |
Jgreub | 0:0b4164532b17 | 224 | if(isDoorLocked) { |
Jgreub | 0:0b4164532b17 | 225 | breakIn(); //Break In! |
Jgreub | 0:0b4164532b17 | 226 | } |
Jgreub | 0:0b4164532b17 | 227 | else { |
Jgreub | 1:547b5918a132 | 228 | pc.printf("DOOROPEN\n\r"); |
Jgreub | 0:0b4164532b17 | 229 | } |
Jgreub | 0:0b4164532b17 | 230 | } |
Jgreub | 0:0b4164532b17 | 231 | } |
Jgreub | 0:0b4164532b17 | 232 | wait_ms(50); |
Jgreub | 1:547b5918a132 | 233 | */ |
Jgreub | 1:547b5918a132 | 234 | //} // End While(1) |
Jgreub | 0:0b4164532b17 | 235 | } |