Above is a Fritzing generated schematic of a project I've recently been working on for the Arduino Nano. The project uses a Real Time Clock component, a temperature/humidity sensor and a liquid crystal display. It is powered by a portable power bank.
The code for the project is shown below.
//-------------------------------------------------------------------------------
//
// Written by Paul Crossley 20/12/2019
//
// www.magmamon.co.uk
//
// Temperature/Humidity sensor on D8
// RTC and Display on A4 and A5
// my own personal temperature adjustment was -2C
// my display I2C address was 0x3F, use i2c-scanner
//
//-------------------------------------------------------------------------------
#include <SimpleDHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimerOne.h>
#include <RTClib.h>
//-------------------------------------------------------------------------------
volatile unsigned int clockMilliSeconds = 0;
volatile byte clockSeconds = 0;
volatile byte clockMinutes = 0;
volatile byte clockHours = 12;
volatile byte clockEnabled = 1;
byte alarmMinutes = 30;
byte alarmHours = 6;
volatile byte alarmEnabled = false;
byte alarmTogglePressed = false;
enum displayModeValues
{
MODE_CLOCK_TIME,
MODE_CLOCK_TIME_SET_HOUR,
MODE_CLOCK_TIME_SET_MINUTE,
MODE_ALARM_TIME,
MODE_ALARM_TIME_SET_HOUR,
MODE_ALARM_TIME_SET_MINUTE
};
byte displayMode = MODE_CLOCK_TIME;
RTC_DS1307 RTC;
//-------------------------------------------------------------------------------
void clockISR ()
{
if (clockEnabled)
{
clockMilliSeconds++;
if (clockMilliSeconds >= 1000)
{
clockMilliSeconds = 0;
clockSeconds++;
if (clockSeconds >= 60)
{
clockSeconds = 0;
clockMinutes++;
if (clockMinutes >= 60)
{
clockMinutes = 0;
clockHours++;
if (clockHours >= 24)
{
clockHours = 0;
}
}
}
}
}
}
//-------------------------------------------------------------------------------
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define BACKLIGHT_PIN 13
int pinDHT11 = 8;
SimpleDHT11 dht11(pinDHT11);
int tempAdjust = -2;
byte degree[8] = {
B01100,
B10010,
B10010,
B01100,
B00000,
B00000,
B00000,
};
void setup() {
Serial.begin (9600);
lcd.begin(16, 2);
lcd.clear();
lcd.createChar(0, degree);
lcd.setBacklight(BACKLIGHT_ON);
pinMode(LED_BUILTIN, OUTPUT);
RTC.begin();
// RTC.adjust(DateTime(__DATE__, __TIME__)); to set time
}
void loop() {
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
digitalWrite(LED_BUILTIN, HIGH);
if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess)
{
Serial.print("No reading , err="); Serial.println(err); delay(1000);
return;
}
Serial.print("Temp: ");
Serial.print((int)temperature); Serial.print("C, ");
Serial.print("Humid: ");
Serial.print((int)humidity); Serial.println("%");
lcd.home();
lcd.print ("T: ");
if ((temperature + tempAdjust) < 10) { lcd.print (" "); }
lcd.print ((int)temperature + tempAdjust);
lcd.write (byte(0));
lcd.print ("C ");
lcd.print ("H: ");
if ((humidity) < 10) { lcd.print (" "); }
lcd.print ((int)humidity);
lcd.print ("%");
delay (1000);
digitalWrite(LED_BUILTIN, LOW);
DateTime now = RTC.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
lcd.setCursor ( 0, 1 );
if (now.day() < 10) { lcd.print ("0"); }
lcd.print ((int)(now.day()));
lcd.print ("/");
if (now.month() < 10) { lcd.print ("0"); }
lcd.print ((int)(now.month()));
lcd.print ("/");
lcd.print ((int)(now.year()));
lcd.print (" ");
if (now.hour() < 10) { lcd.print ("0"); }
lcd.print ((int)(now.hour()));
lcd.print (":");
if (now.minute() < 10) { lcd.print ("0"); }
lcd.print ((int)(now.minute()));
delay (1000);
}


