Как подключить часы реального времени (rtc) к arduino

Содержание

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же рассмотрим его наиболее существенные фрагменты.
Сначала в программе необходимо подключить библиотеки для работы с клавиатурой и ЖК дисплеем и инициализировать необходимые переменные.

Arduino

#include <LiquidCrystal.h>
#include <Keypad.h>

long int set1;
long int set2;
long int set3;
long int set4;
long int j;
int t1, t2, t3, t4, t5, t6;
int r1, r2, r3;
char key;
String r;
String hours;
String minutes;
String seconds;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include <LiquidCrystal.h>
#include <Keypad.h>
 

longintset1;

longintset2;

longintset3;

longintset4;

longintj;

intt1,t2,t3,t4,t5,t6;

intr1,r2,r3;

charkey;

Stringr8;

Stringhours;

Stringminutes;

Stringseconds;

Далее в программе мы сообщаем количество строк и столбцов в используемой нами клавиатуре и задаем карту клавиш клавиатуры.

Arduino

const byte ROWS = 4; // четыре строки
const byte COLS = 4; // четыре столбца

char keys = {
{‘1′,’2′,’3′,’A’},
{‘4′,’5′,’6′,’B’},
{‘7′,’8′,’9′,’C’},
{‘*’,’0′,’#’,’D’}
};

1
2
3
4
5
6
7
8
9

constbyteROWS=4;// четыре строки

constbyteCOLS=4;// четыре столбца

charkeysROWSCOLS={

{‘1′,’2′,’3′,’A’},

{‘4′,’5′,’6′,’B’},

{‘7′,’8′,’9′,’C’},

{‘*’,’0′,’#’,’D’}

};

Затем мы сообщаем плате Arduino к каким ее контактам подключены контакты строк и столбцов клавиатуры, а также контакты ЖК дисплея.

Arduino

byte rowPins = { 6, 7, 8, 9 }; // подсоедините контакты клавиатуры ROW0, ROW1, ROW2 и ROW3 к этим контактам Arduino
byte colPins = { 10, 11, 12, 13 };// подсоедините контакты клавиатуры COL0, COL1, COL2 и COL3 к этим контактам Arduino
LiquidCrystal lcd(A0, A1, 5, 4, 3, 2); // создаем объект ЖК дисплея с параметрами (rs, enable, d4, d5, d6, d7)

1
2
3

byterowPinsROWS={6,7,8,9};// подсоедините контакты клавиатуры ROW0, ROW1, ROW2 и ROW3 к этим контактам Arduino

bytecolPinsCOLS={10,11,12,13};// подсоедините контакты клавиатуры COL0, COL1, COL2 и COL3 к этим контактам Arduino

LiquidCrystallcd(A0,A1,5,4,3,2);// создаем объект ЖК дисплея с параметрами (rs, enable, d4, d5, d6, d7)

Следующая команда создает объект клавиатуры в программе.

Arduino

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

1 Keypadkpd=Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS);

В функции setFeedingTime() после нажатия кнопки мы можем ввести время, с которого начнется отсчет, для начала счета после этого необходимо нажать клавишу D на клавиатуре.

Arduino

void setFeedingTime()
{
feed = true;
int i=0;

lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Set feeding Time»);
lcd.clear();
lcd.print(«HH:MM:SS»);
lcd.setCursor(0,1);

while(1){
key = kpd.getKey();
char j;

if(key!=NO_KEY){
lcd.setCursor(j,1);
lcd.print(key);
r = key-48;
i++;
j++;

if (j==2 || j == 5)
{
lcd.print(«:»); j++;
}
delay(500);
}

if (key == ‘D’)
{key=0; break; }
}
lcd.clear();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

voidsetFeedingTime()

{

feed=true;

inti=;

lcd.clear();

lcd.setCursor(,);

lcd.print(«Set feeding Time»);

lcd.clear();

lcd.print(«HH:MM:SS»);

lcd.setCursor(,1);

while(1){

key=kpd.getKey();

charj;

if(key!=NO_KEY){

lcd.setCursor(j,1);

lcd.print(key);

ri=key-48;

i++;

j++;

if(j==2||j==5)

{

lcd.print(«:»);j++;

}

delay(500);

}

if(key==’D’)

{key=;break;}

}

lcd.clear();

}

В функции void setup() мы инициализируем ЖК дисплей и последовательную связь, а также задаем режим работы (на ввод или вывод данных) для используемых контактов.

Arduino

void setup()
{
lcd.begin(16,2);
Serial.begin(9600);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A3, INPUT);
pinMode(A4, OUTPUT);
}

1
2
3
4
5
6
7
8
9

voidsetup()

{

lcd.begin(16,2);

Serial.begin(9600);

pinMode(A0,OUTPUT);

pinMode(A1,OUTPUT);

pinMode(A3,INPUT);

pinMode(A4,OUTPUT);

}

DS3231 Real Time Clock

The DS3231 is a low-cost, highly accurate Real Time Clock which can maintain hours, minutes and seconds, as well as, day, month and year information. Also, it has automatic compensation for leap-years and for months with fewer than 31 days.

The module can work on either 3.3 or 5 V which makes it suitable for many development platforms or microcontrollers. The battery input is 3V and a typical CR2032 3V battery can power the module and maintain the information for more than a year.

The module uses the I2C Communication Protocol which makes the connection to the Arduino Board very easy.

Here’s the circuit schematics:

So all we need is 4 wires, the VCC and the GND pins for powering the module, and the two I2C communication pins, SDA and SCL.

You can get the components needed for this Arduino Tutorial from the links below:

  • DS3231 Real Time Clock…………….. Amazon / Banggood / AliExpress
  • Arduino Board …………………………… Amazon / Banggood / AliExpress
  • Breadboard and Jump Wires ……… Amazon / Banggood / AliExpress

Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.

Объяснение работы проекта

Работа нашего регистратора данных (логгера) на Arduino достаточно проста. После того как вы соберете всю схему и загрузите программу в плату Arduino значения даты, времени, температуры и влажности начнут сохраняться в файл на SD карте. Для того, чтобы задействовать PLX-DAQ для записи данных в лист Excel на вашем компьютере, вы должны выполнить следующую последовательность действий.

Шаг 1: Откройте файл “Plx-Daq Spreadsheet” который был создан на вашем рабочем столе во время установки этого программного обеспечения.

Шаг 2: Если Excel показывает вам ограничение на запись данных, то кликните Options->Enable the content -> Finish -> OK чтобы получить следующий экран.

Шаг 3: Выберите бодовую скорость “9600” на том последовательном порту, к которому подключена плата Arduino и нажмите на Connect. Ваши данные должны начать записываться как показано на следующем рисунке.

Вы можете оставить этот лист Excel открытым и смотреть как записываются данные. Те же самые данные в это же время записываются и на SD карту. Чтобы проверить это извлеките SD карту из собранного устройства и вставьте ее в ваш компьютер. Вы должны найти на ней файл “LoggerCD.txt”. Когда вы откроете его, он будет выглядеть примерно так, как показано на следующем рисунке:

Но в таком виде их трудно будет анализировать. Поэтому мы можем открыть этот файл в Excel в формате CSV (Comma separated values – данные, разделенные запятыми) чтобы сделать анализ этот данных более удобным. Чтобы открыть его в Excel выполните следующую последовательность действий:

  1. Откройте Excel. Кликните на File->Open и выберите “All file” в правом нижнем углу, затем выберите файл “LoggerCD” на вашей SD карте. Запустится мастер импорта текста.
  2. Кликните на “Next” и выберите запятую (comma) в качестве разделителя. Кликните на “Next” снова, затем на Finish.
  3. После этого ваши данные будут открыты в Excel файле как показано на следующем рисунке:

В этом проекте мы записываем данные каждые 5 секунд – но вы можете изменить это время на любое необходимое вам внеся небольшие изменения в программу.

Беспроводная регистрация данных (лог) с помощью Arduino

Если у вас все получилось, то вы можете внести ряд усовершенствований в этот проект. Просто подсоедините к плате Arduino Bluetooth устройство (например, модуль HC-05) и передавайте данные в программу PLX-DAQ при помощи технологии Bluetooth, а не по последовательному порту. В этом случае в программе вам необходимо заменить Serial.print(parameter); на BluetoothName.print(parameter); и соединить ваш компьютер/лэптоп к HC-05 по Bluetooth – для этого необходимо будет выбрать COM порт, к которому подсоединен Bluetooth на вашем компьютере/лэптопе. И все – ваш беспроводной логгер (регистратор) данных на основе Arduino будет готов.

4-х разрядный семисегментный дисплей (4-Digit 7 Segment Display)

4-х разрядный семисегментный дисплей состоит из четырех семисегментных дисплеев, объединенных в единое устройство. Иногда говорят, что эти дисплеи “мультиплексированы вместе”, поэтому для управления ими можно использовать технологию мультиплексирования. Этот дисплей можно использовать для отображения цифр, а также некоторых букв. Дисплей можно использовать в обоих направлениях. 4 символа удобно использовать для изготовления электронных часов или счетчика от 0 до 9999.

На следующем рисунке показана внутренняя схема соединений 4-х разрядного семисегментного дисплея.

Каждый сегмент дисплея имеет собственный светодиод и им можно индивидуально управлять. Светодиоды таким образом скомпонованы в составе дисплея, что каждый из них освещает только свой сегмент (к которому он относится). Семисегментные дисплеи могут быть с общим катодом и общим анодом, как показано на следующем рисунке.

В семисегментном дисплее с общим катодом (ОК) отрицательные выводы всех светодиодов соединены вместе и образую общую землю. В схеме с общим анодом (ОА) положительные выводы всех светодиодов соединены вместе и они образуют общий вывод напряжения постоянного тока (VCC).

На нашем сайте есть достаточно подробные статьи про устройство семисегментных дисплеев и их программированию – они написаны для микроконтроллеров семейства AVR, но я думаю провести аналогию с Arduino вам будет не трудно:

  • семисегментный светодиодный индикатор: описание, подключение к микроконтроллеру;
  • перевод двоичного кода десятичного числа в код семисегментного индикатора. Программа вывода цифры на одноразрядный светодиодный индикатор;
  • многоразрядный семисегментный индикатор: организация динамической индикации, алгоритм работы, программа индикации.

Также можно посмотреть статью о подключении семисегментного дисплея к микроконтроллеру AVR ATmega32.

Использование технологии мультиплексирования

Так каким образом мы можем на подобном 4-х символьном семисегментном дисплее отобразить, к примеру, число 1234? Это возможно сделать с использованием технологии мультиплексирования. Смысл этой технологии достаточно прост – в каждый момент времени мы отображаем только один символ (из 4-х возможных) на данном дисплее. Переключение между отображением всех 4-х символов происходит достаточно быстро – поэтому человеческий глаз воспринимает их непрерывно горящими.

Functions for reading and writing RTC registers or static RAM (SRAM) for the DS3232

The DS3232RTC.h file defines symbolic names for the timekeeping, alarm, status and control registers. These can be used for the addr argument in the functions below.

writeRTC(byte addr, byte *values, byte nBytes)

Write one or more bytes to RTC memory.

Parameters

addr: First SRAM address to write (byte). The valid address range is 0x00-0x12 for DS3231, 0x00-0xFF for DS3232. The general-purpose SRAM for the DS3232 begins at address 0x14. Address is not checked for validity by the library.
values: An array of values to write (*byte)nBytes: Number of bytes to write (byte). Must be between 1 and 31 (Wire library limitation) but is not checked by the library.

I2C status (byte). Returns zero if successful.

//write 1, 2, ..., 8 to the first eight DS3232 SRAM locations
byte buf = {1, 2, 3, 4, 5, 6, 7, 8};
RTC.sramWrite(0x14, buf, 8);

writeRTC(byte addr, byte value)

Write a single byte to RTC memory.

Parameters

addr: SRAM address to write (byte). The valid address range is 0x00-0x12 for DS3231, 0x00-0xFF for DS3232. The general-purpose SRAM for the DS3232 begins at address 0x14. Address is not checked for validity by the library.
value: Value to write (byte)

I2C status (byte). Returns zero if successful.

RTC.writeRTC(3, 14);   //write the value 14 to SRAM address 3

readRTC(byte addr, byte *values, byte nBytes)

Read one or more bytes from RTC RAM.

Parameters

addr: First SRAM address to read (byte). The valid address range is 0x00-0x12 for DS3231, 0x00-0xFF for DS3232. The general-purpose SRAM for the DS3232 begins at address 0x14. Address is not checked for validity by the library.
values: An array to receive the values read (*byte)nBytes: Number of bytes to read (byte). Must be between 1 and 32 (Wire library limitation) but is not checked by the library.

I2C status (byte). Returns zero if successful.

//read the last eight locations of SRAM into buf
byte buf;
RTC.sramRead(248, buf, 8);
Parameters

addr: SRAM address to read (byte). The valid address range is 0x00-0x12 for DS3231, 0x00-0xFF for DS3232. The general-purpose SRAM for the DS3232 begins at address 0x14. Address is not checked for validity by the library.

Подключение DS1307 к дисплею LCD 1602 i2c

Схема подключения часов реального времени с дисплеем

Рассмотрим два варианта подключения модуля RTC к Arduino и текстового дисплея 1602. В первом варианте используется протокол SPI для модуля часов, поэтому к предыдущей схеме потребуется добавить только дисплей с iic модулем. А в скетче следует расскомментировать соответствующую строку. После внесения правок в схему и программу — загрузите следующий скетч в микроконтроллер.

Скетч. Часы с экраном LCD 1602 и DS1302

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1302,6,8,7);  // для модуля DS1302 - RST, CLK, DAT

#include <Wire.h>                             // библиотека для устройств I2C 
#include <LiquidCrystal_I2C.h>       // подключаем библиотеку для дисплея
LiquidCrystal_I2C LCD(0x27,16,2);  // присваиваем имя дисплею

void setup() {
   delay(300);
   LCD.init();            // инициализация LCD дисплея
   LCD.backlight();  // включение подсветки дисплея
   time.begin();
   time.settime(0, 30, 18, 12, 6, 20, 5); // 0  сек, 30 мин, 18 часов, 12, июня, 2020, четверг
}

void loop() {
   // если прошла 1 секунда выводим время на дисплей
   if (millis() % 1000 == 0) {
      LCD.setCursor(0,0);
      LCD.print(time.gettime("d M Y, D"));
      LCD.setCursor(4,1);
      LCD.print(time.gettime("H:i:s"));
      delay(1);
   }
}
  1. в данном примере с помощью команды можно выводить на текстовый экран текущее время и дату в разном формате.

При подключении экрана и модуля RTC к одной шине iic — порты SDA(A4) и SCL(A5), следует указать в скетче какой модуль используется. Схема подключения размещена выше, кроме того вы можете использовать сканер шины i2c для того, чтобы увидеть адреса устройств. Если адреса, которые установлены производителем по умолчанию вы не изменяли — соберите схему и загрузите следующий пример в плату.

Схема подключения DS1307 и LCD по i2c

Скетч. Часы с LCD 1602 и DS1302 I2C Arduino

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1307);       // для модуля DS1307 с i2C

#include <Wire.h>                             // библиотека для устройств I2C 
#include <LiquidCrystal_I2C.h>       // подключаем библиотеку для дисплея
LiquidCrystal_I2C LCD(0x27,16,2);  // присваиваем имя дисплею

void setup() {
   delay(300);
   LCD.init();            // инициализация LCD дисплея
   LCD.backlight();  // включение подсветки дисплея
   time.begin();
   time.settime(0, 30, 18, 12, 6, 20, 5); // 0  сек, 30 мин, 18 часов, 12, июня, 2020, четверг
}

void loop() {
   // если прошла 1 секунда выводим время на дисплей
   if (millis() % 1000 == 0) {
      LCD.setCursor(0,0);
      LCD.print(time.gettime("d M Y, D"));
      LCD.setCursor(4,1);
      LCD.print(time.gettime("H:i:s"));
      delay(1);
   }
}

Код

Код проекта вы можете скачать или скопировать ниже. Код содержит комментарии. Обычно мы рекомендуем копировать код из скачанного файла, т.к. при копировании могут выявляться некоторые ошибки.

Также не забываем, что мы в самом начале подключаем библиотеку LiquidCrystal, которую вы можете скачать в разделе Библиотеки на нашем сайте.

/*
 ###  Самые простые часы на Arduino UNO ###

 Для проекта часов нужны только жк-дисплей 16х2 LCD и 2 кнопки
 Никаких потенциометров для контраса, никаких резисторов 
 Функции кнопок:
 
 - короткое нажатие одной из кнопок включает подсветку на 30 с
 
 Настройка времени
 - Нажмите H для увеличения Часов
 - Нажмите M для увеличения Минут и сброса секунд
*/

#include "LiquidCrystal.h"

// Определяем соединение ЖК-дисплея с цифровыми контактами
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// Настройка контрастности ЖК
int cs=9;// пин 9 для контраста ШИМ
const int contrast = 100;// контраст по умолчанию

// Начальное отображение времени 12:59:45 PM
int h=12;
int m=59;
int s=45;
int flag=1; //PM

// Кнопки установки времени
int button1;
int button2;

// Определение пинов для Кнопок установки времени
int hs=0;// pin 0 для настройки Часов
int ms=1;// pin 1 для настройки Минут

// Тайм-аут подсветки 
const int Time_light=150;
int bl_TO=Time_light;// Тайм-аут подсветки
int bl=10; // Пин подсветки
const int backlight=120; // НЕ БОЛЕЕ 7mA !!!

// Для точного считывания времени используйте часы реального времени Arduino, а не только задержку delay()
static uint32_t last_time, now = 0; // RTC

void setup()
{
  lcd.begin(16,2);
  pinMode(hs,INPUT_PULLUP);// избегать внешних Pullup резисторов для кнопки 1
  pinMode(ms,INPUT_PULLUP);// и кнопки 2
  analogWrite(cs,contrast);// Настроить контрастность VO
  analogWrite(bl,backlight);// Включить подсветку 
  now=millis(); // читать начальное значение RTC  
}

void loop()
{ 
  lcd.begin(16,2);// каждую секунду
// Обновить ЖК-дисплей
// Вывести время TIME в Hour, Min, Sec + AM/PM (часы, минуты, секунды)
 lcd.setCursor(0,0);
 lcd.print("Time ");
 if(h<10)lcd.print("0");// всегда 2 цифры
 lcd.print(h);
 lcd.print(":");
 if(m<10)lcd.print("0");
 lcd.print(m);
 lcd.print(":");
 if(s<10)lcd.print("0");
 lcd.print(s);

 if(flag==0) lcd.print(" AM");
 if(flag==1) lcd.print(" PM");
 
 lcd.setCursor(0,1);// для Line 2
 lcd.print("Precision clock");

// улучшенная замена delay(1000) 
// гораздо лучшая точность, менее зависимая от времени выполнения цикла

for ( int i=0 ;i<5 ;i++)// сделать 5-кратный цикл 200 мс, для более быстрого ответа кнопок
{
  while ((now-last_time)<200) //задержка delay 200ms
  { 
    now=millis();
  }
 // внутренний цикл 200ms
 last_time=now; // готовим следующий цикл 

 // read Setting Buttons (читаем кнопки настройки)
 button1=digitalRead(hs);// Read Buttons
 button2=digitalRead(ms);

 //Время подсветки 
 bl_TO--;
 if(bl_TO==0)
 {
  analogWrite(bl,0);// ВЫКЛ подсветки
  bl_TO++;
 }
 
 // Нажмите что-либо, чтобы активировать подсветку 
 if(  ((button1==0)|(button2==0)) & (bl_TO==1)  )
 {
  bl_TO=Time_light;
  analogWrite(bl,backlight);
  // дождитесь отпускания кнопки
  while ((button1==0)|(button2==0))
  {
   button1=digitalRead(hs);// Read Buttons
   button2=digitalRead(ms);
  }
 }
 else
 // Поведение Кнопки 1 или Кнопки 2 пока подсветка ВКЛ 
 {
  if(button1==0){
   h=h+1;
   bl_TO=Time_light;
   analogWrite(bl,backlight);
  }

 if(button2==0){
  s=0;
  m=m+1;
  bl_TO=Time_light;
  analogWrite(bl,backlight);
  }

/* ---- управлять секундами, минутами, часами am / pm ----*/
 if(s==60){
  s=0;
  m=m+1;
 }
 if(m==60)
 {
  m=0;
  h=h+1;
 }
 if(h==13)
 {
  h=1;
  flag=flag+1;
  if(flag==2)flag=0;
 }

 if((button1==0)|(button2==0))// Обновить дисплей, если нажата кнопка
 {
  // Обновить ЖК
  // Вывести время TIME в часах, минутах, секундах + AM/PM
  lcd.setCursor(0,0);
  lcd.print("Time ");
  if(h<10)lcd.print("0");// всегда 2 цифры
  lcd.print(h);
  lcd.print(":");
  if(m<10)lcd.print("0");
  lcd.print(m);
  lcd.print(":");
  if(s<10)lcd.print("0");
  lcd.print(s);

  if(flag==0) lcd.print(" AM");
  if(flag==1) lcd.print(" PM");
 
  lcd.setCursor(0,1);// для Line 2
  lcd.print("Precision clock");
 }

 } // end if else
}// end for

// outer 1000ms loop (завершение цикла)
 s=s+1; //увеличение секунд
        
// ---- управлять секундами, минутами, часами + am/pm ----
 if(s==60){
  s=0;
  m=m+1;
 }
 if(m==60)
 {
  m=0;
  h=h+1;
 }
 if(h==13)
 {
  h=1;
  flag=flag+1;
  if(flag==2)flag=0;
 }  
// Loop end (конец цикла)
}

Wiring DS1307 RTC module to Arduino UNO

Let’s hook the RTC up to the Arduino.

Connections are fairly simple. Start by connecting VCC pin to the 5V output on the Arduino and connect GND to ground.

Now we are remaining with the pins that are used for I2C communication. Note that each Arduino Board has different I2C pins which should be connected accordingly. On the Arduino boards with the R3 layout, the SDA (data line) and SCL (clock line) are on the pin headers close to the AREF pin. They are also known as A5 (SCL) and A4 (SDA).

If you have a Mega, the pins are different! You’ll want to use digital 21 (SCL) and 20 (SDA). Refer below table for quick understanding.

SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

The following diagram shows you how to wire everything.


Wiring DS1307 RTC module with Arduino

DS3231 RTC Module Features and Specifications

  • Operating Voltage: 2.3 – 5.5 Volts
  • Operating Temperature: -45 – 800C
  • Maximum Voltage: VCC+0.3 Volts
  • Battery Backup Current: 500 mA
  • Accuracy at -40 – 800C: ±3.5 ppm
  • Accuracy at 0 – 400C: ± 2.0 ppm
  • Temperature Accuracy: 30C
  • Package-Type: 16, 300-mil SO package

Detailed Features

Some of the detailed features are listed below:

  • Can function with low voltages
  • A programmable Square-wave output as per requirement
  • A battery backup to stay updated even if there is no power
  • A dual-directional, 400 kHz of I2C interface for speedy transmission
  • 32 bytes of EEPROM for to read/write or to save data
  • 2 Time-of-day alarm clocks
  • A pushbutton to reset time
  • RTC can be used either in 12hrs or 24hrs format
  • An aging trim register to set a user-provided value as an offset with reference to the factory value
  • Maintains seconds, minutes, hours, days, weeks, months, years information
  • Switches automatically from a power source to an in-built battery source

Скачать популярные библиотеки Arduino IDE на русском

Пользовательские библиотеки создаются разработчиками модулей и плат расширений для Ардуино. Большинство популярных библиотек Ардуино скачать можно на сайте GitHub. Это сервис для совместной разработки IT-проектов, где можно отследить историю изменений исходного кода. Чтобы пройти уроки Ардуино для начинающих, все необходимые для занятий библиотеки Arduino UNO можно скачать здесь:

Список пользовательских библиотек Arduino:

TroykaCurrent — перевод аналоговых значений в Амперы (скачать TroykaCurrent.h)

RotaryEncoder — работа с модулем энкодера (скачать RotaryEncoder.h)

Adafruit NeoPixel — работа с адресной лентой (скачать Adafruit_NeoPixel.h)

Fast LED — работа с адресной лентой ws2812b (скачать FastLED.h)

TroykaMQ — работа с датчиками газа MQ (скачать TroykaMQ.h)

MQ-2 sensor — работа с датчиком газа MQ2 (скачать MQ2.h)

LCD 1602 I2C — библиотека для дисплея 1602 I2C (скачать LiquidCrystal_I2C.h)

LCD 1602 I2C RUS — русификация дисплея 1602 I2C (скачать LCD_1602_RUS.h)

OLED I2C — библиотека для OLED дисплея (русифицированная) (скачать OLED_I2C.h)

SFE_BMP180 — библиотека для датчика давления BMP180 (скачать SFE_BMP180.h)

SD.h — библиотека для работы с sd картой памяти (скачать SD.h)

Other functions

temperature(void)

Description

Returns the RTC temperature.

Parameters

None.

RTC temperature as degrees Celsius times four. (int)

int t = RTC.temperature();
float celsius = t / 4.0;
float fahrenheit = celsius * 9.0 / 5.0 + 32.0;

squareWave(SQWAVE_FREQS_t freq)

Description

Enables or disables the square wave output.

Parameters

freq: a value from the SQWAVE_FREQS_t enumeration above. (SQWAVE_FREQS_t)

None.

RTC.squareWave(SQWAVE_1_HZ);	//1 Hz square wave
RTC.squareWave(SQWAVE_NONE);	//no square wave
Description

Returns the value of the oscillator stop flag (OSF) bit in the control/status register which indicates that the oscillator is or was stopped, and that the timekeeping data may be invalid. Optionally clears the OSF bit depending on the argument passed. If the argument is omitted, the OSF bit is cleared by default. Calls to and also clear the OSF bit.

Parameters

clearOSF: an optional true or false value to indicate whether the OSF bit should be cleared (reset). If not supplied, a default value of true is used, resetting the OSF bit. (bool)

Как считывать и рассчитывать время в бинарных часах

Я думаю вы знакомы с бинарными (двоичными) числами, которые включают в себя 0 и 1. Используя эти две цифры, мы можем показывать время, также мы можем конвертировать двоичные числа в десятичные. Используя числа 8 4 2 1 (написанные на нашей печатной плате (см. рисунок) справа), мы можем конвертировать двоичные числа в десятичные.

К примеру, двоичное число 1010 – это десятичное 10. Как это можно определить? Начинаем с самого значимого разряда, он у нас крайний слева в числе 1010 и он равен 1, следовательно нужно умножить 1 на 8. Потом следующий разряд нужно умножить на 4 (он у нас 0, поэтому к сумме ничего не добавляется), затем следующий разряд нужно умножить на 2 (он у нас 1) и крайний справа разряд нужно умножить на 1 и потом все это сложить.

Итого получаем:

А если в расширенном варианте (по всем правилам):

Теперь, если мы увидим следующую картину на наших часах, мы можем легко перевести ее в привычное время.

Как указывалось выше, у нас 6 столбцов и 4 строки светодиодов. Каждые два столбца используются, соответственно, для отображения часов (HH), минут (MM) и секунд (SS). На правой стороне печатной платы мы видим цифры 1, 2, 4 и 8, которые облегчают нам перевод двоичного числа в десятичное.

Теперь рассмотрим как правильно считать время на наших бинарных часах, показанное на предыдущем рисунке. Мы видим, что в первом столбце у нас нет горящих светодиодов, это означает:

В следующем столбце мы видим один горящий светодиод в первой строке, следовательно, в соответствии с цифрами 8 4 2 1 имеем:

То есть число часов (HH), равно 1.

В первом столбце для минут (MM ) мы видим один горящий светодиод в первой строке:

То есть получаем 10 минут потому что этот столбец обозначает десятки минут.

Во втором столбце для минут (MM) мы видим один светодиод, горящий в строке напротив цифры 8, следовательно, имеем:

Таким образом, в сумме мы получили 18 минут.

В первом столбце для секунд (SS) мы видим один горящий светодиод в строке напротив цифры 4, следовательно, получаем:

Во втором столбце для секунд (SS) мы видим два горящих светодиода в строках напротив цифр 4 и 1, следовательно, получаем:

Таким образом, мы получили в сумме 45 секунд.

В итоге мы получили время 01:18:45.

Подключение DS3231 к Ардуино

Общение с DS3231 осуществляется по линиям I2C. Схема подключения RTC модуля на DS3231 к Ардуино Уно приведена ниже.

Подключение DS3231 к Ардуино для работы с будильником

Если бы нас интересовало только текущее время, то достаточно было бы подключить VCC, GND, SCL и SDA модуля к соответствующим выводам Ардуино. В данном же случае нам нужен ещё вывод INT/SQW. На нём будет генерироваться сигнал запроса прерывания для пробуждения микроконтроллера. Поэтому проще всего подключить его к входу внешнего прерывания, для УНО это D2 и D3. Хотя можно использовать и другие выводы, разрешив на них PCINT.

Кстати, на моём модуле не было вывода INT/SQW. При этом в штыревом разъеме один из выводов был не задействован. Я подпаял его к третьей ножке микросхемы DS3231 (это и есть INT/SQW) и получил нужный мне вывод на штыревом разъеме модуля.

Добавление недостающего вывода INT/SQW на модуле DS3231

Примеры

  • TimeArduinoDue — Синхронизация времени с помощью RTC (для Arduino Due)
  • TimeGPS — Синхронизация времени с помощью GPS
  • TimeNTP — Синхронизация времени с помощью NTP-сервера
  • TimeNTP ESP8266WiFi — Синхронизация времени с помощью NTP-сервера и WiFi
  • TimeRTC — Синхронизация времени с помощью RTC (для остальных Arduino)
  • TimeRTCLog — Учет изменений состояний на контактах с помощью RTC
  • TimeRTCSet — Установка RTC-времени
  • TimeSerial — Настройка библиотеки Time при помощи последовательного порта
  • TimeSerialDateStrings — Настройка библиотеки Time при помощи последовательного порта (со строковыми сообщениями)
  • TimeTeensy3 — Синхронизация времени с помощью RTC на Teensy

Схема проекта

Схема часов на Arduino и 4-х разрядном семисегментном индикаторе представлена на следующем рисунке.

В следующей таблице представлены необходимые соединения между модулем часов реального времени и платой Arduino Uno.

DS3231 Arduino Uno
VCC 5V
GND GND
SDA A4
SCL A5

В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595 и платой Arduino Uno.

Регистр сдвига 74HC595 Arduino Uno
11-SH_CP (SRCLK) 6
12-ST_CP (RCLK) 5
14-DS (Data) 4
13-OE(Latch) GND
8-GND GND
10-MR(SRCLR) +5V
16-VCC +5V

В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595, 4-х разрядным семисегментным дисплей и платой Arduino Uno.

4-х разрядный семисегментный дисплей Регистр сдвига 74HC595 Arduino Uno
A Q0
B Q1
C Q2
D Q3
E Q4
F Q5
G Q6
D1 10
D2 11
D3 12
D4 9

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Модуль часов реального времени DS3231

Внешний вид данного модуля представлен на следующем рисунке.

Модуль предназначен для хранения времени и даты даже когда общее питание схемы выключено – для этой цели в его состав входит элемент питания CR2032. В состав модуля DS3231 входит также датчик температуры, поэтому его можно использовать в различных встраиваемых устройствах, например, в цифровых часах с индикатором температуры и т.д. Модуль работает по интерфейсу I2C. На нашем сайте вы можете посмотреть следующие проекты с использованием данного модуля:

  • автоматический напоминатель приема лекарств на Arduino;
  • автоматическая кормушка для животных на Arduino;
  • логгер данных (температуры, влажности) на SD карту и компьютер с помощью Arduino.

Назначение контактов (распиновка) модуля DS3231 приведена в следующей таблице.

Наименование контакта Назначение контакта
VCC напряжение питания
GND общий провод (земля)
SDA контакт последовательной передачи данных (I2C)
SCL контакт синхронизации (тактирования) (I2C)
SQW выход прямоугольного сигнала (программируемый меандр)
32K выход меандра с частотой 32.768кГц

Теперь перейдем непосредственно к схеме нашего проекта.

Temperature Compensated Crystal Oscillator(TCXO)

Most RTC modules come with an external 32kHz crystal for time-keeping. But the problem with these crystals is that external temperature can affect their oscillation frequency. This change in frequency can be negligible but it surely adds up.

To avoid such slight drifts in crystal, DS3231 is driven by a 32kHz temperature compensated crystal oscillator (TCXO). It’s highly immune to the external temperature changes.

TCXO is packaged inside the RTC chip, making the whole package bulky. Right next to the integrated crystal is a temperature sensor.

This sensor compensates the frequency changes by adding or removing clock ticks so that the timekeeping stays on track.

That’s the reason TCXO provides a stable and accurate reference clock, and maintains the RTC to within ±2 minutes per year accuracy.

DS3231 Vs DS1307

The main difference between the DS3231 and DS1370 is the accuracy of time-keeping.

DS1307 comes with an external 32kHz crystal for time-keeping whose oscillation frequency is easily affected by external temperature. This usually results with the clock being off by around five or so minutes per month.

However, the DS3231 is much more accurate, as it comes with an internal Temperature Compensated Crystal Oscillator(TCXO) which isn’t affected by temperature, making it accurate down to a few minutes per year at the most.

DS1307 is still a great value RTC and serves you well, but for projects that require more accurate time-keeping, DS3231 is recommended.