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
main.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 | /*! |
Joseph Radford |
0:2df78a4443cd | 2 | * Project: Humidity SMS Alert |
Joseph Radford |
0:2df78a4443cd | 3 | * Author: Joseph Radford |
Joseph Radford |
0:2df78a4443cd | 4 | * Date start: January 2016 |
Joseph Radford |
0:2df78a4443cd | 5 | * Date mod: |
Joseph Radford |
0:2df78a4443cd | 6 | * Target: Arch GPRS V2 |
Joseph Radford |
0:2df78a4443cd | 7 | * Peripherals: SD Card |
Joseph Radford |
0:2df78a4443cd | 8 | * SIM Card |
Joseph Radford |
0:2df78a4443cd | 9 | * Grove Humidity and Temperature Sensor Pro (DHT22 on a breakout board) |
Joseph Radford |
0:2df78a4443cd | 10 | * |
Joseph Radford |
0:2df78a4443cd | 11 | * |
Joseph Radford |
0:2df78a4443cd | 12 | * Takes intermittent readings from the humidity temperature sensor. These are written to a timestamped CSV file |
Joseph Radford |
0:2df78a4443cd | 13 | * on the SD card and printed over serial if there is a connection to a terminal window (Screen on Linux, Putty on Windows, etc) |
Joseph Radford |
0:2df78a4443cd | 14 | * |
Joseph Radford |
0:2df78a4443cd | 15 | * When conditions have been met, an SMS alert is sent notifying the recipient of the last sensor readings. |
Joseph Radford |
0:2df78a4443cd | 16 | * |
Joseph Radford |
0:2df78a4443cd | 17 | * States can be requested, and configurations changed, by sending requests over USB serial or SMS. |
Joseph Radford |
0:2df78a4443cd | 18 | * |
Joseph Radford |
0:2df78a4443cd | 19 | * Inputs: |
Joseph Radford |
0:2df78a4443cd | 20 | * \a GroveDht22 |
Joseph Radford |
0:2df78a4443cd | 21 | * |
Joseph Radford |
0:2df78a4443cd | 22 | * Outputs: |
Joseph Radford |
0:2df78a4443cd | 23 | * \a SdHandler |
Joseph Radford |
0:2df78a4443cd | 24 | * |
Joseph Radford |
0:2df78a4443cd | 25 | * |
Joseph Radford |
0:2df78a4443cd | 26 | * Inputs and outputs: |
Joseph Radford |
0:2df78a4443cd | 27 | * \a GprsHandler |
Joseph Radford |
0:2df78a4443cd | 28 | * \a UsbComms |
Joseph Radford |
0:2df78a4443cd | 29 | * |
Joseph Radford |
0:2df78a4443cd | 30 | * Linker: |
Joseph Radford |
0:2df78a4443cd | 31 | * \a MeasurementHandler |
Joseph Radford |
0:2df78a4443cd | 32 | * |
Joseph Radford |
0:2df78a4443cd | 33 | * 10/04/2016 v0.0.1 - Writes timestamped humidity data to an SD card |
Joseph Radford |
0:2df78a4443cd | 34 | * |
Joseph Radford |
0:2df78a4443cd | 35 | * Issues: |
Joseph Radford |
0:2df78a4443cd | 36 | * Stops communicating over USB after ~10 mins. |
Joseph Radford |
0:2df78a4443cd | 37 | * Will not work if USB not present. |
Joseph Radford |
0:2df78a4443cd | 38 | * Will not work if SD card is not present |
Joseph Radford |
0:2df78a4443cd | 39 | * GPRS yet to be implemented |
Joseph Radford |
0:2df78a4443cd | 40 | * RTC is set to 01/01/2000 00:00:00 at startup. No way of setting it yet. |
Joseph Radford |
0:2df78a4443cd | 41 | */ |
Joseph Radford |
0:2df78a4443cd | 42 | |
Joseph Radford |
0:2df78a4443cd | 43 | #include "config.h" |
Joseph Radford |
0:2df78a4443cd | 44 | |
Joseph Radford |
0:2df78a4443cd | 45 | #include "mbed.h" |
Joseph Radford |
0:2df78a4443cd | 46 | #include "math.h" |
Joseph Radford |
0:2df78a4443cd | 47 | |
Joseph Radford |
0:2df78a4443cd | 48 | // Clocks and timers |
Joseph Radford |
0:2df78a4443cd | 49 | #include "DS1337.h" |
Joseph Radford |
0:2df78a4443cd | 50 | #include "rtc.h" |
Joseph Radford |
0:2df78a4443cd | 51 | #include "timers.h" |
Joseph Radford |
0:2df78a4443cd | 52 | |
Joseph Radford |
0:2df78a4443cd | 53 | // Handlers |
Joseph Radford |
0:2df78a4443cd | 54 | #include "Handlers/GroveDht22.h" |
Joseph Radford |
0:2df78a4443cd | 55 | #include "Handlers/UsbComms.h" |
Joseph Radford |
0:2df78a4443cd | 56 | #include "Handlers/SdHandler.h" |
Joseph Radford |
0:2df78a4443cd | 57 | #include "Handlers/measurementhandler.h" |
Joseph Radford |
0:2df78a4443cd | 58 | |
Joseph Radford |
0:2df78a4443cd | 59 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 60 | #include "Handlers/GprsHandler.h" |
Joseph Radford |
0:2df78a4443cd | 61 | #endif |
Joseph Radford |
0:2df78a4443cd | 62 | |
Joseph Radford |
0:2df78a4443cd | 63 | /* Declare hardware classes */ |
Joseph Radford |
0:2df78a4443cd | 64 | |
Joseph Radford |
0:2df78a4443cd | 65 | DigitalOut myled1(LED2); ///< startup, and USB handler when writing occurring (right most) |
Joseph Radford |
0:2df78a4443cd | 66 | DigitalOut myled2(LED3); ///< SD handler - on when buffer pending, off when written. If error, will be on as buffer won't clear |
Joseph Radford |
0:2df78a4443cd | 67 | DigitalOut myled3(LED4); ///< GPRS handler information |
Joseph Radford |
0:2df78a4443cd | 68 | DigitalOut myled4(LED1); ///< measurement handler flashes, periodically to inform running (left most) |
Joseph Radford |
0:2df78a4443cd | 69 | |
Joseph Radford |
0:2df78a4443cd | 70 | //DigitalOut myenable(P0_6); |
Joseph Radford |
0:2df78a4443cd | 71 | |
Joseph Radford |
0:2df78a4443cd | 72 | DS1337 * RTC_DS1337; ///< RTC interface class |
Joseph Radford |
0:2df78a4443cd | 73 | |
Joseph Radford |
0:2df78a4443cd | 74 | I2C i2c(P0_5, P0_4); ///< I2C comms - this is required by the RTC - do NOT change the name of the instance |
Joseph Radford |
0:2df78a4443cd | 75 | |
Joseph Radford |
0:2df78a4443cd | 76 | |
Joseph Radford |
0:2df78a4443cd | 77 | /* Declare helpers */ |
Joseph Radford |
0:2df78a4443cd | 78 | MyTimers *mytimer; ///< declare timers class - required for other classes to use timers (do not change name) |
Joseph Radford |
0:2df78a4443cd | 79 | |
Joseph Radford |
0:2df78a4443cd | 80 | |
Joseph Radford |
0:2df78a4443cd | 81 | /* Declare handlers */ |
Joseph Radford |
0:2df78a4443cd | 82 | GroveDht22 *grove; ///< grove humidity sensor handler class |
Joseph Radford |
0:2df78a4443cd | 83 | UsbComms *usbcomms; ///< reading and writing to usb |
Joseph Radford |
0:2df78a4443cd | 84 | SdHandler *sdhandler; ///< Writing data to a file on SD |
Joseph Radford |
0:2df78a4443cd | 85 | MeasurementHandler *measure; ///< Handle measurements, and route data to the user and user to configuration |
Joseph Radford |
0:2df78a4443cd | 86 | |
Joseph Radford |
0:2df78a4443cd | 87 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 88 | GprsHandler * gprs; ///< Reading and writing to the SIM900 |
Joseph Radford |
0:2df78a4443cd | 89 | #endif |
Joseph Radford |
0:2df78a4443cd | 90 | |
Joseph Radford |
0:2df78a4443cd | 91 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 92 | #define NUM_HANDLERS 5 |
Joseph Radford |
0:2df78a4443cd | 93 | #else |
Joseph Radford |
0:2df78a4443cd | 94 | #define NUM_HANDLERS 4 |
Joseph Radford |
0:2df78a4443cd | 95 | #endif |
Joseph Radford |
0:2df78a4443cd | 96 | |
Joseph Radford |
0:2df78a4443cd | 97 | #define PROGRAM_TITLE "Arch GPRS V2 Alert and Request" |
Joseph Radford |
0:2df78a4443cd | 98 | #define PROGRAM_INFO "v0.0.1, released 09/04/2016" |
Joseph Radford |
0:2df78a4443cd | 99 | |
Joseph Radford |
0:2df78a4443cd | 100 | /*! |
Joseph Radford |
0:2df78a4443cd | 101 | * \brief main pulses LED1, creates all classes, pulses LED1, then runs through all handlers forever |
Joseph Radford |
0:2df78a4443cd | 102 | * \return |
Joseph Radford |
0:2df78a4443cd | 103 | */ |
Joseph Radford |
0:2df78a4443cd | 104 | int main() |
Joseph Radford |
0:2df78a4443cd | 105 | { |
Joseph Radford |
0:2df78a4443cd | 106 | /* start up sequence, so we know we reached main */ |
Joseph Radford |
0:2df78a4443cd | 107 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 108 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 109 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 110 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 111 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 112 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 113 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 114 | wait(1); |
Joseph Radford |
0:2df78a4443cd | 115 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 116 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 117 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 118 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 119 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 120 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 121 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 122 | wait(1); |
Joseph Radford |
0:2df78a4443cd | 123 | |
Joseph Radford |
0:2df78a4443cd | 124 | /* Declare all classes */ |
Joseph Radford |
0:2df78a4443cd | 125 | |
Joseph Radford |
0:2df78a4443cd | 126 | // create MyTimers object, which can be used for waiting in handlers |
Joseph Radford |
0:2df78a4443cd | 127 | mytimer = new MyTimers(); |
Joseph Radford |
0:2df78a4443cd | 128 | |
Joseph Radford |
0:2df78a4443cd | 129 | // RTC interface class |
Joseph Radford |
0:2df78a4443cd | 130 | RTC_DS1337 = new DS1337(); |
Joseph Radford |
0:2df78a4443cd | 131 | attach_rtc(&my_rtc_read, &my_rtc_write, &my_rtc_init, &my_rtc_enabled); |
Joseph Radford |
0:2df78a4443cd | 132 | |
Joseph Radford |
0:2df78a4443cd | 133 | // set the time to the start of the year 2000, by default |
Joseph Radford |
0:2df78a4443cd | 134 | // this will be removed when time can be set, so that time is not reset each time the program starts. |
Joseph Radford |
0:2df78a4443cd | 135 | tm timeinfo; |
Joseph Radford |
0:2df78a4443cd | 136 | timeinfo.tm_hour = 0; timeinfo.tm_min = 0; timeinfo.tm_sec = 0; |
Joseph Radford |
0:2df78a4443cd | 137 | timeinfo.tm_year = (2001 - 1900); timeinfo.tm_mon = 0; timeinfo.tm_mday = 1; |
Joseph Radford |
0:2df78a4443cd | 138 | set_time(mktime(&timeinfo)); |
Joseph Radford |
0:2df78a4443cd | 139 | |
Joseph Radford |
0:2df78a4443cd | 140 | // declare usbcomms |
Joseph Radford |
0:2df78a4443cd | 141 | usbcomms = new UsbComms(mytimer); |
Joseph Radford |
0:2df78a4443cd | 142 | |
Joseph Radford |
0:2df78a4443cd | 143 | // declare sd handler |
Joseph Radford |
0:2df78a4443cd | 144 | sdhandler = new SdHandler(mytimer); |
Joseph Radford |
0:2df78a4443cd | 145 | |
Joseph Radford |
0:2df78a4443cd | 146 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 147 | gprs = new GprsHandler(mytimer, usbcomms); |
Joseph Radford |
0:2df78a4443cd | 148 | measure = new MeasurementHandler(sdhandler, usbcomms, gprs, mytimer); |
Joseph Radford |
0:2df78a4443cd | 149 | #else |
Joseph Radford |
0:2df78a4443cd | 150 | measure = new MeasurementHandler(sdhandler, usbcomms, mytimer); |
Joseph Radford |
0:2df78a4443cd | 151 | #endif |
Joseph Radford |
0:2df78a4443cd | 152 | |
Joseph Radford |
0:2df78a4443cd | 153 | // declare grove |
Joseph Radford |
0:2df78a4443cd | 154 | grove = new GroveDht22(measure, mytimer); |
Joseph Radford |
0:2df78a4443cd | 155 | |
Joseph Radford |
0:2df78a4443cd | 156 | // put the handlers in an array for easy reference |
Joseph Radford |
0:2df78a4443cd | 157 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 158 | AbstractHandler* handlers[] = {grove, usbcomms, sdhandler, measure, gprs}; |
Joseph Radford |
0:2df78a4443cd | 159 | #else |
Joseph Radford |
0:2df78a4443cd | 160 | AbstractHandler* handlers[] = {grove, usbcomms, measure, sdhandler}; |
Joseph Radford |
0:2df78a4443cd | 161 | #endif |
Joseph Radford |
0:2df78a4443cd | 162 | |
Joseph Radford |
0:2df78a4443cd | 163 | // send startup message to terminal |
Joseph Radford |
0:2df78a4443cd | 164 | usbcomms->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)PROGRAM_TITLE); |
Joseph Radford |
0:2df78a4443cd | 165 | usbcomms->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)PROGRAM_INFO); |
Joseph Radford |
0:2df78a4443cd | 166 | usbcomms->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"\r\n******************\r\n"); |
Joseph Radford |
0:2df78a4443cd | 167 | |
Joseph Radford |
0:2df78a4443cd | 168 | // flush output |
Joseph Radford |
0:2df78a4443cd | 169 | fflush(stdout); |
Joseph Radford |
0:2df78a4443cd | 170 | |
Joseph Radford |
0:2df78a4443cd | 171 | |
Joseph Radford |
0:2df78a4443cd | 172 | /* Pulse LED1 again to signify start up was successful */ |
Joseph Radford |
0:2df78a4443cd | 173 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 174 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 175 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 176 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 177 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 178 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 179 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 180 | wait(1); |
Joseph Radford |
0:2df78a4443cd | 181 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 182 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 183 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 184 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 185 | myled1 = 1; |
Joseph Radford |
0:2df78a4443cd | 186 | wait(0.2); |
Joseph Radford |
0:2df78a4443cd | 187 | myled1 = 0; |
Joseph Radford |
0:2df78a4443cd | 188 | wait(1); |
Joseph Radford |
0:2df78a4443cd | 189 | |
Joseph Radford |
0:2df78a4443cd | 190 | |
Joseph Radford |
0:2df78a4443cd | 191 | while(1) |
Joseph Radford |
0:2df78a4443cd | 192 | { |
Joseph Radford |
0:2df78a4443cd | 193 | // perform run functions for all handlers, one after the other |
Joseph Radford |
0:2df78a4443cd | 194 | for (int i = 0; i < NUM_HANDLERS; i++) { |
Joseph Radford |
0:2df78a4443cd | 195 | handlers[i]->run(); |
Joseph Radford |
0:2df78a4443cd | 196 | } |
Joseph Radford |
0:2df78a4443cd | 197 | } // while |
Joseph Radford |
0:2df78a4443cd | 198 | |
Joseph Radford |
0:2df78a4443cd | 199 | for (int i = 0; i < NUM_HANDLERS; i++) { |
Joseph Radford |
0:2df78a4443cd | 200 | delete handlers[i]; |
Joseph Radford |
0:2df78a4443cd | 201 | } |
Joseph Radford |
0:2df78a4443cd | 202 | } // main |
Joseph Radford |
0:2df78a4443cd | 203 | |
Joseph Radford |
0:2df78a4443cd | 204 | |
Joseph Radford |
0:2df78a4443cd | 205 |