Годинник реального часу на Ардуіно. Підключення і скетч

Короткі приклади використання модулів для роботиз Ардуіно
Відповісти
Аватар користувача
Arduino
Site Admin
Повідомлень: 98
З нами з: 16 травня 2017 18:18

Годинник реального часу на Ардуіно. Підключення і скетч

Повідомлення Arduino » 10 червня 2017 16:05

Годинник реального часу на Ардуіно частіше за всього будують на модулях точного часу DS 1302 або DS 1307.
Щоб провести дослід по створенню годинника, а не просто вевести результати відліку на монітор ПК нам знадобляться:
В цьому експерименті ми розглянемо модуль годин реального часу на мікросхемі DS1307.

Необхідні компоненти:

• плата для прототипування;
• модуль реального часу DS1307;
• дисплей WH1602;
• потенціометр 10 кОм;
• резистор на 51 Ом;
• дроти "тато-тато".
• зовнішній блок живлення +5 В.
• батарейка CR2032 3 В;
• керувати буде контролер Arduino UNO R3
Годинник реального часу на базі  модуля DS 1307
Годинник реального часу на базі модуля DS 1307
Скористаємось готовим скетчем програми, в якому використовуємо бібліотеку 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);
}
При першому увключенні схеми на екрані дисплея ми бачимо невірний час і невірну дату. Справа в тому, що при відсутності живлення значення часу в мікросхемі DS1307 скидається на 00:00:00 01/01/2000. Щоб при відключенні живлення час не скидався, передбачено аварійне живлення модуля від батарейки 3 В.
Для установки часу в бібліотеці є функція 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;}
}
}

Аватар користувача
lDoberMannl
Повідомлень: 30
З нами з: 12 жовтня 2017 14:50
Звідки: Боярка

Re: Годинник реального часу на Ардуіно. Підключення і скетч

Повідомлення lDoberMannl » 25 червня 2018 13:49

Пока еще не задумывался, но на сколько сложно переделать скетч, что бы сделать будильник?
Например этот же скетч - который отображает время, и когда время достигает 6 утра - включается реле - которое можно отключить только при нажатии на определенную кнопку.
У меня есть сирена от экструдера (дружбан с завода стырил) - орет так, что дурная - самый раз использовать ее в качестве будильника.
А так же как добавить возможность выставлять в будильнике несколько временных диапазонов? например будильник на 6 утра, на 7 утра и на 8 утра.

Аватар користувача
Arduino
Site Admin
Повідомлень: 98
З нами з: 16 травня 2017 18:18

Re: Годинник реального часу на Ардуіно. Підключення і скетч

Повідомлення Arduino » 25 червня 2018 21:55

lDoberMannl писав:
25 червня 2018 13:49
Пока еще не задумывался, но на сколько сложно переделать скетч, что бы сделать будильник?
Сам скетч перенасыщен функциями управления выводом на дисплей, а собственно именно по времени - код маленький

Відповісти

Повернутись до “Практичні завдання з Arduino”