Lab3 - Pressure, temperature, and humidity sensors displayed on a webpage.

Dependencies:   EthernetNetIf NTPClient_NetServices GPS mbed HTTPServer SDFileSystem

Committer:
kadams6
Date:
Tue Oct 05 19:34:40 2010 +0000
Revision:
0:dfd0841721d5

        

Who changed what in which revision?

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