Ajay Elango
/
mbed_controlling_devices
ECE 4180 final project- GPS based home automation: code for mbed controlling home devices
main.cpp@0:d9970d37dd77, 2014-04-28 (annotated)
- Committer:
- ajayke
- Date:
- Mon Apr 28 17:58:19 2014 +0000
- Revision:
- 0:d9970d37dd77
GPS based home automation: mbed controlling devices
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ajayke | 0:d9970d37dd77 | 1 | #include "mbed.h" |
ajayke | 0:d9970d37dd77 | 2 | #include "rtos.h" |
ajayke | 0:d9970d37dd77 | 3 | AnalogIn light_1(p20); //light sensor |
ajayke | 0:d9970d37dd77 | 4 | AnalogIn proxi_2(p15); // for detecting motion within the house |
ajayke | 0:d9970d37dd77 | 5 | DigitalIn proxi_1(p5); // for security |
ajayke | 0:d9970d37dd77 | 6 | DigitalOut relay_1(p8);// power switch tail for controlling the lamp |
ajayke | 0:d9970d37dd77 | 7 | DigitalOut relay_2(p22);// power switch tail for controlling the fan |
ajayke | 0:d9970d37dd77 | 8 | DigitalIn P11(p11); // Digital inputs p10,p11,p12,p13,p14,p16,p17 for communication between two mbeds; p18 and p19 for handshake signals; |
ajayke | 0:d9970d37dd77 | 9 | DigitalIn P12(p12); |
ajayke | 0:d9970d37dd77 | 10 | DigitalIn P13(p13); |
ajayke | 0:d9970d37dd77 | 11 | DigitalIn P14(p14); |
ajayke | 0:d9970d37dd77 | 12 | DigitalIn P10(p10); |
ajayke | 0:d9970d37dd77 | 13 | DigitalIn P16(p16); |
ajayke | 0:d9970d37dd77 | 14 | DigitalIn P17(p17); |
ajayke | 0:d9970d37dd77 | 15 | DigitalOut P18(p18); |
ajayke | 0:d9970d37dd77 | 16 | DigitalIn P19(p19); |
ajayke | 0:d9970d37dd77 | 17 | DigitalOut myled(LED1); |
ajayke | 0:d9970d37dd77 | 18 | DigitalOut led2(LED2); // device 2 |
ajayke | 0:d9970d37dd77 | 19 | DigitalOut led3(LED3); //device 3 |
ajayke | 0:d9970d37dd77 | 20 | DigitalOut led4(LED4); //device 4 |
ajayke | 0:d9970d37dd77 | 21 | Serial pc(USBTX,USBRX); |
ajayke | 0:d9970d37dd77 | 22 | float light_thresh=0.4; // set threshold value for light sensor |
ajayke | 0:d9970d37dd77 | 23 | float ir_value=0.4; // set threshold value for IR sensor to detect the presence inside the house |
ajayke | 0:d9970d37dd77 | 24 | int P111; |
ajayke | 0:d9970d37dd77 | 25 | int P112; |
ajayke | 0:d9970d37dd77 | 26 | int P113; |
ajayke | 0:d9970d37dd77 | 27 | int P114; |
ajayke | 0:d9970d37dd77 | 28 | int P115; |
ajayke | 0:d9970d37dd77 | 29 | int P116; |
ajayke | 0:d9970d37dd77 | 30 | int P117; |
ajayke | 0:d9970d37dd77 | 31 | Mutex bulb; //for locking and unlocking the lamp |
ajayke | 0:d9970d37dd77 | 32 | Mutex pc_lock; //for virtual COM port |
ajayke | 0:d9970d37dd77 | 33 | |
ajayke | 0:d9970d37dd77 | 34 | |
ajayke | 0:d9970d37dd77 | 35 | void security_thread(void const *args) // thread for detecting presence near the house |
ajayke | 0:d9970d37dd77 | 36 | { |
ajayke | 0:d9970d37dd77 | 37 | while(true) |
ajayke | 0:d9970d37dd77 | 38 | { |
ajayke | 0:d9970d37dd77 | 39 | |
ajayke | 0:d9970d37dd77 | 40 | wait(2); |
ajayke | 0:d9970d37dd77 | 41 | if(P116==1) // check if security feature is enabled or not |
ajayke | 0:d9970d37dd77 | 42 | { |
ajayke | 0:d9970d37dd77 | 43 | if(proxi_1==0) // check the status of proximity sensor |
ajayke | 0:d9970d37dd77 | 44 | { |
ajayke | 0:d9970d37dd77 | 45 | bulb.lock(); |
ajayke | 0:d9970d37dd77 | 46 | led2=1; //switch on device 2 |
ajayke | 0:d9970d37dd77 | 47 | relay_2=1; //switch on the fan |
ajayke | 0:d9970d37dd77 | 48 | bulb.unlock(); |
ajayke | 0:d9970d37dd77 | 49 | wait(3); |
ajayke | 0:d9970d37dd77 | 50 | led2=0; //switch off device 2 |
ajayke | 0:d9970d37dd77 | 51 | relay_2=0; //switch off the fan |
ajayke | 0:d9970d37dd77 | 52 | wait(3); |
ajayke | 0:d9970d37dd77 | 53 | |
ajayke | 0:d9970d37dd77 | 54 | |
ajayke | 0:d9970d37dd77 | 55 | |
ajayke | 0:d9970d37dd77 | 56 | } |
ajayke | 0:d9970d37dd77 | 57 | |
ajayke | 0:d9970d37dd77 | 58 | |
ajayke | 0:d9970d37dd77 | 59 | } |
ajayke | 0:d9970d37dd77 | 60 | |
ajayke | 0:d9970d37dd77 | 61 | |
ajayke | 0:d9970d37dd77 | 62 | } |
ajayke | 0:d9970d37dd77 | 63 | |
ajayke | 0:d9970d37dd77 | 64 | |
ajayke | 0:d9970d37dd77 | 65 | } |
ajayke | 0:d9970d37dd77 | 66 | |
ajayke | 0:d9970d37dd77 | 67 | int main() { |
ajayke | 0:d9970d37dd77 | 68 | |
ajayke | 0:d9970d37dd77 | 69 | P19.mode(PullUp); |
ajayke | 0:d9970d37dd77 | 70 | proxi_1.mode(PullUp); |
ajayke | 0:d9970d37dd77 | 71 | |
ajayke | 0:d9970d37dd77 | 72 | P18=1; // Initialize the hand shake signal |
ajayke | 0:d9970d37dd77 | 73 | P116=0; // Make sure the security feature is turned off by default |
ajayke | 0:d9970d37dd77 | 74 | Thread security(security_thread); |
ajayke | 0:d9970d37dd77 | 75 | |
ajayke | 0:d9970d37dd77 | 76 | while(1) { |
ajayke | 0:d9970d37dd77 | 77 | |
ajayke | 0:d9970d37dd77 | 78 | label: while(P19==1) // wait till the mbed receives data from the master mbed |
ajayke | 0:d9970d37dd77 | 79 | { |
ajayke | 0:d9970d37dd77 | 80 | |
ajayke | 0:d9970d37dd77 | 81 | } |
ajayke | 0:d9970d37dd77 | 82 | |
ajayke | 0:d9970d37dd77 | 83 | if(P19==0) //make sure if the read signal is a correct one by waiting for one second and checking again |
ajayke | 0:d9970d37dd77 | 84 | { wait(1); |
ajayke | 0:d9970d37dd77 | 85 | if(P19!=0) |
ajayke | 0:d9970d37dd77 | 86 | goto label; |
ajayke | 0:d9970d37dd77 | 87 | } |
ajayke | 0:d9970d37dd77 | 88 | //store the status of the digital input pins |
ajayke | 0:d9970d37dd77 | 89 | P111=(int)P11; // D1 |
ajayke | 0:d9970d37dd77 | 90 | P112=(int)P12; // D2 |
ajayke | 0:d9970d37dd77 | 91 | P113=(int)P13; // D3 |
ajayke | 0:d9970d37dd77 | 92 | P114=(int)P14; // D4 |
ajayke | 0:d9970d37dd77 | 93 | P115=(int)P10; // manual=0;automatic=1 |
ajayke | 0:d9970d37dd77 | 94 | P116=(int)P16; //security on=1, off=0 |
ajayke | 0:d9970d37dd77 | 95 | P117=(int)P17; //near=0, far=1 |
ajayke | 0:d9970d37dd77 | 96 | |
ajayke | 0:d9970d37dd77 | 97 | pc_lock.lock(); |
ajayke | 0:d9970d37dd77 | 98 | pc.printf("\n P11: %d, P12: %d, P13: %d, P14:%d, P15:%d, P16:%d, P17:%d\n Proxi_2 %f\n ",P111,P112,P113,P114,P115,P116,P117,(float)proxi_2); |
ajayke | 0:d9970d37dd77 | 99 | |
ajayke | 0:d9970d37dd77 | 100 | pc_lock.unlock(); |
ajayke | 0:d9970d37dd77 | 101 | P18=0; //Indicate the reception of data by pulling p18 low |
ajayke | 0:d9970d37dd77 | 102 | |
ajayke | 0:d9970d37dd77 | 103 | // blink LED1 to indicate that data has been received |
ajayke | 0:d9970d37dd77 | 104 | myled = 1; |
ajayke | 0:d9970d37dd77 | 105 | wait(2); |
ajayke | 0:d9970d37dd77 | 106 | myled = 0; |
ajayke | 0:d9970d37dd77 | 107 | wait(2); |
ajayke | 0:d9970d37dd77 | 108 | P18=1; |
ajayke | 0:d9970d37dd77 | 109 | |
ajayke | 0:d9970d37dd77 | 110 | |
ajayke | 0:d9970d37dd77 | 111 | if((float)proxi_2<ir_value) // check presence inside house |
ajayke | 0:d9970d37dd77 | 112 | |
ajayke | 0:d9970d37dd77 | 113 | { |
ajayke | 0:d9970d37dd77 | 114 | |
ajayke | 0:d9970d37dd77 | 115 | if(P115==1) // check if automatic mode is turned on |
ajayke | 0:d9970d37dd77 | 116 | { |
ajayke | 0:d9970d37dd77 | 117 | if(P117==0) //check if the user is near the home location |
ajayke | 0:d9970d37dd77 | 118 | { |
ajayke | 0:d9970d37dd77 | 119 | if((float)light_1<light_thresh) //check value of light sensor, turn on light if it is less than the threshold |
ajayke | 0:d9970d37dd77 | 120 | relay_1=1; |
ajayke | 0:d9970d37dd77 | 121 | else relay_1=0; //turn off light if there is enough ambient light |
ajayke | 0:d9970d37dd77 | 122 | pc.printf("Light sensor: %f \n",(float)light_1); |
ajayke | 0:d9970d37dd77 | 123 | bulb.lock(); |
ajayke | 0:d9970d37dd77 | 124 | led2=1; //turn on device2 |
ajayke | 0:d9970d37dd77 | 125 | relay_2=1; //turn on the fan |
ajayke | 0:d9970d37dd77 | 126 | bulb.unlock(); |
ajayke | 0:d9970d37dd77 | 127 | led3=1; //turn on device 3 |
ajayke | 0:d9970d37dd77 | 128 | led4=1; //turn on device 4 |
ajayke | 0:d9970d37dd77 | 129 | |
ajayke | 0:d9970d37dd77 | 130 | |
ajayke | 0:d9970d37dd77 | 131 | } |
ajayke | 0:d9970d37dd77 | 132 | else //user is far away from home loation; turn off all devices |
ajayke | 0:d9970d37dd77 | 133 | { |
ajayke | 0:d9970d37dd77 | 134 | relay_1=0; |
ajayke | 0:d9970d37dd77 | 135 | bulb.lock(); |
ajayke | 0:d9970d37dd77 | 136 | led2=0; |
ajayke | 0:d9970d37dd77 | 137 | relay_2=0; |
ajayke | 0:d9970d37dd77 | 138 | bulb.unlock(); |
ajayke | 0:d9970d37dd77 | 139 | led3=0; |
ajayke | 0:d9970d37dd77 | 140 | led4=0; |
ajayke | 0:d9970d37dd77 | 141 | |
ajayke | 0:d9970d37dd77 | 142 | |
ajayke | 0:d9970d37dd77 | 143 | |
ajayke | 0:d9970d37dd77 | 144 | } |
ajayke | 0:d9970d37dd77 | 145 | |
ajayke | 0:d9970d37dd77 | 146 | |
ajayke | 0:d9970d37dd77 | 147 | |
ajayke | 0:d9970d37dd77 | 148 | |
ajayke | 0:d9970d37dd77 | 149 | } |
ajayke | 0:d9970d37dd77 | 150 | else //if the system is in manual mode |
ajayke | 0:d9970d37dd77 | 151 | { |
ajayke | 0:d9970d37dd77 | 152 | relay_1=P111; // read status of the lamp |
ajayke | 0:d9970d37dd77 | 153 | bulb.lock(); |
ajayke | 0:d9970d37dd77 | 154 | led2=P112; // read status of the device-2 |
ajayke | 0:d9970d37dd77 | 155 | relay_2=P112; //read status of the fan |
ajayke | 0:d9970d37dd77 | 156 | bulb.unlock(); |
ajayke | 0:d9970d37dd77 | 157 | led3=P113; // read status of the device-3 |
ajayke | 0:d9970d37dd77 | 158 | led4=P114; // read status of the device-4 |
ajayke | 0:d9970d37dd77 | 159 | |
ajayke | 0:d9970d37dd77 | 160 | |
ajayke | 0:d9970d37dd77 | 161 | } |
ajayke | 0:d9970d37dd77 | 162 | |
ajayke | 0:d9970d37dd77 | 163 | } |
ajayke | 0:d9970d37dd77 | 164 | } |
ajayke | 0:d9970d37dd77 | 165 | } |