Mbed1 for Smart House project
Dependencies: SDFileSystem Servo mbed
Fork of Camera_LS_Y201 by
mbed1.cpp@2:ab75a8c63df8, 2013-05-01 (annotated)
- Committer:
- Jgreub
- Date:
- Wed May 01 18:41:05 2013 +0000
- Revision:
- 2:ab75a8c63df8
v1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jgreub | 2:ab75a8c63df8 | 1 | /********************************** |
Jgreub | 2:ab75a8c63df8 | 2 | MBED1: Contains code for -> |
Jgreub | 2:ab75a8c63df8 | 3 | 1) Servo for Door Lock |
Jgreub | 2:ab75a8c63df8 | 4 | 2) JPG Camera (URL: http://mbed.org/cookbook/Camera_LS_Y201) |
Jgreub | 2:ab75a8c63df8 | 5 | 3) Distance Sensor |
Jgreub | 2:ab75a8c63df8 | 6 | 4) Lock LED / Pushbutton |
Jgreub | 2:ab75a8c63df8 | 7 | |
Jgreub | 2:ab75a8c63df8 | 8 | Sends to Atom w/o Command: |
Jgreub | 2:ab75a8c63df8 | 9 | 1) BreakIn -> Signal and Pic |
Jgreub | 2:ab75a8c63df8 | 10 | 2) Door Open |
Jgreub | 2:ab75a8c63df8 | 11 | 3) Door Close |
Jgreub | 2:ab75a8c63df8 | 12 | ***********************************/ |
Jgreub | 2:ab75a8c63df8 | 13 | |
Jgreub | 2:ab75a8c63df8 | 14 | #include "mbed.h" |
Jgreub | 2:ab75a8c63df8 | 15 | #include "Camera_LS_Y201.h" |
Jgreub | 2:ab75a8c63df8 | 16 | #include "SDFileSystem.h" |
Jgreub | 2:ab75a8c63df8 | 17 | #include "Servo.h" |
Jgreub | 2:ab75a8c63df8 | 18 | |
Jgreub | 2:ab75a8c63df8 | 19 | //Setup |
Jgreub | 2:ab75a8c63df8 | 20 | Serial pc(USBTX,USBRX); |
Jgreub | 2:ab75a8c63df8 | 21 | Servo servo(p21); |
Jgreub | 2:ab75a8c63df8 | 22 | AnalogIn door(p20); |
Jgreub | 2:ab75a8c63df8 | 23 | DigitalOut lockLED(p11); //1 = locked |
Jgreub | 2:ab75a8c63df8 | 24 | |
Jgreub | 2:ab75a8c63df8 | 25 | //Pushbuttons |
Jgreub | 2:ab75a8c63df8 | 26 | InterruptIn lockPB(p13); |
Jgreub | 2:ab75a8c63df8 | 27 | |
Jgreub | 2:ab75a8c63df8 | 28 | //Globals |
Jgreub | 2:ab75a8c63df8 | 29 | int isDoorOpen; |
Jgreub | 2:ab75a8c63df8 | 30 | int isDoorLocked; |
Jgreub | 2:ab75a8c63df8 | 31 | |
Jgreub | 2:ab75a8c63df8 | 32 | //File System |
Jgreub | 2:ab75a8c63df8 | 33 | #define FILENAME "/sd/IMG_%04d.jpg" |
Jgreub | 2:ab75a8c63df8 | 34 | SDFileSystem fs(p5, p6, p7, p8, "sd"); |
Jgreub | 2:ab75a8c63df8 | 35 | int cnt = 0; |
Jgreub | 2:ab75a8c63df8 | 36 | int sentCnt = 0; |
Jgreub | 2:ab75a8c63df8 | 37 | |
Jgreub | 2:ab75a8c63df8 | 38 | //Camera |
Jgreub | 2:ab75a8c63df8 | 39 | Camera_LS_Y201 cam1(p9, p10); |
Jgreub | 2:ab75a8c63df8 | 40 | FILE* work; |
Jgreub | 2:ab75a8c63df8 | 41 | FILE* fp; |
Jgreub | 2:ab75a8c63df8 | 42 | int signalPic = 0; |
Jgreub | 2:ab75a8c63df8 | 43 | |
Jgreub | 2:ab75a8c63df8 | 44 | |
Jgreub | 2:ab75a8c63df8 | 45 | |
Jgreub | 2:ab75a8c63df8 | 46 | |
Jgreub | 2:ab75a8c63df8 | 47 | |
Jgreub | 2:ab75a8c63df8 | 48 | |
Jgreub | 2:ab75a8c63df8 | 49 | /***************************************/ |
Jgreub | 2:ab75a8c63df8 | 50 | /* HELPER FUNCTIONS */ |
Jgreub | 2:ab75a8c63df8 | 51 | /***************************************/ |
Jgreub | 2:ab75a8c63df8 | 52 | inline void servoLockDoor() {servo = .2;lockLED = 1;} |
Jgreub | 2:ab75a8c63df8 | 53 | inline void servoUnlockDoor() {servo = .7;lockLED = 0;} |
Jgreub | 2:ab75a8c63df8 | 54 | inline void sendID() {pc.printf("1\n");} |
Jgreub | 2:ab75a8c63df8 | 55 | inline int checkLock() {return isDoorLocked;} |
Jgreub | 2:ab75a8c63df8 | 56 | inline float checkDist() {return door;} |
Jgreub | 2:ab75a8c63df8 | 57 | |
Jgreub | 2:ab75a8c63df8 | 58 | void lockPushed() { |
Jgreub | 2:ab75a8c63df8 | 59 | char out[50]; |
Jgreub | 2:ab75a8c63df8 | 60 | if(checkLock()) { |
Jgreub | 2:ab75a8c63df8 | 61 | servoUnlockDoor(); |
Jgreub | 2:ab75a8c63df8 | 62 | isDoorLocked = 0; |
Jgreub | 2:ab75a8c63df8 | 63 | sprintf(out, "X:0\n"); |
Jgreub | 2:ab75a8c63df8 | 64 | } |
Jgreub | 2:ab75a8c63df8 | 65 | else { |
Jgreub | 2:ab75a8c63df8 | 66 | servoLockDoor(); |
Jgreub | 2:ab75a8c63df8 | 67 | isDoorLocked = 1; |
Jgreub | 2:ab75a8c63df8 | 68 | sprintf(out, "X:1\n"); |
Jgreub | 2:ab75a8c63df8 | 69 | } |
Jgreub | 2:ab75a8c63df8 | 70 | pc.printf(out); |
Jgreub | 2:ab75a8c63df8 | 71 | } |
Jgreub | 2:ab75a8c63df8 | 72 | |
Jgreub | 2:ab75a8c63df8 | 73 | void lockDoor() { |
Jgreub | 2:ab75a8c63df8 | 74 | char out[50]; |
Jgreub | 2:ab75a8c63df8 | 75 | if(isDoorLocked) { |
Jgreub | 2:ab75a8c63df8 | 76 | sprintf(out, "X:1\n"); |
Jgreub | 2:ab75a8c63df8 | 77 | } |
Jgreub | 2:ab75a8c63df8 | 78 | else { |
Jgreub | 2:ab75a8c63df8 | 79 | servoLockDoor(); |
Jgreub | 2:ab75a8c63df8 | 80 | isDoorLocked = 1; |
Jgreub | 2:ab75a8c63df8 | 81 | sprintf(out, "X:1\n"); |
Jgreub | 2:ab75a8c63df8 | 82 | } |
Jgreub | 2:ab75a8c63df8 | 83 | pc.printf(out); |
Jgreub | 2:ab75a8c63df8 | 84 | } |
Jgreub | 2:ab75a8c63df8 | 85 | |
Jgreub | 2:ab75a8c63df8 | 86 | void unlockDoor() { |
Jgreub | 2:ab75a8c63df8 | 87 | char out[50]; |
Jgreub | 2:ab75a8c63df8 | 88 | if(!isDoorLocked) { |
Jgreub | 2:ab75a8c63df8 | 89 | sprintf(out, "X:0\n"); |
Jgreub | 2:ab75a8c63df8 | 90 | } |
Jgreub | 2:ab75a8c63df8 | 91 | else { |
Jgreub | 2:ab75a8c63df8 | 92 | servoUnlockDoor(); |
Jgreub | 2:ab75a8c63df8 | 93 | isDoorLocked = 0; |
Jgreub | 2:ab75a8c63df8 | 94 | sprintf(out, "X:0\n"); |
Jgreub | 2:ab75a8c63df8 | 95 | } |
Jgreub | 2:ab75a8c63df8 | 96 | pc.printf(out); |
Jgreub | 2:ab75a8c63df8 | 97 | } |
Jgreub | 2:ab75a8c63df8 | 98 | |
Jgreub | 2:ab75a8c63df8 | 99 | void sendCheckLock() { |
Jgreub | 2:ab75a8c63df8 | 100 | char out[50]; |
Jgreub | 2:ab75a8c63df8 | 101 | sprintf(out,"X:%d\n", checkLock()); |
Jgreub | 2:ab75a8c63df8 | 102 | pc.printf(out); |
Jgreub | 2:ab75a8c63df8 | 103 | } |
Jgreub | 2:ab75a8c63df8 | 104 | |
Jgreub | 2:ab75a8c63df8 | 105 | void sendCheckDist() { |
Jgreub | 2:ab75a8c63df8 | 106 | |
Jgreub | 2:ab75a8c63df8 | 107 | char out[50]; |
Jgreub | 2:ab75a8c63df8 | 108 | sprintf(out,"D:%d\n",(int) isDoorOpen); |
Jgreub | 2:ab75a8c63df8 | 109 | pc.printf(out); |
Jgreub | 2:ab75a8c63df8 | 110 | } |
Jgreub | 2:ab75a8c63df8 | 111 | |
Jgreub | 2:ab75a8c63df8 | 112 | void sendFullStatus() { |
Jgreub | 2:ab75a8c63df8 | 113 | char out[50]; |
Jgreub | 2:ab75a8c63df8 | 114 | sprintf(out,"X:%d\nD:%d\n", checkLock(), (int)isDoorOpen); |
Jgreub | 2:ab75a8c63df8 | 115 | pc.printf(out); |
Jgreub | 2:ab75a8c63df8 | 116 | } |
Jgreub | 2:ab75a8c63df8 | 117 | |
Jgreub | 2:ab75a8c63df8 | 118 | |
Jgreub | 2:ab75a8c63df8 | 119 | |
Jgreub | 2:ab75a8c63df8 | 120 | |
Jgreub | 2:ab75a8c63df8 | 121 | |
Jgreub | 2:ab75a8c63df8 | 122 | /***************************************/ |
Jgreub | 2:ab75a8c63df8 | 123 | /* CAMERA FUNCTIONS */ |
Jgreub | 2:ab75a8c63df8 | 124 | /***************************************/ |
Jgreub | 2:ab75a8c63df8 | 125 | void callback_func(int done, int total, uint8_t *buf, size_t siz) { |
Jgreub | 2:ab75a8c63df8 | 126 | fwrite(buf, siz, 1, work); |
Jgreub | 2:ab75a8c63df8 | 127 | } |
Jgreub | 2:ab75a8c63df8 | 128 | |
Jgreub | 2:ab75a8c63df8 | 129 | int capture(Camera_LS_Y201 *cam, char *filename) { |
Jgreub | 2:ab75a8c63df8 | 130 | if (cam->takePicture() != 0) { |
Jgreub | 2:ab75a8c63df8 | 131 | return -1; |
Jgreub | 2:ab75a8c63df8 | 132 | } |
Jgreub | 2:ab75a8c63df8 | 133 | |
Jgreub | 2:ab75a8c63df8 | 134 | work = fopen(filename, "wb"); |
Jgreub | 2:ab75a8c63df8 | 135 | if (work == NULL) { |
Jgreub | 2:ab75a8c63df8 | 136 | return -2; |
Jgreub | 2:ab75a8c63df8 | 137 | } |
Jgreub | 2:ab75a8c63df8 | 138 | |
Jgreub | 2:ab75a8c63df8 | 139 | if (cam->readJpegFileContent(callback_func) != 0) { |
Jgreub | 2:ab75a8c63df8 | 140 | fclose(work); |
Jgreub | 2:ab75a8c63df8 | 141 | return -3; |
Jgreub | 2:ab75a8c63df8 | 142 | } |
Jgreub | 2:ab75a8c63df8 | 143 | fclose(work); |
Jgreub | 2:ab75a8c63df8 | 144 | |
Jgreub | 2:ab75a8c63df8 | 145 | cam->stopTakingPictures(); |
Jgreub | 2:ab75a8c63df8 | 146 | return 0; |
Jgreub | 2:ab75a8c63df8 | 147 | } |
Jgreub | 2:ab75a8c63df8 | 148 | |
Jgreub | 2:ab75a8c63df8 | 149 | void sendCurrPic() { |
Jgreub | 2:ab75a8c63df8 | 150 | char fname[64]; |
Jgreub | 2:ab75a8c63df8 | 151 | snprintf(fname, sizeof(fname) - 1, FILENAME, cnt); |
Jgreub | 2:ab75a8c63df8 | 152 | int r = capture(&cam1, fname); |
Jgreub | 2:ab75a8c63df8 | 153 | cnt++; |
Jgreub | 2:ab75a8c63df8 | 154 | } |
Jgreub | 2:ab75a8c63df8 | 155 | |
Jgreub | 2:ab75a8c63df8 | 156 | void breakIn() { |
Jgreub | 2:ab75a8c63df8 | 157 | char out[50]; |
Jgreub | 2:ab75a8c63df8 | 158 | sprintf(out, "B:0\n"); |
Jgreub | 2:ab75a8c63df8 | 159 | pc.printf(out); |
Jgreub | 2:ab75a8c63df8 | 160 | sendCurrPic(); |
Jgreub | 2:ab75a8c63df8 | 161 | //while(1); |
Jgreub | 2:ab75a8c63df8 | 162 | } |
Jgreub | 2:ab75a8c63df8 | 163 | |
Jgreub | 2:ab75a8c63df8 | 164 | |
Jgreub | 2:ab75a8c63df8 | 165 | /***************/ |
Jgreub | 2:ab75a8c63df8 | 166 | /* GET MESSAGE */ |
Jgreub | 2:ab75a8c63df8 | 167 | /***************/ |
Jgreub | 2:ab75a8c63df8 | 168 | void getMessage() { |
Jgreub | 2:ab75a8c63df8 | 169 | //Check for Message |
Jgreub | 2:ab75a8c63df8 | 170 | char signal = pc.getc(); |
Jgreub | 2:ab75a8c63df8 | 171 | |
Jgreub | 2:ab75a8c63df8 | 172 | //Switch on Buffer |
Jgreub | 2:ab75a8c63df8 | 173 | switch(signal) { |
Jgreub | 2:ab75a8c63df8 | 174 | case 'o': |
Jgreub | 2:ab75a8c63df8 | 175 | sendID(); |
Jgreub | 2:ab75a8c63df8 | 176 | break; |
Jgreub | 2:ab75a8c63df8 | 177 | case 'p': |
Jgreub | 2:ab75a8c63df8 | 178 | sendFullStatus(); |
Jgreub | 2:ab75a8c63df8 | 179 | break; |
Jgreub | 2:ab75a8c63df8 | 180 | case 'q': |
Jgreub | 2:ab75a8c63df8 | 181 | sendCheckDist(); |
Jgreub | 2:ab75a8c63df8 | 182 | break; |
Jgreub | 2:ab75a8c63df8 | 183 | case 'w': |
Jgreub | 2:ab75a8c63df8 | 184 | sendCheckLock(); |
Jgreub | 2:ab75a8c63df8 | 185 | break; |
Jgreub | 2:ab75a8c63df8 | 186 | case 's': |
Jgreub | 2:ab75a8c63df8 | 187 | lockDoor(); |
Jgreub | 2:ab75a8c63df8 | 188 | break; |
Jgreub | 2:ab75a8c63df8 | 189 | case 'x': |
Jgreub | 2:ab75a8c63df8 | 190 | unlockDoor(); |
Jgreub | 2:ab75a8c63df8 | 191 | break; |
Jgreub | 2:ab75a8c63df8 | 192 | case 't': |
Jgreub | 2:ab75a8c63df8 | 193 | signalPic = 1; |
Jgreub | 2:ab75a8c63df8 | 194 | break; |
Jgreub | 2:ab75a8c63df8 | 195 | default: |
Jgreub | 2:ab75a8c63df8 | 196 | pc.printf("E\n"); |
Jgreub | 2:ab75a8c63df8 | 197 | break; |
Jgreub | 2:ab75a8c63df8 | 198 | } |
Jgreub | 2:ab75a8c63df8 | 199 | } |
Jgreub | 2:ab75a8c63df8 | 200 | |
Jgreub | 2:ab75a8c63df8 | 201 | |
Jgreub | 2:ab75a8c63df8 | 202 | |
Jgreub | 2:ab75a8c63df8 | 203 | |
Jgreub | 2:ab75a8c63df8 | 204 | |
Jgreub | 2:ab75a8c63df8 | 205 | /***************************************/ |
Jgreub | 2:ab75a8c63df8 | 206 | /* MAIN */ |
Jgreub | 2:ab75a8c63df8 | 207 | /***************************************/ |
Jgreub | 2:ab75a8c63df8 | 208 | int main(void) { |
Jgreub | 2:ab75a8c63df8 | 209 | |
Jgreub | 2:ab75a8c63df8 | 210 | //Setup |
Jgreub | 2:ab75a8c63df8 | 211 | lockLED = 1; |
Jgreub | 2:ab75a8c63df8 | 212 | isDoorLocked = 1; |
Jgreub | 2:ab75a8c63df8 | 213 | isDoorOpen = 0; |
Jgreub | 2:ab75a8c63df8 | 214 | servo = .2; |
Jgreub | 2:ab75a8c63df8 | 215 | |
Jgreub | 2:ab75a8c63df8 | 216 | //Serial Setup Conenction |
Jgreub | 2:ab75a8c63df8 | 217 | pc.baud(115200); |
Jgreub | 2:ab75a8c63df8 | 218 | pc.attach(&getMessage); |
Jgreub | 2:ab75a8c63df8 | 219 | |
Jgreub | 2:ab75a8c63df8 | 220 | //Setup Interrupts |
Jgreub | 2:ab75a8c63df8 | 221 | lockPB.mode(PullUp); |
Jgreub | 2:ab75a8c63df8 | 222 | wait(0.1); |
Jgreub | 2:ab75a8c63df8 | 223 | lockPB.fall(&lockPushed); |
Jgreub | 2:ab75a8c63df8 | 224 | |
Jgreub | 2:ab75a8c63df8 | 225 | //Setup Camera |
Jgreub | 2:ab75a8c63df8 | 226 | wait(1); |
Jgreub | 2:ab75a8c63df8 | 227 | if (cam1.reset() != 0) { |
Jgreub | 2:ab75a8c63df8 | 228 | return 1; |
Jgreub | 2:ab75a8c63df8 | 229 | } |
Jgreub | 2:ab75a8c63df8 | 230 | wait(1); |
Jgreub | 2:ab75a8c63df8 | 231 | |
Jgreub | 2:ab75a8c63df8 | 232 | //Variables |
Jgreub | 2:ab75a8c63df8 | 233 | float DOOR_DISTANCE = float(door) + .08; |
Jgreub | 2:ab75a8c63df8 | 234 | |
Jgreub | 2:ab75a8c63df8 | 235 | |
Jgreub | 2:ab75a8c63df8 | 236 | //Program |
Jgreub | 2:ab75a8c63df8 | 237 | while(1) { |
Jgreub | 2:ab75a8c63df8 | 238 | wait_ms(100); |
Jgreub | 2:ab75a8c63df8 | 239 | |
Jgreub | 2:ab75a8c63df8 | 240 | //Check Camera |
Jgreub | 2:ab75a8c63df8 | 241 | if(signalPic) { |
Jgreub | 2:ab75a8c63df8 | 242 | sendCurrPic(); |
Jgreub | 2:ab75a8c63df8 | 243 | signalPic = 0; |
Jgreub | 2:ab75a8c63df8 | 244 | } |
Jgreub | 2:ab75a8c63df8 | 245 | |
Jgreub | 2:ab75a8c63df8 | 246 | //Check Door Dist and Send if needed |
Jgreub | 2:ab75a8c63df8 | 247 | if(isDoorOpen) { |
Jgreub | 2:ab75a8c63df8 | 248 | if(float(door) < DOOR_DISTANCE) { |
Jgreub | 2:ab75a8c63df8 | 249 | isDoorOpen = 0; |
Jgreub | 2:ab75a8c63df8 | 250 | pc.printf("D:0\n"); |
Jgreub | 2:ab75a8c63df8 | 251 | } |
Jgreub | 2:ab75a8c63df8 | 252 | } |
Jgreub | 2:ab75a8c63df8 | 253 | else { |
Jgreub | 2:ab75a8c63df8 | 254 | if(float(door) > DOOR_DISTANCE) { |
Jgreub | 2:ab75a8c63df8 | 255 | isDoorOpen = 1; |
Jgreub | 2:ab75a8c63df8 | 256 | if(isDoorLocked) { |
Jgreub | 2:ab75a8c63df8 | 257 | breakIn(); //Break In! |
Jgreub | 2:ab75a8c63df8 | 258 | } |
Jgreub | 2:ab75a8c63df8 | 259 | else { |
Jgreub | 2:ab75a8c63df8 | 260 | pc.printf("D:1\n"); |
Jgreub | 2:ab75a8c63df8 | 261 | } |
Jgreub | 2:ab75a8c63df8 | 262 | } |
Jgreub | 2:ab75a8c63df8 | 263 | } |
Jgreub | 2:ab75a8c63df8 | 264 | |
Jgreub | 2:ab75a8c63df8 | 265 | |
Jgreub | 2:ab75a8c63df8 | 266 | }//End While |
Jgreub | 2:ab75a8c63df8 | 267 | } |