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

ThermalDisplayer.cpp

Committer:
co838_gtvl2
Date:
2016-02-23
Revision:
8:6f30f477fa23
Parent:
6:6c61186c8739

File content as of revision 8:6f30f477fa23:

#include "ThermalDisplayer.h"

/**
 *  Constructor, initialize Potentiometer, LCD and variables
 */
ThermalDisplayer::ThermalDisplayer()
    :   pot(A1), 
        accel(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1)
{
    this->lcd = new C12832(D11, D13, D12, D7, D10);
    this->lcd->set_auto_up(0);
    this->temperatures = std::list<float>(MAX_SIZE);
    this->minScale = MIN_MIN_SCALE;
    this->maxScale = MAX_MAX_SCALE;
    this->screenOrientation = true;
    this->accel.enable();
}

/**
 *  Add record to temperature historic
 *  @param const float &temp, the record to add.
 */
void    ThermalDisplayer::addTemp(const float &temp)
{
    this->temperatures.pop_front();
    this->temperatures.push_back(temp);
}

/**
 *  Display informations to the LCD screen
 *  Screen isn't even flusing !
 *  For each temperature record, it draw a white rectangle to erase previous data
 *  then draw on top of it the new data.
 */
void    ThermalDisplayer::display()
{
    std::list<float>::const_iterator it;

    int pos = 0;
    for (it = this->temperatures.begin(); it != this->temperatures.end(); it++, pos++) {
        int height = (int) (32 * ((*it) - this->minScale) / (this->maxScale - this->minScale));
        height = height > DISPLAY_Y ? DISPLAY_Y : (height < 0 ? 0 : height);
        if (this->screenOrientation) {
            this->lcd->rect(pos * 2, 0, pos * 2 + 1, DISPLAY_Y, 0);
            this->lcd->rect(pos * 2, DISPLAY_Y - height, pos * 2 + 1, DISPLAY_Y, 1);
        } else {
            this->lcd->rect(DISPLAY_X - (pos * 2), 0, DISPLAY_X - (pos * 2 + 1), DISPLAY_Y, 0);
            this->lcd->rect(DISPLAY_X - (pos * 2), 0, DISPLAY_X - (pos * 2 + 1), height, 1);
        }
    }
    this->lcd->copy_to_lcd();
}

/**
 *  Adjust scale of the display according to POT2
 *  Also adjust the screen orientation accodring to FXOS8700CQ accelerometer
 */
void    ThermalDisplayer::adjustScale()
{
    float potValue = this->pot; 

    this->minScale = MIN_MIN_SCALE + potValue * (MAX_MIN_SCALE - MIN_MIN_SCALE);
    this->maxScale = MIN_MAX_SCALE + (1.0f - potValue) * (MAX_MAX_SCALE - MIN_MAX_SCALE);
    
    SRAWDATA accel_data;
    SRAWDATA magn_data;
    uint8_t data = this->accel.get_data(&accel_data, &magn_data);
    if (accel_data.y <= -100) {
        this->screenOrientation = false;   
    } else {
        this->screenOrientation = true;   
    }
}