/**************************************************************************** * * 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; } }
/* 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(); }