Щоб провести дослід по створенню годинника, а не просто вевести результати відліку на монітор ПК нам знадобляться:
В цьому експерименті ми розглянемо модуль годин реального часу на мікросхемі DS1307.
Необхідні компоненти:
• плата для прототипування;
• модуль реального часу DS1307;
• дисплей WH1602;
• потенціометр 10 кОм;
• резистор на 51 Ом;
• дроти "тато-тато".
• зовнішній блок живлення +5 В.
• батарейка CR2032 3 В;
• керувати буде контролер Arduino UNO R3 Скористаємось готовим скетчем програми, в якому використовуємо бібліотеку Time, яка є «обгорткою» для бібліотеки DS1307, і бібліотеку Wire для роботи з I2C-пристроями. Для роботи з РКІ (дисплеєм) використовуємо бібліотеку LiquidCrystal.
Код: Виділити все
// підключення бібліотек для RTC
#include
#include
#include
// підключення бібліотеки для LSD
#include
// ініціалізація із зазначенням контактів підключення
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
void setup()
{
lcd.begin(16, 2); // встановити розмірність дисплея
}
void loop()
{
tmElements_t tm;
if (RTC.read(tm)) // отримання часу
{
print2digits(tm.Hour,0,0);
lcd.print(':');
print2digits(tm.Minute,3,0);
lcd.print(':');
print2digits(tm.Second,6,0);
print2digits(tm.Day,0,1);
lcd.print('/');
print2digits(tm.Month,3,1);
lcd.print('/');
lcd.print(tmYearToCalendar(tm.Year));
}
else
{
if (RTC.chipPresent())
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DS1307 is stopped");
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DS1307 read error");
}
delay(9000);
}
delay(1000);
}
// процедура виведення на дисплей з додаванням до двох цифр
void print2digits(int number,int col, int str)
{
lcd.setCursor(col, str);
if (number >= 0 && number < 10)
{lcd.print("0");}
lcd.print(number);
}
Для установки часу в бібліотеці є функція RTC.write (tmElements_t tm). Додамо в скетч можливість установки даних RTC по послідовному порту відправкою такого рядка «dd / mm / YYYY hh: mm: ss».
Код: Виділити все
// підключення бібліотек для RTC
#include
#include
#include
// підключення бібліотеки для lcd
#include
// ініціалізація із зазначенням контактів підключення
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
// рядок, що збирається з даних, що приходять в послідовний порт
String inputString = "";
boolean stringComplete = false; // "прапорець" комплектності рядка
void setup()
{
Serial.begin(9600); // запустити послідовний порт
lcd.begin(16, 2); // встановити розмірність дисплея
}
void loop()
{
tmElements_t tm;
// очікування кінця рядка для аналізу надійшов запиту:
if (stringComplete)
{
tm.Day=(int(inputString[0])-48)*10+(int(inputString[1])-48);
tm.Month=(int(inputString[3])-48)*10+(int(inputString[4])-48);
tm.Year=CalendarYrToTm((int(inputString[6])-
48)*1000+(int(inputString[7])-48)*100+
(int(inputString[8])-48)*10+(int(inputString[9])-48));
tm.Hour=(int(inputString[11])-48)*10+(int(inputString[12])-48);
tm.Minute=(int(inputString[14])-48)*10+(int(inputString[15])-48);
tm.Second=(int(inputString[17])-48)*10+(int(inputString[18])-48);
RTC.write(tm); // записать время в RTC
// очистити рядок
inputString = "";
stringComplete = false;
}
if (RTC.read(tm))
{
print2digits(tm.Hour,0,0);
lcd.print(':');
print2digits(tm.Minute,3,0);
lcd.print(':');
print2digits(tm.Second,6,0);
print2digits(tm.Day,0,1);
lcd.print('/');
print2digits(tm.Month,3,1);
lcd.print('/');
lcd.print(tmYearToCalendar(tm.Year));
}
else
{
if (RTC.chipPresent())
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DS1307 is stopped");
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DS1307 read error");
}
delay(9000);
}
delay(1000);
}
// процедура виводу на дисплей з додаванням до двох цифр
void print2digits(int number,int col, int str)
{
lcd.setCursor(col, str);
if (number >= 0 && number < 10)
{lcd.print("0");}
lcd.print(number);
}
// отримання даних по послідовному порту
void serialEvent()
{
while (Serial.available())
{ // отримати черговий байт:
char inChar = (char)Serial.read();
// додати в рядок
inputString += inChar;
// /n - кінець передачі
if (inChar == '\n')
{stringComplete = true;}
}
}