WSN Coordinator

Dependencies:   mbed

Fork of I2C_HelloWorld_Mbed by mbed official

main.cpp

Committer:
LAvtec818
Date:
2014-06-16
Revision:
1:f9ead8ebc68b
Parent:
0:f76c26307f9a

File content as of revision 1:f9ead8ebc68b:

#include "mbed.h"
#include "PowerControl.h"
#include "EthernetPowerControl.h"
 
// Read temperature from LM75BD
#define USR_POWERDOWN    (0x104)

I2C i2c(p28, p27);
Serial pc(USBTX, USBRX); // tx, rx
InterruptIn PIR_in(p5);
Serial xbee1(p9,p10);
DigitalOut rst1(p11);
AnalogIn light(p20);

Timer cal_temp_time; 
Timer cal_temp_time_c;

Timer PIR_c;
//Ticker flipper;

const int tx_addr = 0x14;
const int rx_addr = 0x15;
char readbuff [35];
char rb [35];
char tx_cmd[1];
int y[18];
 int x[16];
 int occupancy_count = 0;
 char c = 'y';
 int flag = 0;
 int room_temp = 0;
 int cal_temp[16];
  int flag_c = 0;
 int room_temp_c = 0;
 int cal_temp_c[16];
 int temp_occupancy_count_c = 0;
 int PIR_tag = 0;
 int initial_flag = 0;
 int after_cond_high = 0;
  int after_cond_low = 0;
 int temp_occupancy_count_ed = 0;
 int low_duration = 0;
 int high_duration = 0;
 int fluc_counter = 0;
 int human_temp_c = 0;
 int human_temp = 0;

void flip() {
   // pc.printf("kos kesh");
   if (PIR_tag == 1)
    {
        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
            temp_occupancy_count_c = 1;
        else if (PIR_c.read() <= 10)
            temp_occupancy_count_c = temp_occupancy_count_ed; 
            PIR_c.reset();
            PIR_tag = 0;
        }
   
   
    tx_cmd[0] = 0x4C;
        //tx_cmd[1] = 0x4C;
        //i2c.write(tx_addr,
        i2c.write(tx_addr, tx_cmd , 1);
 
        wait(0.25);
 
        //i2c.write(rx_addr, cmd, 1);
        i2c.read(rx_addr, readbuff, 35);
 
        //float tmp = (float((cmd[0]<<8)|cmd[1]) / 256.0);
        for (int count = 0; count < 17; count++)
         y[count] = 256*readbuff[(count*2)+1] + readbuff [(count*2)];
        
         y[17] = readbuff[34];
         
         
                   //calibrating
               
               for (int temp_comp_c = 0; temp_comp_c < 16; temp_comp_c++)
               {    
                    if (( x[temp_comp_c] >= 240) && (x[temp_comp_c] <= 300))
                     room_temp_c = room_temp_c + 1;
                    if (( x[temp_comp_c] >= 300) && (x[temp_comp_c] <= 400))
                     human_temp_c = human_temp_c + 1;}
             if (flag_c == 0) {           
                if (room_temp_c >= 12){
                   for (int cal_c = 0; cal_c < 16; cal_c++)
                        cal_temp_c[cal_c] = x[cal_c];
                                                }
                        flag_c = 1;
                        cal_temp_time_c.start();
                        }
               
               if (cal_temp_time_c.read_ms() == 900000){
                    flag_c = 0;
                    cal_temp_time_c.reset();}
                    
 
              if (after_cond_high == 1){
         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
           { temp_occupancy_count_c = temp_occupancy_count_c;}
             high_duration = PIR_c.read();  //how long did the PIR signal stay high (busy)
             PIR_c.reset();                 //reset timer
           if ((high_duration > low_duration) && (room_temp_c + room_temp <= 10) && (fluc_counter == 5))
             temp_occupancy_count_c++; 
          after_cond_low = 1; 
          after_cond_high = 0;     
       }     
       
    if (after_cond_low == 1){
        if ((PIR_c.read() >= 120) && (room_temp_c + room_temp >= 24) && (fluc_counter == 5))
            temp_occupancy_count_c--;
        else if ((PIR_c.read() >= 600) && (room_temp_c+room_temp >= 24) && (fluc_counter == 5)) 
            temp_occupancy_count_c = 1;
           low_duration = PIR_c.read();   //how long did the PIR signal stay low 
           PIR_c.reset();               //reset timer
           if (low_duration > high_duration)        //comparing low and high duration
            temp_occupancy_count_c--;
            after_cond_low = 0;
            after_cond_high = 1;
        }   
        
   if (initial_flag == 0){
        if (PIR_in == 1){           //first raising edge of Coord PIR Sensor (someone has entered the room)
            PIR_c.start();          // start timer for PIR sensor processing
           // temp_occupancy_count_c = temp_occupancy_count_c + 1
           initial_flag = 1 ;
           after_cond_high = 1;}        //initial condition met, neg to pos edge 
           // initial_flag = 1;
        else {
            PIR_c.start();
            PIR_tag = 1;        
             }   
        }      
          
         room_temp_c = 0;
         room_temp = 0;
         human_temp_c = 0;
         human_temp = 0;
        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],
        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]);
        pc.printf("Occupany Count: %d\n\r", temp_occupancy_count_c);
        if (temp_occupancy_count_c <= 3)
        pc.printf("Low Occupancy\n\r");
        if ((temp_occupancy_count_c <= 6) && (temp_occupancy_count_c > 3))
        pc.printf("Mid Occupancy\n\r");
        if (temp_occupancy_count_c > 6)
        pc.printf("High Occupancy\n\r");
}

int main() {

   
    i2c.frequency(50000);
     xbee1.baud(115200);
     
     PHY_PowerDown();
    
    PIR_in.rise(&flip); 
    PIR_in.fall(&flip);

    rst1 = 0; //Set reset pin to 0
    wait_ms(1);//Wait at least one millisecond
    rst1 = 1;//Set reset pin to 1
    wait_ms(1);
    
   // pc.printf("not this");
   wait_ms(75000);  //wait one minute for initial start up 
   
    while (1) {
            
            
           // xbee1.putc(c);
            if (xbee1.readable()){
               // pc.printf("receiving\n\r");
               // pc.putc(xbee1.getc()); 
             
               if (fluc_counter < 6)   
                  fluc_counter++;
                  
               for (int j = 2; j < 34; j++)   
               rb[j] = xbee1.getc();
               
               for (int z = 0; z < 16; z++)
               x[z] = 256*rb[(2*z)+3]+rb[(2*z)+2];
               
                            //calibrating
               
               for (int temp_comp = 0; temp_comp < 16; temp_comp++)
               {    
                    if (( x[temp_comp] >= 240) && (x[temp_comp] <= 300))
                     room_temp = room_temp + 1;
                    if (( x[temp_comp] >= 300) && (x[temp_comp] <= 400))
                     human_temp = human_temp + 1;}
               if (flag == 0) {       
                if (room_temp >= 12){                         //good place to set the initial flag to begin duration timing
                   for (int cal = 0; cal < 16; cal++)
                        cal_temp[cal] = x[cal];
                                                }
                        flag = 1;
                        cal_temp_time.start();
                        }
               
               if (cal_temp_time.read_ms() == 900000){
                    flag = 0;
                    cal_temp_time.reset();}
               
              // pc.printf("x = %d\n\r", x);
              
              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],
              x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]);
              pc.printf("Occupany Count: %d\n\r", temp_occupancy_count_c);}
              
              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
                  tx_cmd[0] = 0x4C;
                 i2c.write(tx_addr, tx_cmd , 1);

                wait(0.25);
 
                i2c.read(rx_addr, readbuff, 35);
 
                for (int count = 0; count < 17; count++)
                y[count] = 256*readbuff[(count*2)+1] + readbuff [(count*2)];
        
                  y[17] = readbuff[34];
                  
                   for (int temp_comp_c = 0; temp_comp_c < 16; temp_comp_c++)
               {    
                    if (( x[temp_comp_c] >= 240) && (x[temp_comp_c] <= 300))
                     room_temp_c = room_temp_c + 1;
                    if (( x[temp_comp_c] >= 300) && (x[temp_comp_c] <= 400))
                     human_temp_c = human_temp_c + 1;}
                
                }
                
                if (room_temp_c >= 12)
                 temp_occupancy_count_c = 0;
                if (human_temp_c >= 6)
                  temp_occupancy_count_c = 1;
                if (human_temp_c >= 8)
                  temp_occupancy_count_c = 2;
                   
              
              if (light < 0.5){  //and thermal temp readings are low, need to think about this a little more
               occupancy_count = 0;
               }
                                    
      //   sleep();
        // pc.printf("system on idle\n\r");
        //pc.printf("x1 = %d\n",x1);
    }
}