This program is an advanced "IoT" thermometer using LM75B component library. It displays the current value to the Serial host in Celcius or Fahrenheit (possible to change using a switch). It also stores an historic and displays it to the user using the LCD screen. Moreover, you can change the orientation of the screen by turning the device, just like a smartphone.
Dependencies: C12832 FXOS8700CQ LM75B mbed
main.cpp
- Committer:
- co838_gtvl2
- Date:
- 2016-02-12
- Revision:
- 5:c5d7fca4d111
- Parent:
- 4:5bf99eb2d740
- Child:
- 6:6c61186c8739
File content as of revision 5:c5d7fca4d111:
/** * This program is an advanced "IoT" thermometer using LM75B component library. * It displays the current value to the Serial host in Celcius or Fahrenheit (possible to change using a switch or computer's 'c' and 'f'). * It also stores an historic and displays it to the user using the LCD screen. * Moreover, you can change the orientation of the screen by turning the device (just like a smartphone) * * Created by Guillaume Lefrant gtvl2 **/ #include "main.h" #include "ThermalDisplayer.h" Serial host(USBTX, USBRX); // Serial Host LM75B lm_temp(D14, D15); // Thermal Sensor InterruptIn sw2_int(SW2); // SW2 DigitalOut tilt_led(LED1); // Red LED DigitalOut r_led(PTA2); // RGB LED DigitalOut g_led(PTC4); DigitalOut b_led(PTC12); AnalogIn pot(A0); // Potentiometer POT1 Ticker rgb_tick; // Ticker for RGB LED control volatile bool celcius = true; // Global boolean for unit Celcius / Fahrenheit /* * RGB LED control */ void rgb_handler(void) { if (celcius) { r_led = 1.0; g_led = 1.0; b_led = 0.0; } else { r_led = 0.0; g_led = 1.0; b_led = 1.0; } } /* * SW2 handler */ void sw_handler (void) { celcius = !celcius; } /* * Thread that does the same as above */ void host_thread(void const *args) { while (true) { if (host.readable()) { switch(host.getc()) { case 'c': celcius = true; break; case 'f': celcius = false; break; default: break; } } Thread::wait(500); } } int main(void) { host.baud(38400); if (host.writeable()) { host.printf("Hello gtvl2, from FRDM-K64F!\r\nUse POT1 to change the refresh rate, POT2 to change the scale of the graphic and SW2 to change the unit.\r\n"); } tilt_led = 0.0; r_led = 1.0; g_led = 0.0; b_led = 1.0; int refresh_time = 3000; /* * Thermal unit control */ ThermalDisplayer *temp_display = new ThermalDisplayer(); rgb_tick.attach(&rgb_handler, 0.001); sw2_int.mode(PullUp); sw2_int.fall(&sw_handler); if (host.readable()) { Thread thread(host_thread); } while (true) { tilt_led = 0.0; /* * Get temperature using LM75B * and display it to LCD screen */ float temperature = lm_temp.read(); temp_display->addTemp(temperature); temp_display->adjustScale(host); temp_display->display(); /* * Display value to host according to unit choosed with SW2. * Could have been a ternary, but it's easier to read like this */ if (host.writeable()) { if (celcius) { host.printf("Temp: %.2f deg Celcius.\r\n", temperature); } else { host.printf("Temp: %.2f deg Fahrenheit.\r\n", (temperature * 1.8f + 32.0f)); } } /* * Change refresh_time according to POT1's value */ tilt_led = 1.0; refresh_time = (int) (MIN_REFRESH_TIME + ((1.0f - pot) * (MAX_REFRESH_TIME - MIN_REFRESH_TIME))); Thread::wait(refresh_time); } }