Lab3_Surveillance

Dependencies:   GPS mbed

Committer:
gtg846r
Date:
Thu Oct 13 17:42:27 2011 +0000
Revision:
2:ba06c987a111
Parent:
1:65200fe545a5
Revision #3...Includes phone number input

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gtg846r 0:2af1e48a285d 1 #include "mbed.h"
gtg846r 0:2af1e48a285d 2 #include "Camera_LS_Y201.h"
gtg846r 0:2af1e48a285d 3 //#include <string.h>
gtg846r 0:2af1e48a285d 4 //#include "GPS.h"
gtg846r 0:2af1e48a285d 5 #define DEBMSG printf
gtg846r 0:2af1e48a285d 6 #define NEWLINE() printf("\r\n")
gtg846r 0:2af1e48a285d 7
gtg846r 0:2af1e48a285d 8 #define BUFF_SIZE 32
gtg846r 0:2af1e48a285d 9 #define USE_SDCARD 0
gtg846r 0:2af1e48a285d 10
gtg846r 0:2af1e48a285d 11
gtg846r 0:2af1e48a285d 12 #if USE_SDCARD
gtg846r 0:2af1e48a285d 13 #define FILENAME "/sd/IMG_%04d.jpg"
gtg846r 0:2af1e48a285d 14 //SDFileSystem fs(p5, p6, p7, p8, "sd");
gtg846r 0:2af1e48a285d 15 #else
gtg846r 0:2af1e48a285d 16 #define FILENAME "/local/ALT%d_%02d.jpg"
gtg846r 0:2af1e48a285d 17 LocalFileSystem fs("local");
gtg846r 0:2af1e48a285d 18 #endif
gtg846r 0:2af1e48a285d 19 Camera_LS_Y201 cam1(p28, p27);
gtg846r 0:2af1e48a285d 20 #define DEPTH 5
gtg846r 0:2af1e48a285d 21 //GPS gps(p9,p10);
gtg846r 0:2af1e48a285d 22 Serial gsm(p13,p14);
gtg846r 0:2af1e48a285d 23 Serial pc(USBTX,USBRX);
gtg846r 0:2af1e48a285d 24 AnalogIn motion(p15);
gtg846r 0:2af1e48a285d 25
gtg846r 0:2af1e48a285d 26 float reading;
gtg846r 0:2af1e48a285d 27 int alert_num = 0;
gtg846r 2:ba06c987a111 28 char phone_num[11];
gtg846r 0:2af1e48a285d 29
gtg846r 0:2af1e48a285d 30 typedef struct work {
gtg846r 0:2af1e48a285d 31 FILE *fp;
gtg846r 0:2af1e48a285d 32 } work_t;
gtg846r 0:2af1e48a285d 33
gtg846r 0:2af1e48a285d 34 work_t work;
gtg846r 0:2af1e48a285d 35
gtg846r 0:2af1e48a285d 36 /**
gtg846r 0:2af1e48a285d 37 * Callback function for readJpegFileContent.
gtg846r 0:2af1e48a285d 38 *
gtg846r 0:2af1e48a285d 39 * @param buf A pointer to a buffer.
gtg846r 0:2af1e48a285d 40 * @param siz A size of the buffer.
gtg846r 0:2af1e48a285d 41 */
gtg846r 0:2af1e48a285d 42 void callback_func(int done, int total, uint8_t *buf, size_t siz)
gtg846r 0:2af1e48a285d 43 {
gtg846r 0:2af1e48a285d 44 fwrite(buf, siz, 1, work.fp);
gtg846r 0:2af1e48a285d 45
gtg846r 0:2af1e48a285d 46 }
gtg846r 0:2af1e48a285d 47
gtg846r 0:2af1e48a285d 48
gtg846r 0:2af1e48a285d 49 /**
gtg846r 0:2af1e48a285d 50 * Capture.
gtg846r 0:2af1e48a285d 51 *
gtg846r 0:2af1e48a285d 52 * @param cam A pointer to a camera object.
gtg846r 0:2af1e48a285d 53 * @param filename The file name.
gtg846r 0:2af1e48a285d 54 *
gtg846r 0:2af1e48a285d 55 * @return Return 0 if it succeed.
gtg846r 0:2af1e48a285d 56 */
gtg846r 0:2af1e48a285d 57 int capture(Camera_LS_Y201 *cam, char *filename)
gtg846r 0:2af1e48a285d 58 {
gtg846r 0:2af1e48a285d 59 /*
gtg846r 0:2af1e48a285d 60 * Take a picture.
gtg846r 0:2af1e48a285d 61 */
gtg846r 0:2af1e48a285d 62 if (cam->takePicture() != 0) {
gtg846r 0:2af1e48a285d 63 return -1;
gtg846r 0:2af1e48a285d 64 }
gtg846r 1:65200fe545a5 65 //DEBMSG("Captured.");
gtg846r 1:65200fe545a5 66 //NEWLINE();
gtg846r 0:2af1e48a285d 67
gtg846r 0:2af1e48a285d 68 /*
gtg846r 0:2af1e48a285d 69 * Open file.
gtg846r 0:2af1e48a285d 70 */
gtg846r 0:2af1e48a285d 71 work.fp = fopen(filename, "wb");
gtg846r 0:2af1e48a285d 72 if (work.fp == NULL) {
gtg846r 0:2af1e48a285d 73 return -2;
gtg846r 0:2af1e48a285d 74 }
gtg846r 0:2af1e48a285d 75
gtg846r 0:2af1e48a285d 76 /*
gtg846r 0:2af1e48a285d 77 * Read the content.
gtg846r 0:2af1e48a285d 78 */
gtg846r 1:65200fe545a5 79 //DEBMSG("%s", filename);
gtg846r 1:65200fe545a5 80 //NEWLINE();
gtg846r 0:2af1e48a285d 81 if (cam->readJpegFileContent(callback_func) != 0)
gtg846r 0:2af1e48a285d 82 {
gtg846r 0:2af1e48a285d 83 fclose(work.fp);
gtg846r 0:2af1e48a285d 84 return -3;
gtg846r 0:2af1e48a285d 85 }
gtg846r 0:2af1e48a285d 86 fclose(work.fp);
gtg846r 0:2af1e48a285d 87
gtg846r 0:2af1e48a285d 88 /*
gtg846r 0:2af1e48a285d 89 * Stop taking pictures.
gtg846r 0:2af1e48a285d 90 */
gtg846r 0:2af1e48a285d 91 cam->stopTakingPictures();
gtg846r 0:2af1e48a285d 92
gtg846r 0:2af1e48a285d 93 return 0;
gtg846r 0:2af1e48a285d 94 }
gtg846r 0:2af1e48a285d 95
gtg846r 0:2af1e48a285d 96 void print_pics()
gtg846r 0:2af1e48a285d 97 {
gtg846r 1:65200fe545a5 98
gtg846r 0:2af1e48a285d 99 int cnt = 0;
gtg846r 1:65200fe545a5 100 int c = 0;
gtg846r 0:2af1e48a285d 101 while (cnt < 4)
gtg846r 0:2af1e48a285d 102 {
gtg846r 1:65200fe545a5 103
gtg846r 0:2af1e48a285d 104 char fname[64];
gtg846r 0:2af1e48a285d 105 snprintf(fname, sizeof(fname) - 1, FILENAME, alert_num, cnt);
gtg846r 0:2af1e48a285d 106 int r = capture(&cam1, fname);
gtg846r 0:2af1e48a285d 107 if (r == 0)
gtg846r 0:2af1e48a285d 108 {
gtg846r 1:65200fe545a5 109 ++c;
gtg846r 1:65200fe545a5 110 // DEBMSG("[%04d]:OK.", cnt);
gtg846r 1:65200fe545a5 111 //NEWLINE();
gtg846r 0:2af1e48a285d 112 }
gtg846r 0:2af1e48a285d 113 else
gtg846r 0:2af1e48a285d 114 {
gtg846r 0:2af1e48a285d 115 DEBMSG("[%04d]:NG. (code=%d)", cnt, r);
gtg846r 0:2af1e48a285d 116 NEWLINE();
gtg846r 0:2af1e48a285d 117 error("Failure.");
gtg846r 0:2af1e48a285d 118 }
gtg846r 0:2af1e48a285d 119 cnt++;
gtg846r 0:2af1e48a285d 120 }
gtg846r 1:65200fe545a5 121 if(c==4)
gtg846r 1:65200fe545a5 122 {
gtg846r 1:65200fe545a5 123 printf("All pictures taken \n");
gtg846r 1:65200fe545a5 124 }
gtg846r 0:2af1e48a285d 125
gtg846r 0:2af1e48a285d 126 return;
gtg846r 0:2af1e48a285d 127 }
gtg846r 0:2af1e48a285d 128
gtg846r 0:2af1e48a285d 129 void send_text()
gtg846r 0:2af1e48a285d 130 {
gtg846r 0:2af1e48a285d 131 char buf[40];
gtg846r 0:2af1e48a285d 132 char buf2= 0x1A;
gtg846r 0:2af1e48a285d 133
gtg846r 0:2af1e48a285d 134 gsm.printf("AT\r\n"); //Should return OK
gtg846r 1:65200fe545a5 135 // gsm.scanf("%s",buf);
gtg846r 1:65200fe545a5 136 // pc.printf("%s\n",buf);
gtg846r 1:65200fe545a5 137
gtg846r 0:2af1e48a285d 138 //gsm.scanf("%s",buf1);
gtg846r 0:2af1e48a285d 139 //pc.printf("%s\n",buf1);
gtg846r 1:65200fe545a5 140 wait(.5);
gtg846r 0:2af1e48a285d 141 gsm.printf("AT+CSMP=17,167,0,0\r\n"); //Set text mode parameters =<fo>,<vp>,<pid>,<dcs>
gtg846r 1:65200fe545a5 142 //gsm.scanf("%s",buf); // Should return OK
gtg846r 0:2af1e48a285d 143 //gsm.scanf("%s",buf1);
gtg846r 1:65200fe545a5 144 //pc.printf("%s\n",buf);
gtg846r 0:2af1e48a285d 145 //pc.printf("%s\n",buf1);
gtg846r 1:65200fe545a5 146 wait(.5);
gtg846r 0:2af1e48a285d 147 gsm.printf("AT+CMGF=1\r\n"); //1 - text mode, indicates the format of messages used with send, list, read and write commands
gtg846r 1:65200fe545a5 148 //gsm.scanf("%s",buf);
gtg846r 0:2af1e48a285d 149 // gsm.scanf("%s",buf1);
gtg846r 1:65200fe545a5 150 //pc.printf("%s\n",buf);
gtg846r 0:2af1e48a285d 151 //pc.printf("%s\n",buf1);
gtg846r 1:65200fe545a5 152 wait(.5);
gtg846r 0:2af1e48a285d 153 while (1)
gtg846r 0:2af1e48a285d 154 {
gtg846r 0:2af1e48a285d 155 //pc.printf("message sent");
gtg846r 2:ba06c987a111 156 gsm.printf("AT+CMGS=\"%s\"\r\n", phone_num); //AT+CMGS=”<da>"...da - destination address
gtg846r 1:65200fe545a5 157 // gsm.scanf("%s",buf); //Response OK
gtg846r 0:2af1e48a285d 158 // gsm.scanf("%s",buf1);
gtg846r 1:65200fe545a5 159 //pc.printf("%s\n",buf);
gtg846r 0:2af1e48a285d 160 //pc.printf("%s\n",buf1);
gtg846r 1:65200fe545a5 161 wait(.5);
gtg846r 1:65200fe545a5 162 gsm.printf("Alert message #%d %c \r\n", alert_num, buf2); //Actual message following CMGS command followed by ctrl+z (buf2)
gtg846r 1:65200fe545a5 163 //gsm.scanf("%s",buf); //Response OK
gtg846r 0:2af1e48a285d 164 // gsm.scanf("%s",buf1);
gtg846r 1:65200fe545a5 165 //pc.printf("%s\n",buf);
gtg846r 0:2af1e48a285d 166 //pc.printf("%s\n",buf1);
gtg846r 0:2af1e48a285d 167 pc.printf("Message sent \n");
gtg846r 0:2af1e48a285d 168
gtg846r 0:2af1e48a285d 169 break;
gtg846r 0:2af1e48a285d 170 }
gtg846r 0:2af1e48a285d 171 }
gtg846r 0:2af1e48a285d 172
gtg846r 0:2af1e48a285d 173 void sound_alarm()
gtg846r 0:2af1e48a285d 174 {
gtg846r 0:2af1e48a285d 175 ++alert_num;
gtg846r 1:65200fe545a5 176 pc.printf("\nSound alarm...alert alert\n");
gtg846r 1:65200fe545a5 177 pc.printf("The value was: %f \n", reading);
gtg846r 1:65200fe545a5 178 pc.printf("4 Pictures being taken... \n");
gtg846r 0:2af1e48a285d 179 print_pics();
gtg846r 1:65200fe545a5 180 pc.printf("Pictures have been taken!\n");
gtg846r 1:65200fe545a5 181 pc.printf("Sending text alert...\n");
gtg846r 0:2af1e48a285d 182 send_text();
gtg846r 1:65200fe545a5 183
gtg846r 1:65200fe545a5 184
gtg846r 1:65200fe545a5 185
gtg846r 1:65200fe545a5 186 pc.printf("Re-engaging in 10 seconds... \n");
gtg846r 1:65200fe545a5 187 wait(10);
gtg846r 0:2af1e48a285d 188 return;
gtg846r 0:2af1e48a285d 189 }
gtg846r 0:2af1e48a285d 190
gtg846r 1:65200fe545a5 191 void init_cam()
gtg846r 1:65200fe545a5 192 {
gtg846r 1:65200fe545a5 193 if (cam1.reset() == 0)
gtg846r 1:65200fe545a5 194 {
gtg846r 1:65200fe545a5 195 DEBMSG("Reset OK.");
gtg846r 1:65200fe545a5 196 NEWLINE();
gtg846r 1:65200fe545a5 197 }
gtg846r 1:65200fe545a5 198 else
gtg846r 1:65200fe545a5 199 {
gtg846r 1:65200fe545a5 200 DEBMSG("Reset fail.");
gtg846r 1:65200fe545a5 201 NEWLINE();
gtg846r 1:65200fe545a5 202 error("Reset fail.");
gtg846r 1:65200fe545a5 203 }
gtg846r 1:65200fe545a5 204 return;
gtg846r 1:65200fe545a5 205 }
gtg846r 0:2af1e48a285d 206
gtg846r 0:2af1e48a285d 207
gtg846r 0:2af1e48a285d 208 int main()
gtg846r 0:2af1e48a285d 209 {
gtg846r 0:2af1e48a285d 210 gsm.baud(115200);
gtg846r 0:2af1e48a285d 211 pc.baud(115200);
gtg846r 1:65200fe545a5 212 //pc.printf("Testing...");
gtg846r 1:65200fe545a5 213 //send_text();
gtg846r 1:65200fe545a5 214
gtg846r 0:2af1e48a285d 215 char user_input[5] = "";
gtg846r 0:2af1e48a285d 216 // user_input = "";
gtg846r 0:2af1e48a285d 217
gtg846r 0:2af1e48a285d 218 float moving_avg[DEPTH];
gtg846r 0:2af1e48a285d 219 double avg;
gtg846r 0:2af1e48a285d 220
gtg846r 0:2af1e48a285d 221 //
gtg846r 0:2af1e48a285d 222 while(strcmp(user_input, "y") != 0)
gtg846r 0:2af1e48a285d 223 {
gtg846r 0:2af1e48a285d 224 pc.printf("Initialize Security System (y/n) \n");
gtg846r 0:2af1e48a285d 225 pc.scanf("%s", user_input);
gtg846r 2:ba06c987a111 226 pc.printf("Input phone number to send alerts\n");
gtg846r 2:ba06c987a111 227 pc.scanf("%s", phone_num);
gtg846r 0:2af1e48a285d 228 }
gtg846r 1:65200fe545a5 229 pc.printf("Initializing...\n");
gtg846r 1:65200fe545a5 230 init_cam();
gtg846r 1:65200fe545a5 231
gtg846r 0:2af1e48a285d 232 int i = 0;
gtg846r 0:2af1e48a285d 233 while(1)
gtg846r 0:2af1e48a285d 234 {
gtg846r 0:2af1e48a285d 235 //Moving average for motion detection
gtg846r 0:2af1e48a285d 236 //moving_avg[i] = motion.read();
gtg846r 0:2af1e48a285d 237 reading = motion.read();
gtg846r 0:2af1e48a285d 238 if(i>=DEPTH) //Check for difference versus moving avg
gtg846r 0:2af1e48a285d 239 {
gtg846r 0:2af1e48a285d 240 if(i == DEPTH)
gtg846r 0:2af1e48a285d 241 pc.printf("Security System Engaged! \n");
gtg846r 0:2af1e48a285d 242 avg = 0;
gtg846r 0:2af1e48a285d 243
gtg846r 0:2af1e48a285d 244 for(int j=0; j < DEPTH; ++j)
gtg846r 0:2af1e48a285d 245 avg = avg + moving_avg[j];
gtg846r 0:2af1e48a285d 246 avg = avg/DEPTH;
gtg846r 0:2af1e48a285d 247 pc.printf("Average = %f", avg);
gtg846r 0:2af1e48a285d 248 if((reading > 1.2 * avg)||(reading < .8 *avg))
gtg846r 0:2af1e48a285d 249 {
gtg846r 0:2af1e48a285d 250 sound_alarm();
gtg846r 0:2af1e48a285d 251 continue;
gtg846r 0:2af1e48a285d 252 }
gtg846r 0:2af1e48a285d 253 else
gtg846r 0:2af1e48a285d 254 moving_avg[i%DEPTH] = reading;
gtg846r 0:2af1e48a285d 255 }
gtg846r 0:2af1e48a285d 256 else
gtg846r 0:2af1e48a285d 257 moving_avg[i%DEPTH] = reading;
gtg846r 0:2af1e48a285d 258
gtg846r 0:2af1e48a285d 259 ++i;
gtg846r 0:2af1e48a285d 260 pc.printf("Motion value: %f\n", reading);
gtg846r 2:ba06c987a111 261 wait(.4);
gtg846r 0:2af1e48a285d 262 }
gtg846r 0:2af1e48a285d 263
gtg846r 0:2af1e48a285d 264 return 0;
gtg846r 0:2af1e48a285d 265 }