Lab3 - Pressure, temperature, and humidity sensors displayed on a webpage.
Dependencies: EthernetNetIf NTPClient_NetServices GPS mbed HTTPServer SDFileSystem
main.cpp@0:dfd0841721d5, 2010-10-05 (annotated)
- Committer:
- kadams6
- Date:
- Tue Oct 05 19:34:40 2010 +0000
- Revision:
- 0:dfd0841721d5
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kadams6 | 0:dfd0841721d5 | 1 | #include "mbed.h" |
kadams6 | 0:dfd0841721d5 | 2 | |
kadams6 | 0:dfd0841721d5 | 3 | //#define SD_FS |
kadams6 | 0:dfd0841721d5 | 4 | |
kadams6 | 0:dfd0841721d5 | 5 | #include "EthernetNetIf.h" |
kadams6 | 0:dfd0841721d5 | 6 | #include "HTTPServer.h" |
kadams6 | 0:dfd0841721d5 | 7 | #include "HTTPClient.h" |
kadams6 | 0:dfd0841721d5 | 8 | #ifdef SD_FS |
kadams6 | 0:dfd0841721d5 | 9 | #include "SDFileSystem.h" |
kadams6 | 0:dfd0841721d5 | 10 | #endif |
kadams6 | 0:dfd0841721d5 | 11 | #include "GPS.h" |
kadams6 | 0:dfd0841721d5 | 12 | #include "NTPClient.h" |
kadams6 | 0:dfd0841721d5 | 13 | |
kadams6 | 0:dfd0841721d5 | 14 | #include "SCP1000.h" |
kadams6 | 0:dfd0841721d5 | 15 | #include "PachubeClient.h" |
kadams6 | 0:dfd0841721d5 | 16 | #include "main.h" |
kadams6 | 0:dfd0841721d5 | 17 | |
kadams6 | 0:dfd0841721d5 | 18 | /*********** |
kadams6 | 0:dfd0841721d5 | 19 | * I/O * |
kadams6 | 0:dfd0841721d5 | 20 | ***********/ |
kadams6 | 0:dfd0841721d5 | 21 | DigitalOut listenStatus(LED1); // Blink when HTTP server is listening |
kadams6 | 0:dfd0841721d5 | 22 | DigitalOut ipStatus(LED2); // Set when IP address acquired |
kadams6 | 0:dfd0841721d5 | 23 | DigitalOut pollStatus(LED3); // Reserved |
kadams6 | 0:dfd0841721d5 | 24 | DigitalOut errorStatus(LED4); // Blink when error condition occurs; read other LEDs for code. |
kadams6 | 0:dfd0841721d5 | 25 | |
kadams6 | 0:dfd0841721d5 | 26 | AnalogIn humiditySensor(p17); // |
kadams6 | 0:dfd0841721d5 | 27 | //AnalogIn tempSensor(p16); // Temp sensor. |
kadams6 | 0:dfd0841721d5 | 28 | |
kadams6 | 0:dfd0841721d5 | 29 | SCP1000 scp1000(p5,p6,p7,p8); // Temp & pressure. |
kadams6 | 0:dfd0841721d5 | 30 | |
kadams6 | 0:dfd0841721d5 | 31 | |
kadams6 | 0:dfd0841721d5 | 32 | GPS gps(p9, p10); |
kadams6 | 0:dfd0841721d5 | 33 | |
kadams6 | 0:dfd0841721d5 | 34 | #ifdef SD_FS |
kadams6 | 0:dfd0841721d5 | 35 | SDFileSystem sd(p5, p6, p7, p8, "fs"); // the pinout on the mbed Cool Components workshop board |
kadams6 | 0:dfd0841721d5 | 36 | #else |
kadams6 | 0:dfd0841721d5 | 37 | LocalFileSystem local("fs"); |
kadams6 | 0:dfd0841721d5 | 38 | #endif |
kadams6 | 0:dfd0841721d5 | 39 | |
kadams6 | 0:dfd0841721d5 | 40 | NTPClient ntp; |
kadams6 | 0:dfd0841721d5 | 41 | PachubeClient pachube("633b3cb4e8ee8ba4a4f6c4f65df283360e0ed3d2ca572c249e532632eb5e19cd"); |
kadams6 | 0:dfd0841721d5 | 42 | |
kadams6 | 0:dfd0841721d5 | 43 | |
kadams6 | 0:dfd0841721d5 | 44 | void postFeed(float pressure, float humidity, float temperature) { |
kadams6 | 0:dfd0841721d5 | 45 | char data[256] = {0}; |
kadams6 | 0:dfd0841721d5 | 46 | |
kadams6 | 0:dfd0841721d5 | 47 | // feed has two datastreams in this example, values are comma separated |
kadams6 | 0:dfd0841721d5 | 48 | sprintf("%5.3f,%5.3f,%5.3f", data, temperature, pressure, humidity); |
kadams6 | 0:dfd0841721d5 | 49 | |
kadams6 | 0:dfd0841721d5 | 50 | pachube.PutCsv("10587", data); |
kadams6 | 0:dfd0841721d5 | 51 | |
kadams6 | 0:dfd0841721d5 | 52 | if (pachube.Result() != HTTP_OK || pachube.Response() != 200) { |
kadams6 | 0:dfd0841721d5 | 53 | ledError(ERR_UPFEED); |
kadams6 | 0:dfd0841721d5 | 54 | } else { |
kadams6 | 0:dfd0841721d5 | 55 | errorStatus = !errorStatus; |
kadams6 | 0:dfd0841721d5 | 56 | } |
kadams6 | 0:dfd0841721d5 | 57 | } |
kadams6 | 0:dfd0841721d5 | 58 | |
kadams6 | 0:dfd0841721d5 | 59 | |
kadams6 | 0:dfd0841721d5 | 60 | /** |
kadams6 | 0:dfd0841721d5 | 61 | * Blink the error LED and place the error code on the other LEDs. |
kadams6 | 0:dfd0841721d5 | 62 | * WARNING: Never returns! |
kadams6 | 0:dfd0841721d5 | 63 | * |
kadams6 | 0:dfd0841721d5 | 64 | */ |
kadams6 | 0:dfd0841721d5 | 65 | void ledError(ErrorCode code) { |
kadams6 | 0:dfd0841721d5 | 66 | listenStatus = code & 1; |
kadams6 | 0:dfd0841721d5 | 67 | ipStatus = (code >> 1) & 1; |
kadams6 | 0:dfd0841721d5 | 68 | pollStatus = (code >> 2) & 1; |
kadams6 | 0:dfd0841721d5 | 69 | |
kadams6 | 0:dfd0841721d5 | 70 | while (true) { |
kadams6 | 0:dfd0841721d5 | 71 | errorStatus = !errorStatus; |
kadams6 | 0:dfd0841721d5 | 72 | wait(BLINK_RATE); |
kadams6 | 0:dfd0841721d5 | 73 | } |
kadams6 | 0:dfd0841721d5 | 74 | } |
kadams6 | 0:dfd0841721d5 | 75 | |
kadams6 | 0:dfd0841721d5 | 76 | /** |
kadams6 | 0:dfd0841721d5 | 77 | * Read sensor data and write it to file. |
kadams6 | 0:dfd0841721d5 | 78 | */ |
kadams6 | 0:dfd0841721d5 | 79 | void pollSensors() { |
kadams6 | 0:dfd0841721d5 | 80 | int locked = 0; |
kadams6 | 0:dfd0841721d5 | 81 | float temp = 0; |
kadams6 | 0:dfd0841721d5 | 82 | //float tempB = 0; |
kadams6 | 0:dfd0841721d5 | 83 | |
kadams6 | 0:dfd0841721d5 | 84 | float lat = 0; |
kadams6 | 0:dfd0841721d5 | 85 | float lng = 0; |
kadams6 | 0:dfd0841721d5 | 86 | float pressure = 0; |
kadams6 | 0:dfd0841721d5 | 87 | float humidity = 0; |
kadams6 | 0:dfd0841721d5 | 88 | |
kadams6 | 0:dfd0841721d5 | 89 | char * timeStr; |
kadams6 | 0:dfd0841721d5 | 90 | time_t ctTime; |
kadams6 | 0:dfd0841721d5 | 91 | |
kadams6 | 0:dfd0841721d5 | 92 | pollStatus = !pollStatus; |
kadams6 | 0:dfd0841721d5 | 93 | |
kadams6 | 0:dfd0841721d5 | 94 | FILE* fp = fopen("/fs/sensors.htm", "w"); |
kadams6 | 0:dfd0841721d5 | 95 | if (fp == NULL) { |
kadams6 | 0:dfd0841721d5 | 96 | ledError(ERR_FILE); |
kadams6 | 0:dfd0841721d5 | 97 | } |
kadams6 | 0:dfd0841721d5 | 98 | |
kadams6 | 0:dfd0841721d5 | 99 | // Temp |
kadams6 | 0:dfd0841721d5 | 100 | // (SensorValue/4) - 50 |
kadams6 | 0:dfd0841721d5 | 101 | //temp = tempSensor * 160 - 50; // Analog to deg C |
kadams6 | 0:dfd0841721d5 | 102 | //temp = 1.8 * temp + 32; // deg C to F. |
kadams6 | 0:dfd0841721d5 | 103 | |
kadams6 | 0:dfd0841721d5 | 104 | temp = scp1000.readTemperature(); |
kadams6 | 0:dfd0841721d5 | 105 | temp = 1.8 * temp + 32; // deg C to F |
kadams6 | 0:dfd0841721d5 | 106 | |
kadams6 | 0:dfd0841721d5 | 107 | // Pressure |
kadams6 | 0:dfd0841721d5 | 108 | unsigned long ulPressure = scp1000.readPressure(); |
kadams6 | 0:dfd0841721d5 | 109 | pressure = ((float) ulPressure) / 1000.0; // Pa to kPa |
kadams6 | 0:dfd0841721d5 | 110 | |
kadams6 | 0:dfd0841721d5 | 111 | // Humidity |
kadams6 | 0:dfd0841721d5 | 112 | // RH (%) = (SensorValue x 0.1906) - 40.2 |
kadams6 | 0:dfd0841721d5 | 113 | |
kadams6 | 0:dfd0841721d5 | 114 | // This might be wrong. |
kadams6 | 0:dfd0841721d5 | 115 | humidity = (1000 * humiditySensor * 0.1906) - 40.2; |
kadams6 | 0:dfd0841721d5 | 116 | |
kadams6 | 0:dfd0841721d5 | 117 | ctTime = time(NULL); |
kadams6 | 0:dfd0841721d5 | 118 | ctTime -= 60 * 60 * 4; // Account for timezone offset. |
kadams6 | 0:dfd0841721d5 | 119 | timeStr = ctime(&ctTime); |
kadams6 | 0:dfd0841721d5 | 120 | |
kadams6 | 0:dfd0841721d5 | 121 | int i = 0; |
kadams6 | 0:dfd0841721d5 | 122 | while (timeStr[i] != '\0') { |
kadams6 | 0:dfd0841721d5 | 123 | if (timeStr[i] == '\n') { |
kadams6 | 0:dfd0841721d5 | 124 | timeStr[i] = ' '; |
kadams6 | 0:dfd0841721d5 | 125 | } |
kadams6 | 0:dfd0841721d5 | 126 | i++; |
kadams6 | 0:dfd0841721d5 | 127 | } |
kadams6 | 0:dfd0841721d5 | 128 | |
kadams6 | 0:dfd0841721d5 | 129 | |
kadams6 | 0:dfd0841721d5 | 130 | // True if GPS is locked. |
kadams6 | 0:dfd0841721d5 | 131 | //if (gps.sample()) { |
kadams6 | 0:dfd0841721d5 | 132 | //locked = 1; |
kadams6 | 0:dfd0841721d5 | 133 | //lat = gps.latitude; |
kadams6 | 0:dfd0841721d5 | 134 | //lng = gps.longitude; |
kadams6 | 0:dfd0841721d5 | 135 | //} |
kadams6 | 0:dfd0841721d5 | 136 | |
kadams6 | 0:dfd0841721d5 | 137 | fprintf(fp, "{\n\t\"gpsLocked\": %d,\n", locked); |
kadams6 | 0:dfd0841721d5 | 138 | fprintf(fp, "\t\"latitude\": %f,\n", lat); |
kadams6 | 0:dfd0841721d5 | 139 | fprintf(fp, "\t\"longitude\": %f,\n", lng); |
kadams6 | 0:dfd0841721d5 | 140 | fprintf(fp, "\t\"temperature\": %4.2f,\n", temp); |
kadams6 | 0:dfd0841721d5 | 141 | fprintf(fp, "\t\"pressure\": %5.2f,\n", pressure); |
kadams6 | 0:dfd0841721d5 | 142 | fprintf(fp, "\t\"time\": \"%s ET\",\n", timeStr); |
kadams6 | 0:dfd0841721d5 | 143 | fprintf(fp, "\t\"humidity\": %5.2f\n}", humidity); |
kadams6 | 0:dfd0841721d5 | 144 | |
kadams6 | 0:dfd0841721d5 | 145 | //postFeed(pressure, humidity, temp); |
kadams6 | 0:dfd0841721d5 | 146 | |
kadams6 | 0:dfd0841721d5 | 147 | fclose(fp); |
kadams6 | 0:dfd0841721d5 | 148 | } |
kadams6 | 0:dfd0841721d5 | 149 | |
kadams6 | 0:dfd0841721d5 | 150 | /** |
kadams6 | 0:dfd0841721d5 | 151 | * Flip listening status LED. |
kadams6 | 0:dfd0841721d5 | 152 | */ |
kadams6 | 0:dfd0841721d5 | 153 | void flipLed() { |
kadams6 | 0:dfd0841721d5 | 154 | listenStatus = !listenStatus; |
kadams6 | 0:dfd0841721d5 | 155 | } |
kadams6 | 0:dfd0841721d5 | 156 | |
kadams6 | 0:dfd0841721d5 | 157 | /** |
kadams6 | 0:dfd0841721d5 | 158 | * Entry point |
kadams6 | 0:dfd0841721d5 | 159 | */ |
kadams6 | 0:dfd0841721d5 | 160 | int main() { |
kadams6 | 0:dfd0841721d5 | 161 | EthernetNetIf eth; |
kadams6 | 0:dfd0841721d5 | 162 | HTTPServer server; |
kadams6 | 0:dfd0841721d5 | 163 | |
kadams6 | 0:dfd0841721d5 | 164 | ipStatus = 0; |
kadams6 | 0:dfd0841721d5 | 165 | listenStatus = 0; |
kadams6 | 0:dfd0841721d5 | 166 | pollStatus = 0; |
kadams6 | 0:dfd0841721d5 | 167 | |
kadams6 | 0:dfd0841721d5 | 168 | EthernetErr ethErr = eth.setup(); |
kadams6 | 0:dfd0841721d5 | 169 | if(ethErr) { |
kadams6 | 0:dfd0841721d5 | 170 | ledError(ERR_ETHERNET); |
kadams6 | 0:dfd0841721d5 | 171 | } |
kadams6 | 0:dfd0841721d5 | 172 | |
kadams6 | 0:dfd0841721d5 | 173 | Host ntpServer(IpAddr(), 123, "nist1.columbiacountyga.gov"); |
kadams6 | 0:dfd0841721d5 | 174 | ntp.setTime(ntpServer); |
kadams6 | 0:dfd0841721d5 | 175 | |
kadams6 | 0:dfd0841721d5 | 176 | ipStatus = 1; |
kadams6 | 0:dfd0841721d5 | 177 | |
kadams6 | 0:dfd0841721d5 | 178 | // Web root directory |
kadams6 | 0:dfd0841721d5 | 179 | FSHandler::mount("/fs", "/"); |
kadams6 | 0:dfd0841721d5 | 180 | |
kadams6 | 0:dfd0841721d5 | 181 | // Bind the filesystem handler for all requests |
kadams6 | 0:dfd0841721d5 | 182 | server.addHandler<FSHandler>("/"); // "/" matches every URL |
kadams6 | 0:dfd0841721d5 | 183 | server.bind(80); // listen port |
kadams6 | 0:dfd0841721d5 | 184 | |
kadams6 | 0:dfd0841721d5 | 185 | Ticker ledTicker; |
kadams6 | 0:dfd0841721d5 | 186 | ledTicker.attach(&flipLed, BLINK_RATE); |
kadams6 | 0:dfd0841721d5 | 187 | |
kadams6 | 0:dfd0841721d5 | 188 | pollSensors(); |
kadams6 | 0:dfd0841721d5 | 189 | |
kadams6 | 0:dfd0841721d5 | 190 | Ticker pollTicker; |
kadams6 | 0:dfd0841721d5 | 191 | pollTicker.attach(&pollSensors, SENSOR_POLL_RATE); |
kadams6 | 0:dfd0841721d5 | 192 | |
kadams6 | 0:dfd0841721d5 | 193 | // Listen indefinitely |
kadams6 | 0:dfd0841721d5 | 194 | while(true) |
kadams6 | 0:dfd0841721d5 | 195 | { |
kadams6 | 0:dfd0841721d5 | 196 | Net::poll(); |
kadams6 | 0:dfd0841721d5 | 197 | } |
kadams6 | 0:dfd0841721d5 | 198 | |
kadams6 | 0:dfd0841721d5 | 199 | return 0; |
kadams6 | 0:dfd0841721d5 | 200 | } |