Georgia Tech ECE 4180 Final Project
Dependencies: Camera_LS_Y201 FatFileSystem MODSERIAL SDFileSystem SHTx Servo TextLCD mbed
Revision 0:a33b2a7b4222, committed 2012-12-07
- Comitter:
- kpatel70
- Date:
- Fri Dec 07 18:53:48 2012 +0000
- Commit message:
- Final ECE-4180 Project libraries
Changed in this revision
diff -r 000000000000 -r a33b2a7b4222 Camera_LS_Y201.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Camera_LS_Y201.lib Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/lndv3/code/Camera_LS_Y201/#e92ce527b8b0
diff -r 000000000000 -r a33b2a7b4222 FatFileSystem.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FatFileSystem.lib Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/kpatel70/code/FatFileSystem/#b12f19dfe9fc
diff -r 000000000000 -r a33b2a7b4222 MODSERIAL.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MODSERIAL.lib Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/AjK/code/MODSERIAL/#5c45c21f36b7
diff -r 000000000000 -r a33b2a7b4222 SDFileSystem.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.lib Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/kpatel70/code/SDFileSystem/#d4fa6c2697e8
diff -r 000000000000 -r a33b2a7b4222 SHTx.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SHTx.lib Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/NegativeBlack/code/SHTx/#8465801be23f
diff -r 000000000000 -r a33b2a7b4222 Servo.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Servo.lib Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/Servo/#36b69a7ced07
diff -r 000000000000 -r a33b2a7b4222 TextLCD.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD.lib Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/TextLCD/#e4cb7ddee0d3
diff -r 000000000000 -r a33b2a7b4222 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,26 @@ +#include "project_defines.hpp" + +int main() +{ + setup_devices(); + calibrate_ir(); + while(1) { + led4 = !led4; + adjust_temperature(); + if(activate && check_movement()){ + pc.printf("\nIntrution Alert: Current ir sensor average %f\n", current_avg); + wait(1); + char message[50]; + sprintf(message, "Intrusion Alert!! Picture # %d captured", index); + send_sms(message); + take_picture(); + play_sound(); + } + read_message(); + if(message_received){ + handle_message(); + wait(2); + } + wait(0.1); + } +}
diff -r 000000000000 -r a33b2a7b4222 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/e2ed12d17f06 \ No newline at end of file
diff -r 000000000000 -r a33b2a7b4222 project_defines.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_defines.hpp Fri Dec 07 18:53:48 2012 +0000 @@ -0,0 +1,412 @@ +#include "mbed.h" +#include "MODSERIAL.h" +#include "Camera_LS_Y201.h" +#include "SDFileSystem.h" +#include "SHTx/sht15.hpp" +#include "Servo.h" +#include "TextLCD.h" + +#define IR_THRESHOLD 0.009f + +#define DEBMSG printf +#define NEWLINE() printf("\r\n") + + +MODSERIAL sms(p13, p14); +Serial pc(USBTX, USBRX); +Servo myservo(p22); +TextLCD lcd(p15, p16, p17, p18, p19, p21); +AnalogIn ir(p20); +SHTx::SHT15 temp_sensor(p9, p10); +SDFileSystem sd(p5, p6, p7, p8, "sd"); +Camera_LS_Y201 cam1(p28, p27); +DigitalOut light1(p29); +DigitalOut light2(p30); +PwmOut speaker(p23); + +typedef struct work { + FILE *fp; +} work_t; + +work_t work; + + +bool movement = false; +float current_avg; + +bool activate = true; + +float current_temperature; +float target_temperature; +bool heat = true; + +int index = 1; + +//char* mobile_number = "6784628602"; +//char* mobile_number = "4043887322"; +char* mobile_number = "4045789581"; + + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +bool message_received = false; +char message[256]; +char sms_buffer[256]; +int message_count = 0; + +void delete_messages() +{ + wait(0.25); + sms.printf("AT+CMGF=1%c", 13); + wait(0.25); + sms.printf("AT+CMGD=1,4%c", 13); + while(!sms.txBufferEmpty()) { + } + wait(2); + sms.rxBufferFlush(); +} + +void send_sms(char * message) +{ + led3 = 1; + pc.printf("Sending SMS\n"); + wait(0.25); + sms.printf("AT+CMGF=1%c", 13); + wait(.25); + sms.printf("AT+CMGS=\"%s\"%c", mobile_number, 13); + wait(0.25); + sms.printf("%s%c", message ,26); + while(!sms.txBufferEmpty()) { + } + wait(0.5); + led3 = 0; +} + +void receive_sms() +{ + wait(0.25); + sms.printf("AT+CMGF=1%c", 13); + wait(0.25); + //sms.printf("AT+CMGL=\"ALL\"%c", 13); + sms.printf("AT+CMGL=\"REC UNREAD\"%c", 13); + while(!sms.txBufferEmpty()) { + } +} + +void get_data(char *buffer) +{ + int index = 0; + char c = sms.getc(); + while(c != 10) { + buffer[index++] = c; + c = sms.getc(); + } + buffer[index] = 0; +} + +void adjust_temperature(){ + temp_sensor.update(); + current_temperature = temp_sensor.getTemperature(); + if(current_temperature > 85.0f){ + send_sms("High Temperature Alert!!!"); + } + if(!heat){ + temp_sensor.setHeater(false); + return; + } + if(current_temperature < target_temperature){ + temp_sensor.setHeater(true); + } else { + temp_sensor.setHeater(false); + } +} + +void read_message() +{ + while(sms.readable()) { + get_data(sms_buffer); + if(strstr(sms_buffer, "CMGL") != NULL) { + for(int i = 0; i < 256; i++) message[i] = 0; + get_data(message); + message_received = true; + delete_messages(); + return; + } + sms_buffer[0] = 0; + } + receive_sms(); +} + + + +void setup_devices() +{ + sms.baud(115200); + pc.baud(115200); + //pc.printf("\x1B[2J"); + //pc.printf("\x1B[H"); + message_received = false; + led4 = 1; + delete_messages(); + mkdir("/sd/mydir", 0777); + temp_sensor.setScale(true); + current_temperature = temp_sensor.getTemperature(); + target_temperature = current_temperature; +} + +bool check_movement() +{ + float value = ir; + if (value > (current_avg + IR_THRESHOLD) || value < (current_avg - IR_THRESHOLD)){ + led1 = 1; + printf("MOVEMENT_DETECTED: IR value is %f, Current_avg: %f\r\n",value, current_avg); + return true; + } else { + led1 = 0; + //printf("IR value is %f, Current_avg: %f\r\n", value, current_avg); + return false; + } +} + +void calibrate_ir() +{ + float current_sum = 0.0f; + for(int i = 0; i < 10000; i++) { + current_sum = current_sum + ir; + } + current_avg = current_sum / 10000.0f; +} + +/** +* Callback function for readJpegFileContent. +* +* @param buf A pointer to a buffer. +* @param siz A size of the buffer. +*/ +void callback_func(int done, int total, uint8_t *buf, size_t siz) +{ + fwrite(buf, siz, 1, work.fp); + + static int n = 0; + int tmp = done * 100 / total; + if (n != tmp) { + n = tmp; + DEBMSG("Writing...: %3d%%", n); + NEWLINE(); + } +} + + +/** +* Capture. +* +* @param cam A pointer to a camera object. +* @param filename The file name. +* +* @return Return 0 if it succeed. +*/ +int capture(Camera_LS_Y201 *cam, char *filename) +{ + /* + * Take a picture. + */ + if (cam->takePicture() != 0) { + return -1; + } + DEBMSG("Captured."); + NEWLINE(); + + /* + * Open file. + */ + work.fp = fopen(filename, "wb"); + if (work.fp == NULL) { + return -2; + } + + /* + * Read the content. + */ + DEBMSG("%s", filename); + NEWLINE(); + if (cam->readJpegFileContent(callback_func) != 0) { + fclose(work.fp); + return -3; + } + fclose(work.fp); + + /* + * Stop taking pictures. + */ + cam->stopTakingPictures(); + + return 0; +} + +void take_picture() +{ + + myservo.write(0); + int a; + wait(1); + char buffer[25]; + sprintf(buffer, "/sd/mydir/%d_1.jpg", index); + a = capture(&cam1,buffer); + switch (a) { + case -1: + led1=1; + break; + case -2: + //led2=1; + break; + case -3: + led3=1; + break; + case 0: + led4=1; + lcd.printf("Took picture 1!\n"); + break; + } + + wait(1); + led1=0; + //led2=0; + led3=0; + led4=0; + + myservo.write(0.5); + wait(1); + sprintf(buffer, "/sd/mydir/%d_2.jpg", index); + a= capture(&cam1,buffer); + + switch (a) { + case -1: + led1=1; + break; + case -2: + //led2=1; + break; + case -3: + led3=1; + break; + case 0: + led4=1; + lcd.printf("Took picture 2!\n"); + break; + } + + wait(1); + led1=0; + //led2=0; + led3=0; + led4=0; + myservo.write(1); + wait(1); + sprintf(buffer, "/sd/mydir/%d_3.jpg", index++); + a= capture(&cam1,buffer); + switch (a) { + case -1: + led1=1; + break; + case -2: + //led2=1; + break; + case -3: + led3=1; + break; + case 0: + led4=1; + lcd.printf("Took picture 3!\n"); + break; + } + + wait(1); + led1=0; + //led2=0; + led3=0; + led4=0; + +} + + +void handle_message() +{ + int temp; + pc.printf("MESSAGE: %s\n", message); + if(strstr(message, "take picture") != NULL){ + take_picture(); + } else if(strstr(message, "turn off alarm") != NULL){ + speaker = 0; + } else if(strstr(message, "get status") != NULL){ + char msg[100]; + int l1 = light1; + int l2 = light2; + int spk = speaker > 0.0f; + sprintf(msg, "Status: Light1 = %d, Light2 = %d, Temperature = %f, Alarm = %d", l1, l2, temp_sensor.getTemperature(), spk); + send_sms(msg); + pc.printf(msg); + } else if (strstr(message, "deactivate") != NULL){ + speaker = 0; + activate = false; + led2 = 0; + pc.printf("\nIntrusion alert not active\n"); + } else if (strstr(message, "activate") != NULL){ + activate = true; + calibrate_ir(); + light1 = 0; + light2 = 0; + heat = false; + temp_sensor.setHeater(false); + led2 = 1; + pc.printf("\nIntrusion alert active\n"); + } else if (strstr(message, "turn off light 1") != NULL){ + pc.printf("\nTurning off light 1\n"); + light1 = 0; + } else if (strstr(message, "turn off light 2") != NULL){ + pc.printf("\nTurning off light 2\n"); + light2 = 0; + } else if (strstr(message, "turn on light 1") != NULL){ + pc.printf("\nTurning on light 1\n"); + light1 = 1; + } else if (strstr(message, "turn on light 2") != NULL){ + pc.printf("\nTurning on light 2\n"); + light2 = 1; + } else if (strstr(message, "turn off heat") != NULL){ + heat = false; + lcd.printf("Heat off!\n"); + pc.printf("\nTurning off heat\n"); + } else if (strstr(message, "get temperature") != NULL){ + char new_message[30]; + sprintf(new_message, "Current Temperature is %f", temp_sensor.getTemperature()); + send_sms(new_message); + pc.printf("\nSending current temperature %f\n", temp_sensor.getTemperature()); + } else if (sscanf(message, "set temperature %d", &temp) >=1){ + target_temperature = (float)temp; + lcd.cls(); + lcd.printf("Target temp: %d\n", temp); + heat = true; + if(current_temperature < target_temperature){ + lcd.printf("Heater ON\n"); + } else { + lcd.printf("Heater OFF\n"); + } + pc.printf("Setting target temperature to %d\n", temp); + } + message[0] = 0; + message_received = false; + +} + +void play_sound(){ + for(int i = 0; i < 5000; i++){ + for(float j = 0.0; j <= 1.0; j+=0.1){ + speaker = j; + wait(0.0001); + + } + } + //speaker = 0.0; +}