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

Committer:
Joseph Radford
Date:
Sun Apr 10 15:47:33 2016 +1000
Revision:
0:2df78a4443cd
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }