Dirty little program to grab analog sensor data, apply a 3-tap median filter, and log it to a local flash file.

Dependencies:   mbed

Committer:
leimgrub
Date:
Mon Jan 04 17:34:17 2010 +0000
Revision:
0:b7581833f14a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leimgrub 0:b7581833f14a 1 #include "mbed.h"
leimgrub 0:b7581833f14a 2
leimgrub 0:b7581833f14a 3 /***************************
leimgrub 0:b7581833f14a 4 * John W. Leimgruber III
leimgrub 0:b7581833f14a 5 * Test Application
leimgrub 0:b7581833f14a 6 * 1. Read analog value from LM34 temperature sensor and convert to deg Fahrenheit
leimgrub 0:b7581833f14a 7 * 2. Filter using 3-tap median sampling every 1/3 second
leimgrub 0:b7581833f14a 8 * 3. Append to local flash filesystem log file every 512 seconds
leimgrub 0:b7581833f14a 9 * 4. Externally, use a python program I wrote based on matplotlib to grab and parse updated log file then display graphical plot
leimgrub 0:b7581833f14a 10 *****************************/
leimgrub 0:b7581833f14a 11
leimgrub 0:b7581833f14a 12 DigitalOut myled(LED1); // sanity test light
leimgrub 0:b7581833f14a 13 Serial pc(USBTX, USBRX); // beautiful debugging tx, rx to Linux and Minicom @ /dev/ttyACM0 9600 8N1
leimgrub 0:b7581833f14a 14 AnalogIn temp(p15); // analog temperature sensor, LM34, reads +5 to +300 degF @ 10mv per deg and takes 5-30v Vin...
leimgrub 0:b7581833f14a 15
leimgrub 0:b7581833f14a 16 LocalFileSystem local("local"); // setup local filesystem on the ~2mb internal flash
leimgrub 0:b7581833f14a 17 Timer timer; // timer to generate delays, as I'm newbish and don't know about wait
leimgrub 0:b7581833f14a 18
leimgrub 0:b7581833f14a 19 int main()
leimgrub 0:b7581833f14a 20 {
leimgrub 0:b7581833f14a 21 printf("Starting to read and log temperature data to local flash disk.\r\n");
leimgrub 0:b7581833f14a 22 char *tempData, filter[3];
leimgrub 0:b7581833f14a 23 unsigned int dataCount, filterCount;
leimgrub 0:b7581833f14a 24 FILE *fp = 0;
leimgrub 0:b7581833f14a 25 dataCount = 0;
leimgrub 0:b7581833f14a 26 filterCount = 0;
leimgrub 0:b7581833f14a 27 memset(filter, 3, 0x00);
leimgrub 0:b7581833f14a 28
leimgrub 0:b7581833f14a 29 // allocate 512 bytes of memory to store 512 seconds worth of temperature values at one per second stored in deg F [0,255]
leimgrub 0:b7581833f14a 30 tempData=(char *) malloc(512);
leimgrub 0:b7581833f14a 31 if (!tempData)
leimgrub 0:b7581833f14a 32 {
leimgrub 0:b7581833f14a 33 fprintf(stderr, "Not enough memory to allocate 512 bytes for temperature data\n");
leimgrub 0:b7581833f14a 34 exit(1);
leimgrub 0:b7581833f14a 35 }
leimgrub 0:b7581833f14a 36
leimgrub 0:b7581833f14a 37 timer.reset();
leimgrub 0:b7581833f14a 38 timer.start();
leimgrub 0:b7581833f14a 39 while(1)
leimgrub 0:b7581833f14a 40 {
leimgrub 0:b7581833f14a 41 //grab a temp reading ever second and convert to 0-255 in deg F
leimgrub 0:b7581833f14a 42 if(timer.read() > 0.333)
leimgrub 0:b7581833f14a 43 { // implement 3 tap median filter and oversample by 3x
leimgrub 0:b7581833f14a 44 filter[0] = filter[1];
leimgrub 0:b7581833f14a 45 filter[1] = filter[2];
leimgrub 0:b7581833f14a 46 filter[2] = (char) (temp.read() * 330.0 - 5.0);
leimgrub 0:b7581833f14a 47 filterCount++;
leimgrub 0:b7581833f14a 48
leimgrub 0:b7581833f14a 49 if(filterCount >= 3)
leimgrub 0:b7581833f14a 50 {
leimgrub 0:b7581833f14a 51 filterCount = 0;
leimgrub 0:b7581833f14a 52 if(filter[0] >= filter[1] && filter[0] <= filter[2] ||
leimgrub 0:b7581833f14a 53 filter[0] <= filter[1] && filter[0] >= filter[2])
leimgrub 0:b7581833f14a 54 {
leimgrub 0:b7581833f14a 55 tempData[dataCount] = filter[0];
leimgrub 0:b7581833f14a 56 }
leimgrub 0:b7581833f14a 57 else if(filter[1] >= filter[0] && filter[1] <= filter[2] ||
leimgrub 0:b7581833f14a 58 filter[1] <= filter[0] && filter[1] >= filter[2])
leimgrub 0:b7581833f14a 59 {
leimgrub 0:b7581833f14a 60 tempData[dataCount] = filter[1];
leimgrub 0:b7581833f14a 61 }
leimgrub 0:b7581833f14a 62 else
leimgrub 0:b7581833f14a 63 {
leimgrub 0:b7581833f14a 64 tempData[dataCount] = filter[2];
leimgrub 0:b7581833f14a 65 }
leimgrub 0:b7581833f14a 66 // in case you want to grab some 'real-time' temp data and debugging...
leimgrub 0:b7581833f14a 67 printf("Temperature [%d] = %d deg F\r\n",dataCount, tempData[dataCount]);
leimgrub 0:b7581833f14a 68 dataCount++;
leimgrub 0:b7581833f14a 69 }
leimgrub 0:b7581833f14a 70 timer.reset();
leimgrub 0:b7581833f14a 71 }
leimgrub 0:b7581833f14a 72
leimgrub 0:b7581833f14a 73 // now that we've grabbed a full page of data, dump it do disk then start over...
leimgrub 0:b7581833f14a 74 if(dataCount >= 512)
leimgrub 0:b7581833f14a 75 {
leimgrub 0:b7581833f14a 76 myled = 1;
leimgrub 0:b7581833f14a 77 fp = fopen("/local/templog.dat", "ab");
leimgrub 0:b7581833f14a 78 if(!fp)
leimgrub 0:b7581833f14a 79 {
leimgrub 0:b7581833f14a 80 printf("File /local/templog.dat could not be opened for append binary writing!\r\n");
leimgrub 0:b7581833f14a 81 exit(1);
leimgrub 0:b7581833f14a 82 }
leimgrub 0:b7581833f14a 83 printf("Writing %d bytes to internal flash!\r\n", dataCount); // should always be 512 bytes? (maybe should keep writing until 512 hit... meh)
leimgrub 0:b7581833f14a 84 printf("Actually wrote %d bytes...\r\n", fwrite(tempData,1,dataCount,fp)); //memory array, sizeof(char), 512 bytes, file pointer
leimgrub 0:b7581833f14a 85 fclose(fp);
leimgrub 0:b7581833f14a 86 dataCount = 0;
leimgrub 0:b7581833f14a 87 myled = 0;
leimgrub 0:b7581833f14a 88 }
leimgrub 0:b7581833f14a 89 }
leimgrub 0:b7581833f14a 90 }