![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Data logger program, using threads for individual components
Dependencies: C12832 mbed-os LM75B
main.cpp@0:5ee010a27b27, 2020-12-05 (annotated)
- Committer:
- saltire78
- Date:
- Sat Dec 05 16:40:22 2020 +0000
- Revision:
- 0:5ee010a27b27
.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
saltire78 | 0:5ee010a27b27 | 1 | #include "mbed.h" // mbed header |
saltire78 | 0:5ee010a27b27 | 2 | #include "LM75B.h" // temp sensor header |
saltire78 | 0:5ee010a27b27 | 3 | #include "C12832.h" // lcd screen header |
saltire78 | 0:5ee010a27b27 | 4 | |
saltire78 | 0:5ee010a27b27 | 5 | C12832 lcd(p5, p7, p6, p8, p11); // define lcd |
saltire78 | 0:5ee010a27b27 | 6 | LM75B sensor(p28,p27); // define tem sensor |
saltire78 | 0:5ee010a27b27 | 7 | Serial pc(USBTX,USBRX); // define serial port |
saltire78 | 0:5ee010a27b27 | 8 | LocalFileSystem local("local"); // create local file system location |
saltire78 | 0:5ee010a27b27 | 9 | |
saltire78 | 0:5ee010a27b27 | 10 | int seconds = 60; // define timespan variable |
saltire78 | 0:5ee010a27b27 | 11 | int i=0; // define iteration variable |
saltire78 | 0:5ee010a27b27 | 12 | float accum = 0.0; // define temporary accumulator float |
saltire78 | 0:5ee010a27b27 | 13 | int timeDelay = 5; // define sample time range |
saltire78 | 0:5ee010a27b27 | 14 | |
saltire78 | 0:5ee010a27b27 | 15 | Thread thread1, thread2, thread3; |
saltire78 | 0:5ee010a27b27 | 16 | |
saltire78 | 0:5ee010a27b27 | 17 | void LM758_ok() |
saltire78 | 0:5ee010a27b27 | 18 | { |
saltire78 | 0:5ee010a27b27 | 19 | while (1){ |
saltire78 | 0:5ee010a27b27 | 20 | if (sensor.open()) { // test if temp sensor functioning (quickly eliminated if functional) |
saltire78 | 0:5ee010a27b27 | 21 | lcd.printf("Device detected!\n"); |
saltire78 | 0:5ee010a27b27 | 22 | } |
saltire78 | 0:5ee010a27b27 | 23 | else { // if temp sensor not functioning throw an error |
saltire78 | 0:5ee010a27b27 | 24 | error("Device not detected!\n"); |
saltire78 | 0:5ee010a27b27 | 25 | } |
saltire78 | 0:5ee010a27b27 | 26 | |
saltire78 | 0:5ee010a27b27 | 27 | ThisThread::sleep_for(2000); |
saltire78 | 0:5ee010a27b27 | 28 | |
saltire78 | 0:5ee010a27b27 | 29 | } |
saltire78 | 0:5ee010a27b27 | 30 | } |
saltire78 | 0:5ee010a27b27 | 31 | |
saltire78 | 0:5ee010a27b27 | 32 | void display_data() |
saltire78 | 0:5ee010a27b27 | 33 | { |
saltire78 | 0:5ee010a27b27 | 34 | while(1){ |
saltire78 | 0:5ee010a27b27 | 35 | lcd.cls(); // clear lcd screen |
saltire78 | 0:5ee010a27b27 | 36 | lcd.locate(0,0); // create lcd home location |
saltire78 | 0:5ee010a27b27 | 37 | lcd.printf("Temp = %.3f\n\r", (float)sensor.temp()); // print sensor reading to lcd |
saltire78 | 0:5ee010a27b27 | 38 | pc.printf("Temp = %.3f degrees C\n\r", (float)sensor.temp()); // print sensor reading to pc |
saltire78 | 0:5ee010a27b27 | 39 | |
saltire78 | 0:5ee010a27b27 | 40 | float value = (float)sensor.temp(); // store sensor reading as usable variable |
saltire78 | 0:5ee010a27b27 | 41 | accum = accum + value; // begin accumulating sum of values detected |
saltire78 | 0:5ee010a27b27 | 42 | i = i+1; |
saltire78 | 0:5ee010a27b27 | 43 | |
saltire78 | 0:5ee010a27b27 | 44 | ThisThread::sleep_for(5000); |
saltire78 | 0:5ee010a27b27 | 45 | |
saltire78 | 0:5ee010a27b27 | 46 | } |
saltire78 | 0:5ee010a27b27 | 47 | } |
saltire78 | 0:5ee010a27b27 | 48 | |
saltire78 | 0:5ee010a27b27 | 49 | void log_data() |
saltire78 | 0:5ee010a27b27 | 50 | { |
saltire78 | 0:5ee010a27b27 | 51 | // This logging component still doesn't work, same as lab4 |
saltire78 | 0:5ee010a27b27 | 52 | while(1){ |
saltire78 | 0:5ee010a27b27 | 53 | if (i==(seconds/timeDelay)) { // define max number of iterations allowed |
saltire78 | 0:5ee010a27b27 | 54 | float avgTemp = accum/i; // create an average value for the sensor readings |
saltire78 | 0:5ee010a27b27 | 55 | pc.printf("Average Temp for last %d seconds = %.3f degrees C\n\r", seconds, avgTemp); // print text of average temp reading to the pc |
saltire78 | 0:5ee010a27b27 | 56 | |
saltire78 | 0:5ee010a27b27 | 57 | // attempt to record an average temperature over a defined period to local memory - in this case every minute. |
saltire78 | 0:5ee010a27b27 | 58 | lcd.printf("Data logging\n\r"); |
saltire78 | 0:5ee010a27b27 | 59 | FILE *fp = fopen("/local/avgTemp.txt", "a"); // direct to txt file in local memory |
saltire78 | 0:5ee010a27b27 | 60 | fprintf(fp,"%.5f\n", avgTemp); // write average temp to local flash |
saltire78 | 0:5ee010a27b27 | 61 | fclose(fp); // close the file |
saltire78 | 0:5ee010a27b27 | 62 | ThisThread::sleep_for(6000); |
saltire78 | 0:5ee010a27b27 | 63 | // |
saltire78 | 0:5ee010a27b27 | 64 | } |
saltire78 | 0:5ee010a27b27 | 65 | |
saltire78 | 0:5ee010a27b27 | 66 | } |
saltire78 | 0:5ee010a27b27 | 67 | } |
saltire78 | 0:5ee010a27b27 | 68 | |
saltire78 | 0:5ee010a27b27 | 69 | |
saltire78 | 0:5ee010a27b27 | 70 | int main() // start main program |
saltire78 | 0:5ee010a27b27 | 71 | { |
saltire78 | 0:5ee010a27b27 | 72 | |
saltire78 | 0:5ee010a27b27 | 73 | while (1) { // constant loop |
saltire78 | 0:5ee010a27b27 | 74 | thread1.start(LM758_ok); |
saltire78 | 0:5ee010a27b27 | 75 | thread2.start(display_data); |
saltire78 | 0:5ee010a27b27 | 76 | // thread3.start(log_data); |
saltire78 | 0:5ee010a27b27 | 77 | |
saltire78 | 0:5ee010a27b27 | 78 | // wait(timeDelay); // wait for desired time between readings |
saltire78 | 0:5ee010a27b27 | 79 | } |
saltire78 | 0:5ee010a27b27 | 80 | } |