WSN Coordinator

Dependencies:   mbed

Fork of I2C_HelloWorld_Mbed by mbed official

Committer:
LAvtec818
Date:
Mon Jun 16 18:17:19 2014 +0000
Revision:
1:f9ead8ebc68b
Parent:
0:f76c26307f9a
Coordinator

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:f76c26307f9a 1 #include "mbed.h"
LAvtec818 1:f9ead8ebc68b 2 #include "PowerControl.h"
LAvtec818 1:f9ead8ebc68b 3 #include "EthernetPowerControl.h"
mbed_official 0:f76c26307f9a 4
mbed_official 0:f76c26307f9a 5 // Read temperature from LM75BD
LAvtec818 1:f9ead8ebc68b 6 #define USR_POWERDOWN (0x104)
mbed_official 0:f76c26307f9a 7
mbed_official 0:f76c26307f9a 8 I2C i2c(p28, p27);
LAvtec818 1:f9ead8ebc68b 9 Serial pc(USBTX, USBRX); // tx, rx
LAvtec818 1:f9ead8ebc68b 10 InterruptIn PIR_in(p5);
LAvtec818 1:f9ead8ebc68b 11 Serial xbee1(p9,p10);
LAvtec818 1:f9ead8ebc68b 12 DigitalOut rst1(p11);
LAvtec818 1:f9ead8ebc68b 13 AnalogIn light(p20);
mbed_official 0:f76c26307f9a 14
LAvtec818 1:f9ead8ebc68b 15 Timer cal_temp_time;
LAvtec818 1:f9ead8ebc68b 16 Timer cal_temp_time_c;
LAvtec818 1:f9ead8ebc68b 17
LAvtec818 1:f9ead8ebc68b 18 Timer PIR_c;
LAvtec818 1:f9ead8ebc68b 19 //Ticker flipper;
LAvtec818 1:f9ead8ebc68b 20
LAvtec818 1:f9ead8ebc68b 21 const int tx_addr = 0x14;
LAvtec818 1:f9ead8ebc68b 22 const int rx_addr = 0x15;
LAvtec818 1:f9ead8ebc68b 23 char readbuff [35];
LAvtec818 1:f9ead8ebc68b 24 char rb [35];
LAvtec818 1:f9ead8ebc68b 25 char tx_cmd[1];
LAvtec818 1:f9ead8ebc68b 26 int y[18];
LAvtec818 1:f9ead8ebc68b 27 int x[16];
LAvtec818 1:f9ead8ebc68b 28 int occupancy_count = 0;
LAvtec818 1:f9ead8ebc68b 29 char c = 'y';
LAvtec818 1:f9ead8ebc68b 30 int flag = 0;
LAvtec818 1:f9ead8ebc68b 31 int room_temp = 0;
LAvtec818 1:f9ead8ebc68b 32 int cal_temp[16];
LAvtec818 1:f9ead8ebc68b 33 int flag_c = 0;
LAvtec818 1:f9ead8ebc68b 34 int room_temp_c = 0;
LAvtec818 1:f9ead8ebc68b 35 int cal_temp_c[16];
LAvtec818 1:f9ead8ebc68b 36 int temp_occupancy_count_c = 0;
LAvtec818 1:f9ead8ebc68b 37 int PIR_tag = 0;
LAvtec818 1:f9ead8ebc68b 38 int initial_flag = 0;
LAvtec818 1:f9ead8ebc68b 39 int after_cond_high = 0;
LAvtec818 1:f9ead8ebc68b 40 int after_cond_low = 0;
LAvtec818 1:f9ead8ebc68b 41 int temp_occupancy_count_ed = 0;
LAvtec818 1:f9ead8ebc68b 42 int low_duration = 0;
LAvtec818 1:f9ead8ebc68b 43 int high_duration = 0;
LAvtec818 1:f9ead8ebc68b 44 int fluc_counter = 0;
LAvtec818 1:f9ead8ebc68b 45 int human_temp_c = 0;
LAvtec818 1:f9ead8ebc68b 46 int human_temp = 0;
LAvtec818 1:f9ead8ebc68b 47
LAvtec818 1:f9ead8ebc68b 48 void flip() {
LAvtec818 1:f9ead8ebc68b 49 // pc.printf("kos kesh");
LAvtec818 1:f9ead8ebc68b 50 if (PIR_tag == 1)
LAvtec818 1:f9ead8ebc68b 51 {
LAvtec818 1:f9ead8ebc68b 52 if (PIR_c.read() >= 30) //check to see if the PIR sensor has been low for 30 seconds or more, if so, then most likely someone new just entered
LAvtec818 1:f9ead8ebc68b 53 temp_occupancy_count_c = 1;
LAvtec818 1:f9ead8ebc68b 54 else if (PIR_c.read() <= 10)
LAvtec818 1:f9ead8ebc68b 55 temp_occupancy_count_c = temp_occupancy_count_ed;
LAvtec818 1:f9ead8ebc68b 56 PIR_c.reset();
LAvtec818 1:f9ead8ebc68b 57 PIR_tag = 0;
LAvtec818 1:f9ead8ebc68b 58 }
LAvtec818 1:f9ead8ebc68b 59
LAvtec818 1:f9ead8ebc68b 60
LAvtec818 1:f9ead8ebc68b 61 tx_cmd[0] = 0x4C;
LAvtec818 1:f9ead8ebc68b 62 //tx_cmd[1] = 0x4C;
LAvtec818 1:f9ead8ebc68b 63 //i2c.write(tx_addr,
LAvtec818 1:f9ead8ebc68b 64 i2c.write(tx_addr, tx_cmd , 1);
LAvtec818 1:f9ead8ebc68b 65
LAvtec818 1:f9ead8ebc68b 66 wait(0.25);
LAvtec818 1:f9ead8ebc68b 67
LAvtec818 1:f9ead8ebc68b 68 //i2c.write(rx_addr, cmd, 1);
LAvtec818 1:f9ead8ebc68b 69 i2c.read(rx_addr, readbuff, 35);
LAvtec818 1:f9ead8ebc68b 70
LAvtec818 1:f9ead8ebc68b 71 //float tmp = (float((cmd[0]<<8)|cmd[1]) / 256.0);
LAvtec818 1:f9ead8ebc68b 72 for (int count = 0; count < 17; count++)
LAvtec818 1:f9ead8ebc68b 73 y[count] = 256*readbuff[(count*2)+1] + readbuff [(count*2)];
LAvtec818 1:f9ead8ebc68b 74
LAvtec818 1:f9ead8ebc68b 75 y[17] = readbuff[34];
LAvtec818 1:f9ead8ebc68b 76
LAvtec818 1:f9ead8ebc68b 77
LAvtec818 1:f9ead8ebc68b 78 //calibrating
LAvtec818 1:f9ead8ebc68b 79
LAvtec818 1:f9ead8ebc68b 80 for (int temp_comp_c = 0; temp_comp_c < 16; temp_comp_c++)
LAvtec818 1:f9ead8ebc68b 81 {
LAvtec818 1:f9ead8ebc68b 82 if (( x[temp_comp_c] >= 240) && (x[temp_comp_c] <= 300))
LAvtec818 1:f9ead8ebc68b 83 room_temp_c = room_temp_c + 1;
LAvtec818 1:f9ead8ebc68b 84 if (( x[temp_comp_c] >= 300) && (x[temp_comp_c] <= 400))
LAvtec818 1:f9ead8ebc68b 85 human_temp_c = human_temp_c + 1;}
LAvtec818 1:f9ead8ebc68b 86 if (flag_c == 0) {
LAvtec818 1:f9ead8ebc68b 87 if (room_temp_c >= 12){
LAvtec818 1:f9ead8ebc68b 88 for (int cal_c = 0; cal_c < 16; cal_c++)
LAvtec818 1:f9ead8ebc68b 89 cal_temp_c[cal_c] = x[cal_c];
LAvtec818 1:f9ead8ebc68b 90 }
LAvtec818 1:f9ead8ebc68b 91 flag_c = 1;
LAvtec818 1:f9ead8ebc68b 92 cal_temp_time_c.start();
LAvtec818 1:f9ead8ebc68b 93 }
LAvtec818 1:f9ead8ebc68b 94
LAvtec818 1:f9ead8ebc68b 95 if (cal_temp_time_c.read_ms() == 900000){
LAvtec818 1:f9ead8ebc68b 96 flag_c = 0;
LAvtec818 1:f9ead8ebc68b 97 cal_temp_time_c.reset();}
LAvtec818 1:f9ead8ebc68b 98
LAvtec818 1:f9ead8ebc68b 99
LAvtec818 1:f9ead8ebc68b 100 if (after_cond_high == 1){
LAvtec818 1:f9ead8ebc68b 101 if ((PIR_c.read() <= 10) && (room_temp_c + room_temp <= 28) && (fluc_counter == 5)) //check to see if the PIR sensor has been high for 10 or less seconds if so, someone just passed by and probably left
LAvtec818 1:f9ead8ebc68b 102 { temp_occupancy_count_c = temp_occupancy_count_c;}
LAvtec818 1:f9ead8ebc68b 103 high_duration = PIR_c.read(); //how long did the PIR signal stay high (busy)
LAvtec818 1:f9ead8ebc68b 104 PIR_c.reset(); //reset timer
LAvtec818 1:f9ead8ebc68b 105 if ((high_duration > low_duration) && (room_temp_c + room_temp <= 10) && (fluc_counter == 5))
LAvtec818 1:f9ead8ebc68b 106 temp_occupancy_count_c++;
LAvtec818 1:f9ead8ebc68b 107 after_cond_low = 1;
LAvtec818 1:f9ead8ebc68b 108 after_cond_high = 0;
LAvtec818 1:f9ead8ebc68b 109 }
LAvtec818 1:f9ead8ebc68b 110
LAvtec818 1:f9ead8ebc68b 111 if (after_cond_low == 1){
LAvtec818 1:f9ead8ebc68b 112 if ((PIR_c.read() >= 120) && (room_temp_c + room_temp >= 24) && (fluc_counter == 5))
LAvtec818 1:f9ead8ebc68b 113 temp_occupancy_count_c--;
LAvtec818 1:f9ead8ebc68b 114 else if ((PIR_c.read() >= 600) && (room_temp_c+room_temp >= 24) && (fluc_counter == 5))
LAvtec818 1:f9ead8ebc68b 115 temp_occupancy_count_c = 1;
LAvtec818 1:f9ead8ebc68b 116 low_duration = PIR_c.read(); //how long did the PIR signal stay low
LAvtec818 1:f9ead8ebc68b 117 PIR_c.reset(); //reset timer
LAvtec818 1:f9ead8ebc68b 118 if (low_duration > high_duration) //comparing low and high duration
LAvtec818 1:f9ead8ebc68b 119 temp_occupancy_count_c--;
LAvtec818 1:f9ead8ebc68b 120 after_cond_low = 0;
LAvtec818 1:f9ead8ebc68b 121 after_cond_high = 1;
LAvtec818 1:f9ead8ebc68b 122 }
LAvtec818 1:f9ead8ebc68b 123
LAvtec818 1:f9ead8ebc68b 124 if (initial_flag == 0){
LAvtec818 1:f9ead8ebc68b 125 if (PIR_in == 1){ //first raising edge of Coord PIR Sensor (someone has entered the room)
LAvtec818 1:f9ead8ebc68b 126 PIR_c.start(); // start timer for PIR sensor processing
LAvtec818 1:f9ead8ebc68b 127 // temp_occupancy_count_c = temp_occupancy_count_c + 1
LAvtec818 1:f9ead8ebc68b 128 initial_flag = 1 ;
LAvtec818 1:f9ead8ebc68b 129 after_cond_high = 1;} //initial condition met, neg to pos edge
LAvtec818 1:f9ead8ebc68b 130 // initial_flag = 1;
LAvtec818 1:f9ead8ebc68b 131 else {
LAvtec818 1:f9ead8ebc68b 132 PIR_c.start();
LAvtec818 1:f9ead8ebc68b 133 PIR_tag = 1;
LAvtec818 1:f9ead8ebc68b 134 }
LAvtec818 1:f9ead8ebc68b 135 }
LAvtec818 1:f9ead8ebc68b 136
LAvtec818 1:f9ead8ebc68b 137 room_temp_c = 0;
LAvtec818 1:f9ead8ebc68b 138 room_temp = 0;
LAvtec818 1:f9ead8ebc68b 139 human_temp_c = 0;
LAvtec818 1:f9ead8ebc68b 140 human_temp = 0;
LAvtec818 1:f9ead8ebc68b 141 pc.printf("Coordinator:\n\r%d\t%d\t%d\t%d\n\r%d\t%d\t%d\t%d\n\r%d\t%d\t%d\t%d\n\r%d\t%d\t%d\t%d\n\r\n\r",y[1],y[2],y[3],
LAvtec818 1:f9ead8ebc68b 142 y[4],y[5],y[6],y[7],y[8],y[9],y[10],y[11],y[12],y[13],y[14],y[15],y[16]);
LAvtec818 1:f9ead8ebc68b 143 pc.printf("Occupany Count: %d\n\r", temp_occupancy_count_c);
LAvtec818 1:f9ead8ebc68b 144 if (temp_occupancy_count_c <= 3)
LAvtec818 1:f9ead8ebc68b 145 pc.printf("Low Occupancy\n\r");
LAvtec818 1:f9ead8ebc68b 146 if ((temp_occupancy_count_c <= 6) && (temp_occupancy_count_c > 3))
LAvtec818 1:f9ead8ebc68b 147 pc.printf("Mid Occupancy\n\r");
LAvtec818 1:f9ead8ebc68b 148 if (temp_occupancy_count_c > 6)
LAvtec818 1:f9ead8ebc68b 149 pc.printf("High Occupancy\n\r");
LAvtec818 1:f9ead8ebc68b 150 }
mbed_official 0:f76c26307f9a 151
mbed_official 0:f76c26307f9a 152 int main() {
LAvtec818 1:f9ead8ebc68b 153
LAvtec818 1:f9ead8ebc68b 154
LAvtec818 1:f9ead8ebc68b 155 i2c.frequency(50000);
LAvtec818 1:f9ead8ebc68b 156 xbee1.baud(115200);
LAvtec818 1:f9ead8ebc68b 157
LAvtec818 1:f9ead8ebc68b 158 PHY_PowerDown();
LAvtec818 1:f9ead8ebc68b 159
LAvtec818 1:f9ead8ebc68b 160 PIR_in.rise(&flip);
LAvtec818 1:f9ead8ebc68b 161 PIR_in.fall(&flip);
LAvtec818 1:f9ead8ebc68b 162
LAvtec818 1:f9ead8ebc68b 163 rst1 = 0; //Set reset pin to 0
LAvtec818 1:f9ead8ebc68b 164 wait_ms(1);//Wait at least one millisecond
LAvtec818 1:f9ead8ebc68b 165 rst1 = 1;//Set reset pin to 1
LAvtec818 1:f9ead8ebc68b 166 wait_ms(1);
LAvtec818 1:f9ead8ebc68b 167
LAvtec818 1:f9ead8ebc68b 168 // pc.printf("not this");
LAvtec818 1:f9ead8ebc68b 169 wait_ms(75000); //wait one minute for initial start up
LAvtec818 1:f9ead8ebc68b 170
mbed_official 0:f76c26307f9a 171 while (1) {
LAvtec818 1:f9ead8ebc68b 172
LAvtec818 1:f9ead8ebc68b 173
LAvtec818 1:f9ead8ebc68b 174 // xbee1.putc(c);
LAvtec818 1:f9ead8ebc68b 175 if (xbee1.readable()){
LAvtec818 1:f9ead8ebc68b 176 // pc.printf("receiving\n\r");
LAvtec818 1:f9ead8ebc68b 177 // pc.putc(xbee1.getc());
LAvtec818 1:f9ead8ebc68b 178
LAvtec818 1:f9ead8ebc68b 179 if (fluc_counter < 6)
LAvtec818 1:f9ead8ebc68b 180 fluc_counter++;
LAvtec818 1:f9ead8ebc68b 181
LAvtec818 1:f9ead8ebc68b 182 for (int j = 2; j < 34; j++)
LAvtec818 1:f9ead8ebc68b 183 rb[j] = xbee1.getc();
LAvtec818 1:f9ead8ebc68b 184
LAvtec818 1:f9ead8ebc68b 185 for (int z = 0; z < 16; z++)
LAvtec818 1:f9ead8ebc68b 186 x[z] = 256*rb[(2*z)+3]+rb[(2*z)+2];
LAvtec818 1:f9ead8ebc68b 187
LAvtec818 1:f9ead8ebc68b 188 //calibrating
LAvtec818 1:f9ead8ebc68b 189
LAvtec818 1:f9ead8ebc68b 190 for (int temp_comp = 0; temp_comp < 16; temp_comp++)
LAvtec818 1:f9ead8ebc68b 191 {
LAvtec818 1:f9ead8ebc68b 192 if (( x[temp_comp] >= 240) && (x[temp_comp] <= 300))
LAvtec818 1:f9ead8ebc68b 193 room_temp = room_temp + 1;
LAvtec818 1:f9ead8ebc68b 194 if (( x[temp_comp] >= 300) && (x[temp_comp] <= 400))
LAvtec818 1:f9ead8ebc68b 195 human_temp = human_temp + 1;}
LAvtec818 1:f9ead8ebc68b 196 if (flag == 0) {
LAvtec818 1:f9ead8ebc68b 197 if (room_temp >= 12){ //good place to set the initial flag to begin duration timing
LAvtec818 1:f9ead8ebc68b 198 for (int cal = 0; cal < 16; cal++)
LAvtec818 1:f9ead8ebc68b 199 cal_temp[cal] = x[cal];
LAvtec818 1:f9ead8ebc68b 200 }
LAvtec818 1:f9ead8ebc68b 201 flag = 1;
LAvtec818 1:f9ead8ebc68b 202 cal_temp_time.start();
LAvtec818 1:f9ead8ebc68b 203 }
LAvtec818 1:f9ead8ebc68b 204
LAvtec818 1:f9ead8ebc68b 205 if (cal_temp_time.read_ms() == 900000){
LAvtec818 1:f9ead8ebc68b 206 flag = 0;
LAvtec818 1:f9ead8ebc68b 207 cal_temp_time.reset();}
LAvtec818 1:f9ead8ebc68b 208
LAvtec818 1:f9ead8ebc68b 209 // pc.printf("x = %d\n\r", x);
LAvtec818 1:f9ead8ebc68b 210
LAvtec818 1:f9ead8ebc68b 211 pc.printf("End Device\n\r%d\t%d\t%d\t%d\n\r%d\t%d\t%d\t%d\n\r%d\t%d\t%d\t%d\n\r%d\t%d\t%d\t%d\n\r\n\r",x[0],x[1],x[2],x[3],
LAvtec818 1:f9ead8ebc68b 212 x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]);
LAvtec818 1:f9ead8ebc68b 213 pc.printf("Occupany Count: %d\n\r", temp_occupancy_count_c);}
LAvtec818 1:f9ead8ebc68b 214
LAvtec818 1:f9ead8ebc68b 215 if ((PIR_c.read() >= 600) && (PIR_in == 0)) { //if the signal has been low for 5 or more minutes, and the PIR_in is low, check the temp, if room, occupancy zero
LAvtec818 1:f9ead8ebc68b 216 tx_cmd[0] = 0x4C;
LAvtec818 1:f9ead8ebc68b 217 i2c.write(tx_addr, tx_cmd , 1);
LAvtec818 1:f9ead8ebc68b 218
LAvtec818 1:f9ead8ebc68b 219 wait(0.25);
mbed_official 0:f76c26307f9a 220
LAvtec818 1:f9ead8ebc68b 221 i2c.read(rx_addr, readbuff, 35);
mbed_official 0:f76c26307f9a 222
LAvtec818 1:f9ead8ebc68b 223 for (int count = 0; count < 17; count++)
LAvtec818 1:f9ead8ebc68b 224 y[count] = 256*readbuff[(count*2)+1] + readbuff [(count*2)];
LAvtec818 1:f9ead8ebc68b 225
LAvtec818 1:f9ead8ebc68b 226 y[17] = readbuff[34];
LAvtec818 1:f9ead8ebc68b 227
LAvtec818 1:f9ead8ebc68b 228 for (int temp_comp_c = 0; temp_comp_c < 16; temp_comp_c++)
LAvtec818 1:f9ead8ebc68b 229 {
LAvtec818 1:f9ead8ebc68b 230 if (( x[temp_comp_c] >= 240) && (x[temp_comp_c] <= 300))
LAvtec818 1:f9ead8ebc68b 231 room_temp_c = room_temp_c + 1;
LAvtec818 1:f9ead8ebc68b 232 if (( x[temp_comp_c] >= 300) && (x[temp_comp_c] <= 400))
LAvtec818 1:f9ead8ebc68b 233 human_temp_c = human_temp_c + 1;}
LAvtec818 1:f9ead8ebc68b 234
LAvtec818 1:f9ead8ebc68b 235 }
LAvtec818 1:f9ead8ebc68b 236
LAvtec818 1:f9ead8ebc68b 237 if (room_temp_c >= 12)
LAvtec818 1:f9ead8ebc68b 238 temp_occupancy_count_c = 0;
LAvtec818 1:f9ead8ebc68b 239 if (human_temp_c >= 6)
LAvtec818 1:f9ead8ebc68b 240 temp_occupancy_count_c = 1;
LAvtec818 1:f9ead8ebc68b 241 if (human_temp_c >= 8)
LAvtec818 1:f9ead8ebc68b 242 temp_occupancy_count_c = 2;
LAvtec818 1:f9ead8ebc68b 243
LAvtec818 1:f9ead8ebc68b 244
LAvtec818 1:f9ead8ebc68b 245 if (light < 0.5){ //and thermal temp readings are low, need to think about this a little more
LAvtec818 1:f9ead8ebc68b 246 occupancy_count = 0;
LAvtec818 1:f9ead8ebc68b 247 }
LAvtec818 1:f9ead8ebc68b 248
LAvtec818 1:f9ead8ebc68b 249 // sleep();
LAvtec818 1:f9ead8ebc68b 250 // pc.printf("system on idle\n\r");
LAvtec818 1:f9ead8ebc68b 251 //pc.printf("x1 = %d\n",x1);
mbed_official 0:f76c26307f9a 252 }
mbed_official 0:f76c26307f9a 253 }