A simple WIP that logs data from a Grove sensor, and can send and receive information over USB and SMS.
Dependencies: DHT DS_1337 SDFileSystem USBDevice mbed
Handlers/GroveDht22.cpp@0:2df78a4443cd, 2016-04-10 (annotated)
- Committer:
- Joseph Radford
- Date:
- Sun Apr 10 15:47:33 2016 +1000
- Revision:
- 0:2df78a4443cd
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Joseph Radford |
0:2df78a4443cd | 1 | #include "GroveDht22.h" |
Joseph Radford |
0:2df78a4443cd | 2 | #include "measurementhandler.h" |
Joseph Radford |
0:2df78a4443cd | 3 | |
Joseph Radford |
0:2df78a4443cd | 4 | #define GROVE_NUM_RETRIES 10 // number of retries for reading sensor |
Joseph Radford |
0:2df78a4443cd | 5 | |
Joseph Radford |
0:2df78a4443cd | 6 | DigitalOut grovePwr(P1_3); // if anything else is interfaced to uart/adc/i2c connectors, this will have to change, as they share this enable line |
Joseph Radford |
0:2df78a4443cd | 7 | |
Joseph Radford |
0:2df78a4443cd | 8 | GroveDht22::GroveDht22(MeasurementHandler *_measure, MyTimers * _timer) : AbstractHandler(_timer), m_measure(_measure) |
Joseph Radford |
0:2df78a4443cd | 9 | { |
Joseph Radford |
0:2df78a4443cd | 10 | // initialise class variables |
Joseph Radford |
0:2df78a4443cd | 11 | mode = dht_StartTurnOff; |
Joseph Radford |
0:2df78a4443cd | 12 | _lastCelcius = 0.0f; |
Joseph Radford |
0:2df78a4443cd | 13 | _lastHumidity = 0.0f; |
Joseph Radford |
0:2df78a4443cd | 14 | _lastDewpoint = 0.0f; |
Joseph Radford |
0:2df78a4443cd | 15 | _lastError = ERROR_NONE; |
Joseph Radford |
0:2df78a4443cd | 16 | _retries = 0; |
Joseph Radford |
0:2df78a4443cd | 17 | _newInfo = 0; |
Joseph Radford |
0:2df78a4443cd | 18 | |
Joseph Radford |
0:2df78a4443cd | 19 | m_sensor = new DHT(P1_14,SEN51035P); // Use the SEN51035P sensor |
Joseph Radford |
0:2df78a4443cd | 20 | } |
Joseph Radford |
0:2df78a4443cd | 21 | |
Joseph Radford |
0:2df78a4443cd | 22 | GroveDht22::~GroveDht22() |
Joseph Radford |
0:2df78a4443cd | 23 | { |
Joseph Radford |
0:2df78a4443cd | 24 | delete m_sensor; |
Joseph Radford |
0:2df78a4443cd | 25 | } |
Joseph Radford |
0:2df78a4443cd | 26 | |
Joseph Radford |
0:2df78a4443cd | 27 | void GroveDht22::run() |
Joseph Radford |
0:2df78a4443cd | 28 | { |
Joseph Radford |
0:2df78a4443cd | 29 | switch(mode) |
Joseph Radford |
0:2df78a4443cd | 30 | { |
Joseph Radford |
0:2df78a4443cd | 31 | case dht_StartTurnOff: |
Joseph Radford |
0:2df78a4443cd | 32 | powerOn(false); |
Joseph Radford |
0:2df78a4443cd | 33 | m_timer->SetTimer(MyTimers::tmr_GroveMeasure, 1000); // leave off for 1 second |
Joseph Radford |
0:2df78a4443cd | 34 | mode = dht_StartTurnOffWait; |
Joseph Radford |
0:2df78a4443cd | 35 | break; |
Joseph Radford |
0:2df78a4443cd | 36 | |
Joseph Radford |
0:2df78a4443cd | 37 | case dht_StartTurnOffWait: |
Joseph Radford |
0:2df78a4443cd | 38 | if (!m_timer->GetTimer(MyTimers::tmr_GroveMeasure)) // wait until timer has elapsed |
Joseph Radford |
0:2df78a4443cd | 39 | mode = dht_StartTurnOn; |
Joseph Radford |
0:2df78a4443cd | 40 | // else come back here |
Joseph Radford |
0:2df78a4443cd | 41 | break; |
Joseph Radford |
0:2df78a4443cd | 42 | |
Joseph Radford |
0:2df78a4443cd | 43 | case dht_StartTurnOn: |
Joseph Radford |
0:2df78a4443cd | 44 | powerOn(true); |
Joseph Radford |
0:2df78a4443cd | 45 | m_timer->SetTimer(MyTimers::tmr_GroveMeasure, 1000); // wait one second for sensor to settle |
Joseph Radford |
0:2df78a4443cd | 46 | mode = dht_StartTurnOnWait; |
Joseph Radford |
0:2df78a4443cd | 47 | break; |
Joseph Radford |
0:2df78a4443cd | 48 | |
Joseph Radford |
0:2df78a4443cd | 49 | case dht_StartTurnOnWait: |
Joseph Radford |
0:2df78a4443cd | 50 | if (!m_timer->GetTimer(MyTimers::tmr_GroveMeasure)) // wait until timer has elapsed |
Joseph Radford |
0:2df78a4443cd | 51 | mode = dht_TakeMeasurement; |
Joseph Radford |
0:2df78a4443cd | 52 | // else come back here |
Joseph Radford |
0:2df78a4443cd | 53 | break; |
Joseph Radford |
0:2df78a4443cd | 54 | |
Joseph Radford |
0:2df78a4443cd | 55 | case dht_TakeMeasurement: |
Joseph Radford |
0:2df78a4443cd | 56 | _lastError = (eError)m_sensor->readData(); // take the measurement (todo: see if nonblocking is available) |
Joseph Radford |
0:2df78a4443cd | 57 | if (_lastError == ERROR_NONE) |
Joseph Radford |
0:2df78a4443cd | 58 | { |
Joseph Radford |
0:2df78a4443cd | 59 | _retries = 0; // reset retries as measurement was successful |
Joseph Radford |
0:2df78a4443cd | 60 | _lastCelcius = m_sensor->ReadTemperature(CELCIUS); |
Joseph Radford |
0:2df78a4443cd | 61 | _lastHumidity = m_sensor->ReadHumidity(); |
Joseph Radford |
0:2df78a4443cd | 62 | _lastDewpoint = m_sensor->CalcdewPoint(_lastCelcius, _lastHumidity); |
Joseph Radford |
0:2df78a4443cd | 63 | m_timer->SetTimer(MyTimers::tmr_GroveMeasure, 3000); // wait three seconds |
Joseph Radford |
0:2df78a4443cd | 64 | |
Joseph Radford |
0:2df78a4443cd | 65 | // add the date time |
Joseph Radford |
0:2df78a4443cd | 66 | time_t _time = time(NULL); // get the seconds since dawn of time |
Joseph Radford |
0:2df78a4443cd | 67 | Dht22Result data = {_time, _lastCelcius, _lastHumidity, _lastDewpoint}; |
Joseph Radford |
0:2df78a4443cd | 68 | m_measure->setRequest(MeasurementHandler::measreq_DhtResult, (void*)&data); |
Joseph Radford |
0:2df78a4443cd | 69 | mode = dht_WaitMeasurement; |
Joseph Radford |
0:2df78a4443cd | 70 | } |
Joseph Radford |
0:2df78a4443cd | 71 | else |
Joseph Radford |
0:2df78a4443cd | 72 | { |
Joseph Radford |
0:2df78a4443cd | 73 | _retries++; // there was an error. See if we have reached critical retries |
Joseph Radford |
0:2df78a4443cd | 74 | if (_retries >= GROVE_NUM_RETRIES) |
Joseph Radford |
0:2df78a4443cd | 75 | { |
Joseph Radford |
0:2df78a4443cd | 76 | _retries = 0; |
Joseph Radford |
0:2df78a4443cd | 77 | mode = dht_StartTurnOff; // restart the sensor |
Joseph Radford |
0:2df78a4443cd | 78 | } |
Joseph Radford |
0:2df78a4443cd | 79 | else |
Joseph Radford |
0:2df78a4443cd | 80 | { |
Joseph Radford |
0:2df78a4443cd | 81 | // haven't reach critical retries yet, so try again, after waiting |
Joseph Radford |
0:2df78a4443cd | 82 | m_timer->SetTimer(MyTimers::tmr_GroveMeasure, 3000); // wait three seconds |
Joseph Radford |
0:2df78a4443cd | 83 | mode = dht_WaitMeasurement; |
Joseph Radford |
0:2df78a4443cd | 84 | } |
Joseph Radford |
0:2df78a4443cd | 85 | int sendData = (int)_lastError; // just to make sure nothing funny happens with the enum |
Joseph Radford |
0:2df78a4443cd | 86 | m_measure->setRequest(MeasurementHandler::measreq_DhtError, (int*)&sendData); |
Joseph Radford |
0:2df78a4443cd | 87 | } |
Joseph Radford |
0:2df78a4443cd | 88 | _newInfo = 1; |
Joseph Radford |
0:2df78a4443cd | 89 | break; |
Joseph Radford |
0:2df78a4443cd | 90 | |
Joseph Radford |
0:2df78a4443cd | 91 | case dht_WaitMeasurement: |
Joseph Radford |
0:2df78a4443cd | 92 | if (!m_timer->GetTimer(MyTimers::tmr_GroveMeasure)) // if timer elapsed |
Joseph Radford |
0:2df78a4443cd | 93 | mode = dht_TakeMeasurement; |
Joseph Radford |
0:2df78a4443cd | 94 | // else come back here |
Joseph Radford |
0:2df78a4443cd | 95 | break; |
Joseph Radford |
0:2df78a4443cd | 96 | |
Joseph Radford |
0:2df78a4443cd | 97 | } |
Joseph Radford |
0:2df78a4443cd | 98 | } |
Joseph Radford |
0:2df78a4443cd | 99 | |
Joseph Radford |
0:2df78a4443cd | 100 | void GroveDht22::setRequest(int request, void *data) |
Joseph Radford |
0:2df78a4443cd | 101 | { |
Joseph Radford |
0:2df78a4443cd | 102 | // no requests (yet) |
Joseph Radford |
0:2df78a4443cd | 103 | } |
Joseph Radford |
0:2df78a4443cd | 104 | |
Joseph Radford |
0:2df78a4443cd | 105 | // check if there is new information and reset the flag once the check occurs |
Joseph Radford |
0:2df78a4443cd | 106 | unsigned char GroveDht22::newInfo() |
Joseph Radford |
0:2df78a4443cd | 107 | { |
Joseph Radford |
0:2df78a4443cd | 108 | unsigned char retval = _newInfo; |
Joseph Radford |
0:2df78a4443cd | 109 | _newInfo = 0; |
Joseph Radford |
0:2df78a4443cd | 110 | return retval; |
Joseph Radford |
0:2df78a4443cd | 111 | } |
Joseph Radford |
0:2df78a4443cd | 112 | |
Joseph Radford |
0:2df78a4443cd | 113 | // turn the enable pin for the peripheral plugins on the Arch GPRS v2 |
Joseph Radford |
0:2df78a4443cd | 114 | // it is active low and acts on Q1 |
Joseph Radford |
0:2df78a4443cd | 115 | void GroveDht22::powerOn(unsigned char ON) |
Joseph Radford |
0:2df78a4443cd | 116 | { |
Joseph Radford |
0:2df78a4443cd | 117 | if (ON) |
Joseph Radford |
0:2df78a4443cd | 118 | grovePwr = 0; // active low, will turn power on |
Joseph Radford |
0:2df78a4443cd | 119 | else |
Joseph Radford |
0:2df78a4443cd | 120 | grovePwr = 1; // will turn power off |
Joseph Radford |
0:2df78a4443cd | 121 | } |