Test program that talkes to a I2C Microchip MCP9801 and logs results to USB serial and to mbeb local file system
main.cpp@0:d40fd50424e3, 2010-10-13 (annotated)
- Committer:
- monpjc
- Date:
- Wed Oct 13 09:37:50 2010 +0000
- Revision:
- 0:d40fd50424e3
V0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
monpjc | 0:d40fd50424e3 | 1 | |
monpjc | 0:d40fd50424e3 | 2 | // Read from I2C slave at address 0x62 |
monpjc | 0:d40fd50424e3 | 3 | |
monpjc | 0:d40fd50424e3 | 4 | #include "mbed.h" |
monpjc | 0:d40fd50424e3 | 5 | |
monpjc | 0:d40fd50424e3 | 6 | I2C i2c(p28, p27); |
monpjc | 0:d40fd50424e3 | 7 | Serial pc(USBTX, USBRX); |
monpjc | 0:d40fd50424e3 | 8 | DigitalOut myled(LED2); |
monpjc | 0:d40fd50424e3 | 9 | LocalFileSystem local("local"); // Create the local filesystem under the name "local" |
monpjc | 0:d40fd50424e3 | 10 | |
monpjc | 0:d40fd50424e3 | 11 | |
monpjc | 0:d40fd50424e3 | 12 | int main() |
monpjc | 0:d40fd50424e3 | 13 | { |
monpjc | 0:d40fd50424e3 | 14 | unsigned int loop = 1; |
monpjc | 0:d40fd50424e3 | 15 | unsigned loopCount = 1; |
monpjc | 0:d40fd50424e3 | 16 | int address = 0x90; |
monpjc | 0:d40fd50424e3 | 17 | char RXdata[2]; |
monpjc | 0:d40fd50424e3 | 18 | char TXdata[2]; |
monpjc | 0:d40fd50424e3 | 19 | float temperature = 0; |
monpjc | 0:d40fd50424e3 | 20 | time_t seconds = 0; |
monpjc | 0:d40fd50424e3 | 21 | |
monpjc | 0:d40fd50424e3 | 22 | //Hello splash screen |
monpjc | 0:d40fd50424e3 | 23 | printf("\r\n\nmbeb Temperature logger V0.1\r\nBy Paul J clarke MIET\r\n13th Oct 2010\r\n\n"); |
monpjc | 0:d40fd50424e3 | 24 | |
monpjc | 0:d40fd50424e3 | 25 | //clear serial buffer |
monpjc | 0:d40fd50424e3 | 26 | while( pc.readable() ); |
monpjc | 0:d40fd50424e3 | 27 | |
monpjc | 0:d40fd50424e3 | 28 | //Configure sensor at 0.0625'C steps |
monpjc | 0:d40fd50424e3 | 29 | TXdata[0] = 0x01; |
monpjc | 0:d40fd50424e3 | 30 | TXdata[1] = 0x60; |
monpjc | 0:d40fd50424e3 | 31 | i2c.write(address, TXdata, 2); |
monpjc | 0:d40fd50424e3 | 32 | //Set dat for reading temperature |
monpjc | 0:d40fd50424e3 | 33 | TXdata[0] = 0x00; |
monpjc | 0:d40fd50424e3 | 34 | myled = 0; |
monpjc | 0:d40fd50424e3 | 35 | |
monpjc | 0:d40fd50424e3 | 36 | // Opens the root directory of the local file system |
monpjc | 0:d40fd50424e3 | 37 | printf("Files on mbed\r\n"); |
monpjc | 0:d40fd50424e3 | 38 | DIR *d = opendir("/local"); |
monpjc | 0:d40fd50424e3 | 39 | struct dirent *p; |
monpjc | 0:d40fd50424e3 | 40 | while((p = readdir(d)) != NULL) |
monpjc | 0:d40fd50424e3 | 41 | { // Print the names of the files in the local file system |
monpjc | 0:d40fd50424e3 | 42 | printf("%s\n\r", p->d_name); // to stdout (USB Serial). |
monpjc | 0:d40fd50424e3 | 43 | } |
monpjc | 0:d40fd50424e3 | 44 | closedir(d); |
monpjc | 0:d40fd50424e3 | 45 | printf("\n"); |
monpjc | 0:d40fd50424e3 | 46 | |
monpjc | 0:d40fd50424e3 | 47 | // Removes the file "out.txt" from the local file system |
monpjc | 0:d40fd50424e3 | 48 | remove("/local/log.csv"); |
monpjc | 0:d40fd50424e3 | 49 | // Open "log.csv" on the local file system for writing |
monpjc | 0:d40fd50424e3 | 50 | FILE *fp = fopen("/local/log.csv", "w"); |
monpjc | 0:d40fd50424e3 | 51 | |
monpjc | 0:d40fd50424e3 | 52 | //reset time to zero |
monpjc | 0:d40fd50424e3 | 53 | set_time(0); |
monpjc | 0:d40fd50424e3 | 54 | |
monpjc | 0:d40fd50424e3 | 55 | //Send headers to csv file |
monpjc | 0:d40fd50424e3 | 56 | fprintf(fp, "Time_Seconds,Temperature_C\r"); |
monpjc | 0:d40fd50424e3 | 57 | |
monpjc | 0:d40fd50424e3 | 58 | //main loop |
monpjc | 0:d40fd50424e3 | 59 | while(loop) |
monpjc | 0:d40fd50424e3 | 60 | { |
monpjc | 0:d40fd50424e3 | 61 | //toggle LED to show we are running |
monpjc | 0:d40fd50424e3 | 62 | myled = !myled; |
monpjc | 0:d40fd50424e3 | 63 | //set I2C device to point at temperature registor |
monpjc | 0:d40fd50424e3 | 64 | i2c.write(address, TXdata, 1); |
monpjc | 0:d40fd50424e3 | 65 | //read two bytes of raw data back |
monpjc | 0:d40fd50424e3 | 66 | i2c.read(address, RXdata, 2); |
monpjc | 0:d40fd50424e3 | 67 | //generate floating point number from raw data recived |
monpjc | 0:d40fd50424e3 | 68 | temperature = (((float)RXdata[1]) / 256) + RXdata[0]; |
monpjc | 0:d40fd50424e3 | 69 | //stream temperature to USB serial port |
monpjc | 0:d40fd50424e3 | 70 | printf("Temperature = %.4f'C Data Point = %d \r", temperature, loopCount); |
monpjc | 0:d40fd50424e3 | 71 | //get time in seconds |
monpjc | 0:d40fd50424e3 | 72 | seconds = time(NULL); |
monpjc | 0:d40fd50424e3 | 73 | //and save to log file |
monpjc | 0:d40fd50424e3 | 74 | fprintf(fp, "%d,%.4f\n", seconds, temperature); |
monpjc | 0:d40fd50424e3 | 75 | //wait 250ms - time for ADC in temp sensor to re calculate new value |
monpjc | 0:d40fd50424e3 | 76 | wait(1); |
monpjc | 0:d40fd50424e3 | 77 | |
monpjc | 0:d40fd50424e3 | 78 | //inc loop counter |
monpjc | 0:d40fd50424e3 | 79 | loopCount++; |
monpjc | 0:d40fd50424e3 | 80 | |
monpjc | 0:d40fd50424e3 | 81 | if( pc.readable() || loopCount==1200 ) //1200 = 5 min's of loggin time |
monpjc | 0:d40fd50424e3 | 82 | { |
monpjc | 0:d40fd50424e3 | 83 | loop = 0; |
monpjc | 0:d40fd50424e3 | 84 | } |
monpjc | 0:d40fd50424e3 | 85 | } |
monpjc | 0:d40fd50424e3 | 86 | printf("\r\n\n Finished...\r\nTotal data points = %d\r\n", (loopCount-1)); |
monpjc | 0:d40fd50424e3 | 87 | fclose(fp); |
monpjc | 0:d40fd50424e3 | 88 | |
monpjc | 0:d40fd50424e3 | 89 | while(1); //HALT |
monpjc | 0:d40fd50424e3 | 90 | |
monpjc | 0:d40fd50424e3 | 91 | } |