Sensor acquisition

From Contiki
Revision as of 10:04, 7 August 2014 by Nitin (Talk | contribs) (Introduction)

Jump to: navigation, search

Back to Contiki Tutorials

Introduction

This article helps you learn how to create the Sensor Acquisition Program, which can be used to show the Temperature, Humidity and Light Intensity in the vicinity of Tmote Sky.

Sensor Acquisition Program on the Tmote Sky!

Step 1

Using the opened terminal window compile and upload the Sensor Acquisition program on the Tmote Sky.

make TARGET=sky savetarget (This save the target for any future compilations)
make sensor-acq.upload (This will upload the code on the Tmote Sky)
make login (This will enable us to view the output. If permission error occurs, use sudo command at the beginning)

Step 2

Press the reset button on the Tmote Sky. The following message will appear on the terminal window

Temperature=28.04 C (6764)
Humidity=73.20% (2259)
Light=38.26 lux (94)

Values inside the round brackets (ex 6764, 2259 and 94) are the actual sensor values and the calibrated values can be obtained by performing calculations on these sensor values. You can find the calculations at http://tinyos.stanford.edu/tinyos-wiki/index.php/Boomerang_ADC_Example

Step 3

Press Ctrl-C to quit.


Code



PROCESS(sensor_acq_process,"Sensor Acquisition");
AUTOSTART_PROCESSES(&sensor_acq_process);

PROCESS_THREAD(sensor_acq_process,ev,data)
{ 
      static struct etimer et;
      static int val;
      static struct sensors_sensor *sensor;
      static float s = 0;
      static int dec;
      static float frac;

      PROCESS_BEGIN();

      printf("Starting Sensor Example.\n");
      
      while(1)
      {
	   etimer_set(&et, CLOCK_SECOND * 2);
	   SENSORS_ACTIVATE(light_sensor);
      	   SENSORS_ACTIVATE(sht11_sensor);
        
	   PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));


           val = sht11_sensor.value(SHT11_SENSOR_TEMP);
      	   if(val != -1) 
      	   {
		s= ((0.01*val) - 39.60);
      	  	dec = s;
      	  	frac = s - dec;
      	  	printf("\nTemperature=%d.%02u C (%d)\n", dec, (unsigned int)(frac * 100),val);               
           }

	   val=sht11_sensor.value(SHT11_SENSOR_HUMIDITY);
	   if(val != -1) 
      	   {
		s= (((0.0405*val) - 4) + ((-2.8 * 0.000001)*(pow(val,2))));  
      	  	dec = s;
      	  	frac = s - dec;
      	  	printf("Humidity=%d.%02u % (%d)\n", dec, (unsigned int)(frac * 100),val);               
           }

           val = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR);
      	   if(val != -1) 
      	   {
      		s = (float)(val * 0.4071);
      	  	dec = s;
      	  	frac = s - dec;
      	  	printf("Light=%d.%02u lux (%d)\n", dec, (unsigned int)(frac * 100),val);               
           } 
	
	   etimer_reset(&et);
    	   SENSORS_DEACTIVATE(light_sensor);
    	   SENSORS_DEACTIVATE(sht11_sensor);

      } //end of while
    
      PROCESS_END();

}

 

Understanding the Code

etimer_set(&et, CLOCK_SECOND * 2);

This will set the timer to repeat the iterations every 2 seconds.


SENSORS_ACTIVATE(light_sensor);
SENSORS_ACTIVATE(sht11_sensor);

We need to activate light_sensor for measuring the light intensity and sht11_sensor for the measurement of temperature and humidity.


val = sht11_sensor.value(SHT11_SENSOR_TEMP);

Here we are capturing the actual sensor value.


s = ((0.01*val) - 39.60);

We need to calibrate the sensor values by doing some calculations. You can find the calculations here: http://tinyos.stanford.edu/tinyos-wiki/index.php/Boomerang_ADC_Example


SENSORS_DEACTIVATE(light_sensor);
SENSORS_DEACTIVATE(sht11_sensor);

After we are done with the calculations, we need to deactivate the sensors.


Back to Contiki Tutorials


Edited by : Nitin