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-10
Revision:
2:5d0c209e5c61
Parent:
1:06713d1b69cf
Child:
3:a4dac093a968

File content as of revision 2:5d0c209e5c61:

#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 r_led(PTA2);         // RGB LED
DigitalOut g_led(PTC4);
DigitalOut b_led(PTA0);         // Won't use BLUE because not working on my device !
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()
{
    if (celcius) {
        r_led = 1.0;
        g_led = 0.0;
    } else {
        r_led = 0.0;
        g_led = 1.0;
    }
}

/*
 *  SW2 handler
 */
void sw_handler (void)
{
    celcius = !celcius;
}

int main(void)
{
    host.baud(38400);
    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");

    r_led = 0.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);

    while (true) {

        /*
         * Get temperature using LM75B
         * and display it to LCD screen
         */
        float temperature = lm_temp.read();
        temp_display->addTemp(temperature);
        temp_display->adjustScale();
        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 (celcius) {
            host.printf("Temp: %.2f deg Celcius.\r\n", temperature);
        } else {
            host.printf("Temp: %.2f deg Fahrenheit.\r\n", (temperature * 1.80 + 32.00));
        }

        /*
         * Change refresh_time according to POT1's value
         */
        refresh_time = (int) (MIN_REFRESH_TIME + (pot * (MAX_REFRESH_TIME - MIN_REFRESH_TIME)));
        wait_ms(refresh_time);
    }
}