Esempio n. 1
0
/****************************************************************************
 *
 * NAME: vProcessRead
 *
 * DESCRIPTION:
 * Gets the current readings from each sensor. If the light level causes the
 * low light alarm to be triggered, an LED is illuminated.
 *
 * RETURNS:
 * void
 *
 * NOTES:
 * This is not an efficient way to read the sensors as much time is wasted
 * waiting for the humidity and temperature sensor to complete. The sensor
 * pulls a DIO line low when it is ready, and this could be used to generate
 * an interrupt to indicate when data is ready to be read.
 *
 ****************************************************************************/
PRIVATE void vProcessRead(void)
{
    uint16 u16LightSensor;
    uint16 u16Diff;


    /* Read light level, adjust to range 0-6. This sensor automatically starts
       a new conversion afterwards so there is no need for a 'start read' */
    u16LightSensor = u16ALSreadChannelResult();
    /* Adjust the high and low values if necessary, and obtain the
       difference between them */

    if (sDemoData.sLightSensor.u16Hi < u16LightSensor)
    {
        sDemoData.sLightSensor.u16Hi = u16LightSensor;
    }

    if (sDemoData.sLightSensor.u16Lo > u16LightSensor)
    {
        sDemoData.sLightSensor.u16Lo = u16LightSensor;
    }

    u16Diff = sDemoData.sLightSensor.u16Hi - sDemoData.sLightSensor.u16Lo;

    /* Work out the current value as a value between 0 and 6 within the
       range of values that have been seen previously */
    if (u16Diff)
    {
        sDemoData.sSensors.u8AlsResult = (uint8)(((uint32)(u16LightSensor - sDemoData.sLightSensor.u16Lo) * 6) / (uint32)u16Diff);
    }
    else
    {
        sDemoData.sSensors.u8AlsResult = 3;
    }

    /* Set LED 1 based on light level */
    if ((sDemoData.sSensors.u8AlsResult <= sDemoData.sControls.u8LightAlarmLevel)
        && (sDemoData.sControls.u8LightAlarmLevel < 7))
    {
        vLedControl(LED2, TRUE);
    }
    else
    {
        vLedControl(LED2, FALSE);
    }

    /* Read temperature, 0-52 are acceptable. Polls until result received */
    vHTSstartReadTemp();
    sDemoData.sSensors.u8TempResult = u8FindMin((uint8)u16HTSreadTempResult(), 52);


    /* Read humidity, 0-104 are acceptable. Polls until result received */
    vHTSstartReadHumidity();
    sDemoData.sSensors.u8HtsResult = u8FindMin((uint8)u16HTSreadHumidityResult(), 104);
}
/****************************************************************************
 *
 * NAME: vReadTempHumidity
 *
 * DESCRIPTION:
 *
 * Read temperature/humidity sensor. Reading is performed using a state machine
 * to ensure that it never blocks.
 *
 ****************************************************************************/
PRIVATE void vReadTempHumidity(void)
{
    switch(sTempHumiditySensor.eState)
	{
		case E_STATE_READ_TEMP_HUMID_IDLE:
		    vHTSstartReadHumidity();
			sTempHumiditySensor.eState = E_STATE_READ_HUMID_RUNNING;
		break;

		case E_STATE_READ_HUMID_RUNNING:
			if ((u32AHI_DioReadInput() & HTS_DATA_DIO_BIT_MASK) == 0)
			{
				sTempHumiditySensor.eState = E_STATE_READ_TEMP_HUMID_COMPLETE;
			}
			break;

		case E_STATE_READ_TEMP_HUMID_COMPLETE:
			sTempHumiditySensor.u16HumidReading = u16HTSreadHumidityResult();
			sTempHumiditySensor.eState = E_STATE_READ_TEMP_START;
			break;

		case E_STATE_READ_TEMP_START:
		    vHTSstartReadTemp();
			sTempHumiditySensor.eState = E_STATE_READ_TEMP_HUMID_RUNNING;
			break;

		case E_STATE_READ_TEMP_HUMID_RUNNING:
			if ((u32AHI_DioReadInput() & HTS_DATA_DIO_BIT_MASK) == 0)
			{
				sTempHumiditySensor.eState = E_STATE_READ_TEMP_COMPLETE;
			}
			break;

		case E_STATE_READ_TEMP_COMPLETE:
			sTempHumiditySensor.u16TempReading = u16HTSreadTempResult();
			sTempHumiditySensor.eState = E_STATE_READ_TEMP_HUMID_READY;
			break;

		case E_STATE_READ_TEMP_HUMID_READY:
			break;

		default:
			break;
	}
}
Esempio n. 3
0
/* Process to get ht sensor value.
   ht sensor is sampled. Sampling stopped when sensor is de-activated.
   Event is generated if temp and/or hum value changed at least the value DELTA_TEMP_SENSOR_VALUE
   or DELTA_HUM_SENSOR_VALUE since last event. */
PROCESS_THREAD(HTSensorSampling, ev, data)
{
  PROCESS_BEGIN();
  static struct etimer et;

  etimer_set(&et, CLOCK_SECOND);
  while(1) {
    PROCESS_WAIT_EVENT_UNTIL((ev == PROCESS_EVENT_TIMER) || (ev == PROCESS_EVENT_MSG));
    if(ev == PROCESS_EVENT_TIMER) {
      /* Handle sensor reading. */
      vHTSstartReadTemp();
      temp_sensor_value = u16HTSreadTempResult();
      PRINTF("Temperature sample: %d\n", temp_sensor_value);
      vHTSstartReadHumidity();
      hum_sensor_value = u16HTSreadHumidityResult();
      PRINTF("Humidity sample: %d\n", hum_sensor_value);
      if((abs(temp_sensor_value - prev_temp_event_val) > DELTA_TEMP_SENSOR_VALUE) ||
         (abs(hum_sensor_value - prev_hum_event_val) > DELTA_HUM_SENSOR_VALUE)) {
        prev_temp_event_val = temp_sensor_value;
        prev_hum_event_val = hum_sensor_value;
        sensors_changed(&ht_sensor);
      }
      etimer_reset(&et);
    } else {
      /* ev == PROCESS_EVENT_MSG */
      if(*(int *)data == HT_SENSOR_STATUS_NOT_ACTIVE) {
        /* Stop sampling */
        etimer_stop(&et);
      } else if((*(int *)data == HT_SENSOR_STATUS_ACTIVE)) {
        /* restart sampling */
        etimer_restart(&et);
      }
    }
  }
  PROCESS_END();
}