Temperature sensor with time and date display on graphical LCD

Some time ago I've build a prototyping board with graphical LCD. It have served for various small projects and prototypes. Had a spare temperature sensor DS18B20 and decided to put simple temperature display project. GLCD board is equipped with Atmega32 microcontroller running at 16MHz. DS18B20 sensor is connected to port D pin 6.

Temperature sensor with time and date display on graphical LCD

LED connected to PD3 is used for indicating EEPROM write activity. Device is navigated with rotary encoder. It is connected to MCU as follows (more about interfacing rotary encoder here):

avr temperature sensor schematic

As you can see hardware is simple considering that you already have GLCD board. Next step is to decide what functionality is needed. I came up with following:

  • Temperature display with 0.01ºC resolution;

  • Time display in HH:MM:SS format;

  • Date display in YYYY:MO:DD format;

  • Date is calculated with leap year algorithm;

  • Temperature is updated every 5s;

  • Temperature data with date/time is sent to UART terminal;

  • MIN and MAX temperature storage in EEPROM;

  • Menu selectable functions: time/date set, temperature log view, graph plot, reset min max, stats view;

  • LED blinks each time min or max is updated.

Reading DS18B20 sensor

Lets go through all parts of this. First of all temperature reading. As Atmega32 doesn't have any hardware level 1-wire support everything has to be done in software. Luckily you can find ready libraries for this. As a reference I've used code example from here. Library is combination of several smaller that include 1-wire and DS18x20 code developed by Peter Dannegger and CRC code from Colin O'Flynn. All you need to initialize sensor, read its ROM code and then you can access sensor data with function that returns temperature value. Library supports multiple sensors connected to single wire so main code could be simplified since we need to read only one sensor. We are leaving as it is as long as it works. Temperature is stored as three 8-bit values: sign, integral part and decimal part. This way we avoid using floating point numbers that would take significant part of resources.

Time and date calculation

Time and date track is software based. This means that every second, minute, hour, day, month and year has to be calculated withing algorithm. To make one second ticks there is 16-bit timer1 used which generates overflow interrupts. On every interrupt time and date update function is called that increments value by one second as follows:

void TimeDate_Update(void)
{
if (++TD.ss==60)
{
    TD.ss=0;
    if(++TD.mm==60)
    {
        TD.mm=0;
        if(++TD.hh==24)
        {
            TD.hh=0;
            if(IsLeapYear(TD.year)&&(TD.mo==2))
            {
                if(++TD.dd>SDays[0])
                {
                    TD.dd=1;
                    if(++TD.mo>12)
                    {
                        TD.mo=1;
                        TD.year++;
                    }
                   
                }
            }
            else if(++TD.dd>SDays[TD.mo])
                {
                    TD.dd=1;
                    if(++TD.mo>12)
                    {
                        TD.mo=1;
                        TD.year++;
                    }
                }
        }
    }
}

It also takes care of leap year calculation. It means if year is leap then February has 29 days otherwise it has 28. Leap year algorithm is common and can be found on internet:

uint8_t IsLeapYear(uint16_t year)
{
if ((year % 4) == 0)
{
    if ((year > 1582) && ((year % 100) == 0))
    {
        if ((year % 400) == 0)
        return 1;
        else return 0;
    }
    else return 1;
}
else return 0;
}

Date and time values are displayed along with temperature value on main LCD screen.

GLCD temperature date and time

Other functions

Navigation on temperature sensor is made through simple menu. It consists of five menu elements: time and date change, log view, stats view, clear stats and graph view.

First of all time and date change function. It simply allows to cycle around all time and date elements one by one and select one to change. With rotary encoder wheel turn value is updated immediately.

Log view function allows to display temperature values row by row every 5 seconds. It may be convenient to track temperature change during time.

temperature log

Stats function displays min and max temperature values stored in EEPROM. While clear stats function simply clears these values that makes them record from current date. Date is also stored so to know the time when stats were started to collect.

temperature stats view

And finally Graph view function simply plots temperature values every 5s on a simple graph. There are no labels on axis – just trace with current temperature indicator.

temperature plot on glcd

As mentioned above, AVR also sends temperature values via USART so they could be seen in terminal window.:

temperature terminal log

Project is still not polished. Code is messy and not optimized. Hope you'll find it interesting.

 

Comments

<p>sir I want to design the LCD displayed in the above project...</p><p>help</p><p>i want the complete description and ckt diagram for designing.</p>

many thanks for your response. but i still need the circuit diagram to try the simulation on proteus.
where can i find it?

i need circuit diagram,programing in c and software for simulation where i get it ... please respone soon....

many thanks for your response. but i still need the circuit diagram to try the simulation on proteus.
where can i find it?