Georgia Tech ECE 4180 Final Project
Dependencies: Camera_LS_Y201 FatFileSystem MODSERIAL SDFileSystem SHTx Servo TextLCD mbed
project_defines.hpp
- Committer:
- kpatel70
- Date:
- 2012-12-07
- Revision:
- 0:a33b2a7b4222
File content as of revision 0:a33b2a7b4222:
#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; }