Mbed1 for Smart House project

Dependencies:   SDFileSystem Servo mbed

Fork of Camera_LS_Y201 by Shinichiro Nakamura

Committer:
Jgreub
Date:
Wed May 01 18:41:05 2013 +0000
Revision:
2:ab75a8c63df8
v1

Who changed what in which revision?

UserRevisionLine numberNew 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 }