LCD display with date, time, inside- and outside-temperature |
void loop() {
DateTime now = RTC.now(); // new RTC object named "now"
// get time and date from the RTC DS1307
int hour = now.hour();
int minute = now.minute();
int second = now.second();
// print time and date on the first line of the LCD
// and make some adjustments regarding leading zeros
// time display will change every second
lcd.setCursor(0, 0);
if (hour < 10) {
lcd.print("0");
lcd.print(hour,DEC);
}
else {
lcd.print(hour,DEC);
}
lcd.print(":");
if (minute < 10){
lcd.print("0");
lcd.print(now.minute(), DEC);
}
else {
lcd.print(now.minute(), DEC);
}
lcd.print(":");
if (second < 10){
lcd.print("0");
lcd.print(now.second(), DEC);
}
else{
lcd.print(second, DEC);
}
int month = now.month();
lcd.print(" ");
lcd.print(now.day(),DEC);
lcd.print(".");
if (month < 10) {
lcd.print("0");
lcd.print(now.month(), DEC);
lcd.print(".");
}
else {
lcd.print(now.month(), DEC);
lcd.print(".");
}
// wait one second to show off as a "real" clock ;)
delay (1000);
// here we are reading the serial port, that means everything that comes from the XBee Coordinator
// the packet size (I/O Data Sample) is expected to be at least 23 bytes
if (Serial.available() >= 23) {
// look for the start byte, in this case I chose part of XBee end device address for easy parsing
// this is a quick and dirty solution and you are welcome to make a better code for this
// and of course you have to adjust the code for your XBee end device
if (Serial.read() == 0x6F) {
// blink debug LED to indicate when data is received
digitalWrite(debugLED, HIGH);
delay(50);
digitalWrite(debugLED, LOW);
// read the variables that we're not using out of the buffer
for (int i = 0; i<9; i++) {
byte discard = Serial.read();
}
// read the two bytes for the analog value
int analogHigh = Serial.read();
int analogLow = Serial.read();
// combine high and low analog value, because it's in two bytes
analogValue = analogLow + (analogHigh * 256);
// calculate temperature from TMP 36
// 1.2V/ 1024 (10 bit ADC), 0°C is 500 mV, 10mV/ °C temperature coefficient
float temperature = (((1.171875*analogValue)-500)/10);
// we take 10 analog temperature samples and calculate the average
temperature_sample=0; // reset temperature_sample value to zero
for (int i=0; i<10; i++) {
// calculate the temperature from the AD22100K
// 5V/ 1024 (10 bit ADC), 1.375 V at =0°C, 22.5mV temperature coefficient per °C
temperature_read = (analogRead(0)*0.0048828125 - 1.375) / 0.0225;
temperature_sample = temperature_sample + temperature_read;
}
temperatureInside = (temperature_sample/10);
// print inside and outside temperature in the second row of the LCD
// display will only change when data is received
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("IN ");
lcd.print(temperatureInside,1);
lcd.print(" OUT ");
lcd.print(temperature,1);
}
}
}
There are still some things to consider and to change in the future. There is for example no adjustment for negative temperatures in the display, the parsing with the XBee address could be improved, the back light could be adjusted by software.