This version has the index file and data pages on a SD card (512Mbyte) it does not suffer from the autorun problem when directly writtin to the mbed flash memory It makes readings from one solar panel for open and loaded voltages every 'interval' seconds Every readingsPerPage a new web page is created and indexed on a readings web page Activty is shown by the flashing blue led (0.5s) means it is connected and output via the serial over usb port. Data is preserved on subsequent power ups by incrementing file number. PMR 15/9/10 */

Dependencies:   EthernetNetIf NTPClient_NetServices mbed SDFileSystem

Committer:
pmr1
Date:
Sat Sep 18 13:31:41 2010 +0000
Revision:
0:d6b2d5c4c48f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmr1 0:d6b2d5c4c48f 1 /* This version has the index file and data pages on a SD card (512Mbyte)
pmr1 0:d6b2d5c4c48f 2 it does not suffer from the autorun problem when directly writtin to the mbed flash memory
pmr1 0:d6b2d5c4c48f 3 It makes readings from one solar panel for open and loaded voltages every 'interval' seconds
pmr1 0:d6b2d5c4c48f 4 Every readingsPerPage a new web page is created and indexed on a readings web page
pmr1 0:d6b2d5c4c48f 5 Activty is shown by the flashing blue led (0.5s) means it is connected and output via the serial
pmr1 0:d6b2d5c4c48f 6 over usb port.
pmr1 0:d6b2d5c4c48f 7
pmr1 0:d6b2d5c4c48f 8 Data is preserved on subsequent power ups by incrementing file number.
pmr1 0:d6b2d5c4c48f 9
pmr1 0:d6b2d5c4c48f 10 PMR 15/9/10 */
pmr1 0:d6b2d5c4c48f 11
pmr1 0:d6b2d5c4c48f 12 #include "mbed.h"
pmr1 0:d6b2d5c4c48f 13 #include "EthernetNetIf.h"
pmr1 0:d6b2d5c4c48f 14 #include "HTTPServer.h"
pmr1 0:d6b2d5c4c48f 15 #include "NTPClient.h"
pmr1 0:d6b2d5c4c48f 16 #include "SDFileSystem.h"
pmr1 0:d6b2d5c4c48f 17
pmr1 0:d6b2d5c4c48f 18
pmr1 0:d6b2d5c4c48f 19 DigitalOut led1(LED1, "led1");
pmr1 0:d6b2d5c4c48f 20 DigitalOut led2(LED2, "led2");
pmr1 0:d6b2d5c4c48f 21 DigitalOut led3(LED3, "led3");
pmr1 0:d6b2d5c4c48f 22 DigitalOut led4(LED4, "led4");
pmr1 0:d6b2d5c4c48f 23
pmr1 0:d6b2d5c4c48f 24 AnalogIn Voltmeter (p20);
pmr1 0:d6b2d5c4c48f 25
pmr1 0:d6b2d5c4c48f 26 //LocalFileSystem fs("webfs"); // this could be any name
pmr1 0:d6b2d5c4c48f 27
pmr1 0:d6b2d5c4c48f 28 SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sclk, cs, name
pmr1 0:d6b2d5c4c48f 29
pmr1 0:d6b2d5c4c48f 30 EthernetNetIf eth;
pmr1 0:d6b2d5c4c48f 31 HTTPServer svr;
pmr1 0:d6b2d5c4c48f 32 NTPClient ntp;
pmr1 0:d6b2d5c4c48f 33
pmr1 0:d6b2d5c4c48f 34 bool file_exists(const char * filename)
pmr1 0:d6b2d5c4c48f 35 {
pmr1 0:d6b2d5c4c48f 36 if (FILE * file = fopen(filename, "r"))
pmr1 0:d6b2d5c4c48f 37 {
pmr1 0:d6b2d5c4c48f 38 fclose(file);
pmr1 0:d6b2d5c4c48f 39 return true;
pmr1 0:d6b2d5c4c48f 40 }
pmr1 0:d6b2d5c4c48f 41 return false;
pmr1 0:d6b2d5c4c48f 42 }
pmr1 0:d6b2d5c4c48f 43
pmr1 0:d6b2d5c4c48f 44 void update_web(time_t ctTime , char *filename, char *filename2)
pmr1 0:d6b2d5c4c48f 45 {
pmr1 0:d6b2d5c4c48f 46 // updates the readings page, filename with new web file, filename2
pmr1 0:d6b2d5c4c48f 47 FILE *fp;
pmr1 0:d6b2d5c4c48f 48 char locTime[32];
pmr1 0:d6b2d5c4c48f 49 char *ftag;
pmr1 0:d6b2d5c4c48f 50 char tempfile[32];
pmr1 0:d6b2d5c4c48f 51 fp=NULL;
pmr1 0:d6b2d5c4c48f 52 strcpy (tempfile,filename2); // this prevents corruption of filenam2
pmr1 0:d6b2d5c4c48f 53 strtok(tempfile,"d/"); // strip off /sd/
pmr1 0:d6b2d5c4c48f 54 ftag=strtok(NULL,"\0");
pmr1 0:d6b2d5c4c48f 55 fp=fopen (filename, "a");
pmr1 0:d6b2d5c4c48f 56 if (fp !=NULL)
pmr1 0:d6b2d5c4c48f 57 {
pmr1 0:d6b2d5c4c48f 58 time_t seconds = time(NULL);
pmr1 0:d6b2d5c4c48f 59 strftime(locTime,32,"%d/%b/%Y %H:%M:%S",localtime(&seconds));
pmr1 0:d6b2d5c4c48f 60 fprintf(fp, "\n <a href="); fprintf(fp,"%s ",ftag); fprintf(fp," > readings at %s </a> </br>",locTime);
pmr1 0:d6b2d5c4c48f 61 fclose(fp);
pmr1 0:d6b2d5c4c48f 62 }
pmr1 0:d6b2d5c4c48f 63 }
pmr1 0:d6b2d5c4c48f 64
pmr1 0:d6b2d5c4c48f 65 char *update_file(char *filename)
pmr1 0:d6b2d5c4c48f 66
pmr1 0:d6b2d5c4c48f 67 {
pmr1 0:d6b2d5c4c48f 68 // check for previous and increnment file number if filename exists
pmr1 0:d6b2d5c4c48f 69 int n ;
pmr1 0:d6b2d5c4c48f 70 char *ftag;
pmr1 0:d6b2d5c4c48f 71 char *ext;
pmr1 0:d6b2d5c4c48f 72 char *fn;
pmr1 0:d6b2d5c4c48f 73 char filename2[32];
pmr1 0:d6b2d5c4c48f 74
pmr1 0:d6b2d5c4c48f 75
pmr1 0:d6b2d5c4c48f 76 // printf(" filename is now0 %s\n",filename);
pmr1 0:d6b2d5c4c48f 77 while (file_exists(filename))
pmr1 0:d6b2d5c4c48f 78 {
pmr1 0:d6b2d5c4c48f 79 //increment filename
pmr1 0:d6b2d5c4c48f 80 // strip off extension
pmr1 0:d6b2d5c4c48f 81 n = 0;
pmr1 0:d6b2d5c4c48f 82
pmr1 0:d6b2d5c4c48f 83 ext=strstr(filename,".");
pmr1 0:d6b2d5c4c48f 84 // strcpy(tmp,ext);
pmr1 0:d6b2d5c4c48f 85 // printf(" ext %s\n",ext);
pmr1 0:d6b2d5c4c48f 86
pmr1 0:d6b2d5c4c48f 87 strtok(filename,"d/");
pmr1 0:d6b2d5c4c48f 88 // extract text part of filename and moving pointer to extract the numerical part
pmr1 0:d6b2d5c4c48f 89 ftag=strtok(NULL,"0")+1; fn=strtok(NULL,"\0");
pmr1 0:d6b2d5c4c48f 90 // printf(" fname %s\n",ftag);
pmr1 0:d6b2d5c4c48f 91 //atoi ignores spaces but not characters
pmr1 0:d6b2d5c4c48f 92 n=atoi(fn);
pmr1 0:d6b2d5c4c48f 93 n=n+1;
pmr1 0:d6b2d5c4c48f 94 // printf("fn %i\n",n);
pmr1 0:d6b2d5c4c48f 95 // re-assemble filename
pmr1 0:d6b2d5c4c48f 96 strcpy(filename2,"/sd/"); strcpy(fn,"0");
pmr1 0:d6b2d5c4c48f 97 strcat(filename2,ftag); strcat(filename2,fn);
pmr1 0:d6b2d5c4c48f 98 // printf(" filename is now1 %s\n",filename2);
pmr1 0:d6b2d5c4c48f 99 strcpy(fn,"");
pmr1 0:d6b2d5c4c48f 100 sprintf(fn,"%d", n );
pmr1 0:d6b2d5c4c48f 101 strcat(filename2,fn); strcat(filename2,".htm");
pmr1 0:d6b2d5c4c48f 102 // printf(" filename is now2 %s\n",filename2);
pmr1 0:d6b2d5c4c48f 103 strcpy(filename,filename2);
pmr1 0:d6b2d5c4c48f 104 }
pmr1 0:d6b2d5c4c48f 105
pmr1 0:d6b2d5c4c48f 106 return(filename);
pmr1 0:d6b2d5c4c48f 107 }
pmr1 0:d6b2d5c4c48f 108
pmr1 0:d6b2d5c4c48f 109 void createVolts(time_t ctTime, char *filename)
pmr1 0:d6b2d5c4c48f 110 {
pmr1 0:d6b2d5c4c48f 111
pmr1 0:d6b2d5c4c48f 112 FILE *fp = fopen(filename, "a"); // Open local filename
pmr1 0:d6b2d5c4c48f 113 // it ignores path and date defaults 1/1/2008 becausse RTC not set
pmr1 0:d6b2d5c4c48f 114 // if I call ithe localfilesystem www rather than 'local' it writes and is seen when drive is refreshed
pmr1 0:d6b2d5c4c48f 115
pmr1 0:d6b2d5c4c48f 116 fprintf(fp, "<title> Volt meter test page </title>\n");
pmr1 0:d6b2d5c4c48f 117 fprintf(fp,"<h1>Volts of the day from port 1</h1>");
pmr1 0:d6b2d5c4c48f 118 fprintf(fp," Voc, Vld, time </br>");
pmr1 0:d6b2d5c4c48f 119 // fprintf(fp, "volts %f V at %s </br>",Voltmeter.read(), ctime(&ctTime));
pmr1 0:d6b2d5c4c48f 120 fclose(fp);
pmr1 0:d6b2d5c4c48f 121
pmr1 0:d6b2d5c4c48f 122 }
pmr1 0:d6b2d5c4c48f 123
pmr1 0:d6b2d5c4c48f 124 int updateVolts (time_t ctTime , char *filename)
pmr1 0:d6b2d5c4c48f 125 {
pmr1 0:d6b2d5c4c48f 126 FILE *fp;
pmr1 0:d6b2d5c4c48f 127 int ckc,i;
pmr1 0:d6b2d5c4c48f 128 int avg=10;
pmr1 0:d6b2d5c4c48f 129 float volts;
pmr1 0:d6b2d5c4c48f 130 char locTime[32];
pmr1 0:d6b2d5c4c48f 131 // check not been displayed
pmr1 0:d6b2d5c4c48f 132 fp=NULL; ckc =0;
pmr1 0:d6b2d5c4c48f 133 DigitalOut loadSwitch(p21);
pmr1 0:d6b2d5c4c48f 134 Timer tm;
pmr1 0:d6b2d5c4c48f 135 loadSwitch=0; // load off
pmr1 0:d6b2d5c4c48f 136 while ( (fp== NULL) && (ckc++ < 20))
pmr1 0:d6b2d5c4c48f 137 {
pmr1 0:d6b2d5c4c48f 138 fp=fopen (filename, "a");
pmr1 0:d6b2d5c4c48f 139 }
pmr1 0:d6b2d5c4c48f 140 if (ckc >19)
pmr1 0:d6b2d5c4c48f 141 {
pmr1 0:d6b2d5c4c48f 142 return(1); // if access prevented
pmr1 0:d6b2d5c4c48f 143 }
pmr1 0:d6b2d5c4c48f 144 else
pmr1 0:d6b2d5c4c48f 145 {
pmr1 0:d6b2d5c4c48f 146 time_t seconds = time(NULL);
pmr1 0:d6b2d5c4c48f 147 strftime(locTime,32,"%d-%b-%y %H:%M:%S",localtime(&seconds));
pmr1 0:d6b2d5c4c48f 148 // output in form of excel .csv
pmr1 0:d6b2d5c4c48f 149 // oc voltage
pmr1 0:d6b2d5c4c48f 150 volts=0;
pmr1 0:d6b2d5c4c48f 151 for(i=0; i < avg ; i++) volts= Voltmeter.read();
pmr1 0:d6b2d5c4c48f 152 volts = volts /avg;
pmr1 0:d6b2d5c4c48f 153 fprintf(fp, "%f,",volts);
pmr1 0:d6b2d5c4c48f 154 // loaded voltage
pmr1 0:d6b2d5c4c48f 155 tm.start();
pmr1 0:d6b2d5c4c48f 156 loadSwitch =1;
pmr1 0:d6b2d5c4c48f 157 // after 1 second read the loaded voltage
pmr1 0:d6b2d5c4c48f 158 volts=0;
pmr1 0:d6b2d5c4c48f 159 while ( tm.read() < 1.0);
pmr1 0:d6b2d5c4c48f 160 for(i=0; i < avg; i++) volts= Voltmeter.read();
pmr1 0:d6b2d5c4c48f 161 volts = volts /avg;
pmr1 0:d6b2d5c4c48f 162 fprintf(fp, "%f,%s </br>" ,volts,locTime);
pmr1 0:d6b2d5c4c48f 163 loadSwitch=0;
pmr1 0:d6b2d5c4c48f 164 fclose(fp);
pmr1 0:d6b2d5c4c48f 165 return(0);
pmr1 0:d6b2d5c4c48f 166 }
pmr1 0:d6b2d5c4c48f 167
pmr1 0:d6b2d5c4c48f 168 }
pmr1 0:d6b2d5c4c48f 169
pmr1 0:d6b2d5c4c48f 170
pmr1 0:d6b2d5c4c48f 171 long int loadTime(void)
pmr1 0:d6b2d5c4c48f 172 {
pmr1 0:d6b2d5c4c48f 173 time_t ctTime;
pmr1 0:d6b2d5c4c48f 174 ctTime = time(NULL);
pmr1 0:d6b2d5c4c48f 175 char locTime[32];
pmr1 0:d6b2d5c4c48f 176 // printf("Current time is (UTC): %s\n\r", ctime(&ctTime));
pmr1 0:d6b2d5c4c48f 177
pmr1 0:d6b2d5c4c48f 178 Host server(IpAddr(), 123, "0.uk.pool.ntp.org");
pmr1 0:d6b2d5c4c48f 179 ntp.setTime(server);
pmr1 0:d6b2d5c4c48f 180
pmr1 0:d6b2d5c4c48f 181 ctTime = time(NULL);
pmr1 0:d6b2d5c4c48f 182 set_time (ctTime); // sets local rtc
pmr1 0:d6b2d5c4c48f 183 time_t seconds = time(NULL);
pmr1 0:d6b2d5c4c48f 184 strftime(locTime,32, "%I:%M %p\r\n",localtime(&seconds));
pmr1 0:d6b2d5c4c48f 185 printf("RTC Time is now (UTC): %s\n\r",locTime );
pmr1 0:d6b2d5c4c48f 186 return (ctTime);
pmr1 0:d6b2d5c4c48f 187 }
pmr1 0:d6b2d5c4c48f 188
pmr1 0:d6b2d5c4c48f 189
pmr1 0:d6b2d5c4c48f 190 int main() {
pmr1 0:d6b2d5c4c48f 191
pmr1 0:d6b2d5c4c48f 192 time_t systemTime;
pmr1 0:d6b2d5c4c48f 193 Base::add_rpc_class<DigitalOut>();
pmr1 0:d6b2d5c4c48f 194 char fname[32];
pmr1 0:d6b2d5c4c48f 195 char *fn;
pmr1 0:d6b2d5c4c48f 196 int readings =0;
pmr1 0:d6b2d5c4c48f 197 const int readingsPerPage = 50;
pmr1 0:d6b2d5c4c48f 198 long int now_sec,last_time;
pmr1 0:d6b2d5c4c48f 199 const long int interval = 30; // seconds
pmr1 0:d6b2d5c4c48f 200
pmr1 0:d6b2d5c4c48f 201
pmr1 0:d6b2d5c4c48f 202 printf("Setting up...\n");
pmr1 0:d6b2d5c4c48f 203 EthernetErr ethErr = eth.setup();
pmr1 0:d6b2d5c4c48f 204 if(ethErr)
pmr1 0:d6b2d5c4c48f 205 {
pmr1 0:d6b2d5c4c48f 206 printf("Error %d in setup.\n", ethErr);
pmr1 0:d6b2d5c4c48f 207 return -1;
pmr1 0:d6b2d5c4c48f 208 }
pmr1 0:d6b2d5c4c48f 209 printf("Setup OK\n");
pmr1 0:d6b2d5c4c48f 210
pmr1 0:d6b2d5c4c48f 211 // FSHandler::mount("/webfs", "/files"); //Mount /wwww path on /files web path - this has no meaning
pmr1 0:d6b2d5c4c48f 212 FSHandler::mount("/sd", "/"); //Mount /wwww path on web root path
pmr1 0:d6b2d5c4c48f 213
pmr1 0:d6b2d5c4c48f 214
pmr1 0:d6b2d5c4c48f 215 // svr.addHandler<SimpleHandler>("/"); hard code for Hello world
pmr1 0:d6b2d5c4c48f 216
pmr1 0:d6b2d5c4c48f 217
pmr1 0:d6b2d5c4c48f 218 systemTime=loadTime();
pmr1 0:d6b2d5c4c48f 219
pmr1 0:d6b2d5c4c48f 220 printf("System is now (UTC): %s\n\r", ctime(&systemTime));
pmr1 0:d6b2d5c4c48f 221 Timer tm;
pmr1 0:d6b2d5c4c48f 222 tm.start();
pmr1 0:d6b2d5c4c48f 223
pmr1 0:d6b2d5c4c48f 224
pmr1 0:d6b2d5c4c48f 225 svr.addHandler<RPCHandler>("/rpc"); // sets up the remote procedure call handler
pmr1 0:d6b2d5c4c48f 226 svr.addHandler<FSHandler>("/files");// this does not see the subdirectory
pmr1 0:d6b2d5c4c48f 227 svr.addHandler<FSHandler>("/"); //Default handler
pmr1 0:d6b2d5c4c48f 228 svr.bind(80);
pmr1 0:d6b2d5c4c48f 229 // assemble file name
pmr1 0:d6b2d5c4c48f 230 // examples sprintf(ts_adj, "%02d", Hours); // %02d includes leading zero
pmr1 0:d6b2d5c4c48f 231 // strncat(ts,ts_adj,2);
pmr1 0:d6b2d5c4c48f 232 //Listen indefinitely
pmr1 0:d6b2d5c4c48f 233 printf("Listening...\n\r");
pmr1 0:d6b2d5c4c48f 234
pmr1 0:d6b2d5c4c48f 235
pmr1 0:d6b2d5c4c48f 236 strcpy(fname,"/sd/volts00.htm");
pmr1 0:d6b2d5c4c48f 237 fn = update_file(fname); // preserve previous data
pmr1 0:d6b2d5c4c48f 238 strcpy(fname,fn);
pmr1 0:d6b2d5c4c48f 239 createVolts(systemTime,fname);
pmr1 0:d6b2d5c4c48f 240 printf(" updated file %s\n\r",fname);
pmr1 0:d6b2d5c4c48f 241 update_web(systemTime,"/sd/readings.htm",fname); // log reading file
pmr1 0:d6b2d5c4c48f 242 readings =0;
pmr1 0:d6b2d5c4c48f 243 while (true)
pmr1 0:d6b2d5c4c48f 244 {
pmr1 0:d6b2d5c4c48f 245
pmr1 0:d6b2d5c4c48f 246 last_time=0; // seconds
pmr1 0:d6b2d5c4c48f 247
pmr1 0:d6b2d5c4c48f 248 while(readings < readingsPerPage )
pmr1 0:d6b2d5c4c48f 249 {
pmr1 0:d6b2d5c4c48f 250 Net::poll();
pmr1 0:d6b2d5c4c48f 251 systemTime=time(NULL);
pmr1 0:d6b2d5c4c48f 252 time_t seconds =time(NULL);
pmr1 0:d6b2d5c4c48f 253 now_sec = seconds;
pmr1 0:d6b2d5c4c48f 254 if(tm.read()>0.5)
pmr1 0:d6b2d5c4c48f 255 {
pmr1 0:d6b2d5c4c48f 256 led1=!led1; //Show that we are alive
pmr1 0:d6b2d5c4c48f 257 tm.start();
pmr1 0:d6b2d5c4c48f 258
pmr1 0:d6b2d5c4c48f 259 }
pmr1 0:d6b2d5c4c48f 260 if (now_sec > (last_time + interval))
pmr1 0:d6b2d5c4c48f 261 {
pmr1 0:d6b2d5c4c48f 262 if (updateVolts(systemTime,fname)) printf(" %s not updated \n\r", fname);
pmr1 0:d6b2d5c4c48f 263 else printf(" reading %i\n\r",readings);
pmr1 0:d6b2d5c4c48f 264 last_time=now_sec;
pmr1 0:d6b2d5c4c48f 265 readings++;
pmr1 0:d6b2d5c4c48f 266
pmr1 0:d6b2d5c4c48f 267 }
pmr1 0:d6b2d5c4c48f 268 }
pmr1 0:d6b2d5c4c48f 269 fn = update_file(fname);
pmr1 0:d6b2d5c4c48f 270 strcpy(fname,fn);
pmr1 0:d6b2d5c4c48f 271 createVolts(systemTime,fname);
pmr1 0:d6b2d5c4c48f 272 printf(" updated file %s\n\r",fname);
pmr1 0:d6b2d5c4c48f 273 update_web(systemTime,"/sd/readings.htm",fname);
pmr1 0:d6b2d5c4c48f 274 readings=0;
pmr1 0:d6b2d5c4c48f 275 }
pmr1 0:d6b2d5c4c48f 276 return 0;
pmr1 0:d6b2d5c4c48f 277
pmr1 0:d6b2d5c4c48f 278 }