Als je met een Arduino de werkelijke tijd wil weergeven of je wil iets laten gebeuren op een gepaalde tijd (wekker, licht aan/uit etc.) kan je de Real Time Clock (RTC) DS 3231 gebruiken. Hiermee kan je de tijd zeer precies bijhouden. De batterij gaat heel lang mee (+1jr) en je kan dus de Arduino van de stroom halen zonder dat de RTC de tijd kwijt raakt. Je kan de tijd zien op de seriële monitor maar om de tijd ook te kunnen aflezen als de Arduino 'stand alone' is, is er een LCD scherm bijgeplaatst. De LCD heeft 'i2c' aansluiting (door de lcm1602 'backpack') waardoor we veel minder aansluit draden nodig hebben. Zowel de RTC als de LCD gebruiken i2c communicatie en ze worden beide aangesloten op de SDA en SCL pin van de Arduino.
We hebben voor de RTC en de LCD een library nodig. Voor de RTC hebben we gebruik gemaakt van Adafruit library die hier kan downloaden:
https://learn.adafruit.com/adafruit-ds3231-precision-rtc-breakout/wiring-and-test
Het grootste gedeelte van de voorbeeld code komt ook van deze site.
Kijk voor de aansluiting in het schema. Let op: De SDA en SCL pinnnen zijn niet aangegeven op de Arduino (daar was geen plek meer voor) maar je kan wel gemakkelijk zien waar ze zitten (de twee pinnen naast AREF).
De library voor de LCD kan je hier downloaden:
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
Kopieer het (ge-unzipte) bestand naar de map Arduino--> Libraries, en hernoem het: LiquidCrystal_I2C
In afbeelding staat nog een ouder RTC model (ds1307) maar dit maakt voor de aansluitingen niet uit.
Helemaal beneden staat een voorbeeldprogramma dat de dag en de secondes op de LCD weergeeft en een ledje (de on-board led op pin 13) laat branden als het aantal secondes tussen 0 en 30 is.
// ds3231 met LCD-I2C
// ds3231 library:
// https://learn.adafruit.com/adafruit-ds3231-precision-rtc-breakout/wiring-and-test
// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
// liquid cristal library:
// https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
//
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD adres is 0x27, 16 karakters, 2 regels
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup () {
/// lcd code [
lcd.init(); // initialiseer de lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(1, 0);
lcd.print("ds3231 / LCD-I2C");
lcd.setCursor(1, 1);
lcd.print("... demo");
delay(2000);
lcd.clear();
/// lcd code ]
pinMode (13, OUTPUT);
#ifndef ESP8266
while (!Serial); // for Leonardo/Micro/Zero
#endif
Serial.begin(9600);
delay(3000); // wait for console opening
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}
void loop () {
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(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
/// lcd code[
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.print(" ");
lcd.print(now.second());
/// lcd code]
if (now.second() > 1 && now.second() < 30) { // led aan tussen 0 en 30 sec.
digitalWrite (13, HIGH);
}
else {
digitalWrite (13, LOW);
}
Serial.println();
delay(1000);
lcd.clear();
}