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:
4:5bf99eb2d740
Parent:
3:a4dac093a968
Child:
5:c5d7fca4d111

File content as of revision 4:5bf99eb2d740:

/**
 *  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)
 *
 *  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()
{
    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;
}

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");

    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);

    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 (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)));
        wait_ms(refresh_time);
    }
}