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 /*!
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