Dirty little program to grab analog sensor data, apply a 3-tap median filter, and log it to a local flash file.
main.cpp@0:b7581833f14a, 2010-01-04 (annotated)
- Committer:
- leimgrub
- Date:
- Mon Jan 04 17:34:17 2010 +0000
- Revision:
- 0:b7581833f14a
Who changed what in which revision?
User | Revision | Line number | New 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 | } |