DS3231 – подключение часов реального времени | RadioLaba.ru
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include <P16F628A.INC>
LIST p=16F628A
__CONFIG H’3F10′ ;Конфигурация микроконтроллера
errorlevel -302 ;не выводить сообщения с ошибкой 302 в листинге
Sec equ 0020h ;вспомогательные регистры счета
Sec1 equ 0021h ;
Sec2 equ 0022h ;
scetbit equ 0024h ;вспомогательный регистр счета кол-ва бит
perem equ 0025h ;вспомогательный регистр приема/передачи байта по spi, i2c
temp equ 0026h ;регистр температуры
perem_1 equ 0027h ;вспомогательный регистр двоично-десятичного преобр.
result equ 0028h ;вспомогательный регистр двоично-десятичного преобр.
dat_ind equ 0029h ;регистр данных для передачи по протоколу spi
adr_ind equ 002Ah ;регистр адреса для передачи по протоколу spi
second equ 002Bh ;регистр хранения секунд для установки времени
minut equ 002Ch ;регистр хранения минут для установки времени
hour equ 002Dh ;регистр хранения часов для установки времени
adr_i2c equ 002Eh ;регистры подпрограммы передачи данных интерфейса i2c
tmp_i2c equ 002Fh
slave_adr equ 0030h
data_i2c equ 0031h
flag equ 007Fh ;регистр флагов
#DEFINE int PORTB,0 ;линия прерывания INT/SQW DS3231
#DEFINE sda PORTB,1 ;линия SDA для подключения DS3231
#DEFINE scl PORTB,2 ;линия SCL для подключения DS3231
#DEFINE sda_io TRISB,1 ;направление линии SDA
#DEFINE scl_io TRISB,2 ;направление линии SCL
#DEFINE datai PORTB,5 ;линия входа данных драйвера MAX7219
#DEFINE cs PORTB,6 ;линия выбора драйвера MAX7219
#DEFINE clk PORTB,7 ;линия тактирования драйвера MAX7219
#DEFINE led PORTB,4 ;светодиод ошибки i2c
#DEFINE led_sec PORTB,3 ;светодиод индикации хода часов 1Гц
#DEFINE regim PORTA,2 ;кнопка Индикация — смены режима индикации
#DEFINE nast PORTA,3 ;кнопка Настройка — входа в режим настройки времени
#DEFINE ust PORTA,4 ;кнопка Установка — установка значения часов
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 0000h ;начать выполнение программы с адреса 0000h
goto Start ;переход на метку Start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Основная программа
Start movlw b’00000000′ ;установка значений выходных защелок порта A
movwf PORTA ;
movlw b’01000000′ ;установка значений выходных защелок порта B
movwf PORTB ;
movlw b’00000111′ ;выключение компараторов
movwf CMCON ;
bsf STATUS,RP0 ;выбрать 1-й банк
movlw b’00000111′ ;настройка линий ввода\вывода порта B
movwf TRISB ;RB0-RB2 — на вход, остальные на выход
movlw b’11111111′ ;настройка линий ввода\вывода порта A
movwf TRISA ;все линии на вход
bcf STATUS,RP0 ;выбрать 0-й банк
clrf flag ;сброс регистра флагов
call init_lcd ;вызов подпрограммы инициализации драйвера (MAX7219)
call viv_not ;вывод на индикаторы символов тире » —— «
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movlw b’11010000′ ;адрес устройства (DS3231)
movwf slave_adr
;Запись 4-х байт в регистры приема/передачи по i2c
;здесь выполняется настройка 1-го будильника, сигнал каждую секунду
movlw data_i2c ;установка первого регистра приема/передачи по i2c
movwf FSR ;
movlw b’10000000′ ;данные для регистра секунд 1-го будильника
movwf INDF ;
incf FSR,F ;
movlw b’10000000′ ;данные для регистра минут 1-го будильника
movwf INDF ;
incf FSR,F ;
movlw b’10000000′ ;данные для регистра часов 1-го будильника
movwf INDF ;
incf FSR,F ;
movlw b’10000000′ ;данные для регистра даты/дня недели 1-го будильника
movwf INDF ;
movlw . 4 ;передача 4-х байта по i2c
movwf tmp_i2c ;
movlw 0x07 ;установка адреса регистра секунд 1-го будильника
movwf adr_i2c ;
call write_i2c ;вызов подпрограммы записи по интерфейсу i2c
call err_prov ;проверка на ошибки записи/чтения I2C
movlw .1 ;передача 1-го байта по i2c
movwf tmp_i2c ;
movlw 0x0E ;установка адреса регистра Control
movwf adr_i2c ;
movlw data_i2c ;установка первого регистра приема/передачи по i2c
movwf FSR ;
movlw b’00000101′ ;запуск тактового генератора, запрет функционирования вывода INT/SQW для
movwf INDF ;режима питания от батареи, частота импульсов на выходе INT/SQW 1Гц,
;выход INT/SQW задействован для генерации прерываний по будильнику,
;разрешение прерываний по 1-му будильнику
call write_i2c ;вызов подпрограммы записи по интерфейсу i2c
call err_prov ;проверка на ошибки записи/чтения I2C
met_2 movlw . 1 ;передача 1-го байта по i2c
movwf tmp_i2c ;
movlw 0x0F ;установка адреса регистра Status
movwf adr_i2c ;
movlw data_i2c ;установка первого регистра приема/передачи по i2c
movwf FSR ;
movlw b’00000000′ ;сброс бита OSF, запрет генерирования импульсов на выходе EN32kHz,
movwf INDF ;сброс флагов прерываний будильников A2F, A1F
call write_i2c ;вызов подпрограммы записи по интерфейсу i2c
call err_prov ;проверка на ошибки записи/чтения I2C
met_1 btfsc int ;опрос линии прерывания будильника
goto met_3 ;
bsf led_sec ;включение светодиода индикации хода часов
goto met_4 ;
met_3 bcf led_sec ;выключение светодиода индикации хода часов
btfsc nast ;опрос кнопки настройки часов
goto met_5 ;
call nast_time ;вызов подпрограммы установки времени
goto met_2 ;
met_5 btfsc regim ;опрос кнопки режима индикации
goto met_1 ;
met_6 call paus_knp ;
btfss regim ;
goto met_6 ;
btfss flag,2 ;изменение значения флага режима индикации
goto met_7 ;
bcf flag,2 ;сброс флага индикации, режим отображения часов
goto met_1 ;
met_7 bsf flag,2 ;установка флага индикации, режим отображения температуры и часов
goto met_1 ;
met_4 movlw . 1 ;передача 1-го байта по i2c
movwf tmp_i2c ;
movlw 0x11 ;установка адреса старшего регистра температуры
movwf adr_i2c ;
call read_i2c ;вызов подпрограммы чтения по I2C
call err_prov ;проверка на ошибки записи/чтения I2C
movf INDF,W ;копирование значения температуры в регистр temp
movwf temp
rd_time movlw .3 ;передача 3-х байт по i2c
movwf tmp_i2c ;
movlw 0x00 ;установка адреса регистра секунд
movwf adr_i2c ;
call read_i2c ;вызов подпрограммы чтения по I2C
call err_prov ;проверка на ошибки записи/чтения I2C
btfsc flag,2 ;опрос флага режима индикации
goto met_8 ;
call vivod ;вызов подпрограммы вывода значения часов на цифровое табло
goto met_2 ;
met_8 call vivod_temp ;вызов подпрограммы вывода температуры и часов на цифровое табло
goto met_2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Цифровые часы Arduino без RTC в Tinkercad
Цифровые часы Arduino без RTC Модуль часов реального времени в Tinkercad
Введение
В этом проекте я сделал простые цифровые часы с использованием Arduino без модуля RTC и построил симулятор в среде Tinkercad.
Этот проект представляет собой цифровые часы Arduino без использования модуля часов реального времени. Просто, если вам нужно рассчитать реальное время, вы можете купить небольшой модуль часов реального времени, подключить его к Arduino и получить точное реальное время.
Но если ваше приложение настолько простое и вам нужно просто посмотреть время, то вы можете принять небольшую ошибку и использовать Arduino для расчета времени в программном обеспечении. Что мы и сделали в этом проекте.
Если вам нравится этот проект, пожалуйста, проголосуйте за него и подпишитесь на мою рассылку новостей на AeroArduino.com и на мой канал YouTube.
Компоненты
Поскольку мы используем Tinkercad Simulation, нам не нужно покупать какие-либо компоненты или даже программное обеспечение. Tinkercad — это бесплатная онлайн-среда. Он поставляется со многими платами Arduino, блоками питания, датчиками и исполнительными механизмами.
Итак, единственное, что вам нужно использовать, это зайти на сайт www. tinkercad.com и построить наши схемы.
Вы также можете собрать свою реальную схему, поэтому вот необходимые компоненты:
Плата Arduino UNO
16×2 LCD
2 кнопки для ввода
Резисторы
Провода
компоненты, которые вам понадобятся в Tinkercad, а также в реальном мире, если вы собираетесь построить физическую схему.Контур
Здесь мы собираемся выбрать компоненты в среде Tinkercad и соединить их вместе.
Опять же, то же самое соединение применяется к физической цепи.
Сначала мы открываем Tinkercad.com
Создайте новую учетную запись, если у вас ее нет, и войдите в систему.
Затем мы выбираем Circuits на вкладке в левом верхнем углу экрана.
Затем у нас есть чистый лист, на котором мы можем разместить наши компоненты схемы.
Вы можете увидеть панель поиска в правом верхнем углу. Здесь вы можете ввести нужные компоненты.
Начнем с ввода Arduino. Заметим, что платы Arduino начинаются ниже строки поиска. Выбираем плату Arduino UNO. Затем помещаем его на чистый лист.
Тогда мы пишем LCD. Мы находим ЖК-дисплей, выбираем его и помещаем.
Вы можете подключить цепь с помощью проводов. Провода подключаются в программе Tinkercad с помощью нажатия на нужный контакт и удержания его на другом контакте.
Теперь мы подключаем ЖК-дисплей к плате Arduino UNO.
Мы подключаем один контакт ЖК-дисплея к Arduino, используя четырехконтактную конфигурацию, как в схеме выше.
Подключаем резисторы и кнопки.
Теперь мы завершили подключение схемы в Tinkercad.
Программное обеспечение
Вот код, использующий библиотеку LCD.
Теперь нам нужно запрограммировать плату Arduino UNO в среде Tinkercad с помощью этого кода, чтобы начать его выполнение.
На вкладке «Код» в правом верхнем углу щелкните раскрывающееся меню и выберите только текст. Когда вам будет предложено предупредить, что вы собираетесь удалить все блоки, вы нажимаете «Продолжить».
Затем вы вставляете приведенный выше код в лист программного обеспечения.
Теперь вы готовы начать выполнение схемы.
Simulation
Теперь нажмите кнопку Start Simulation, чтобы начать моделирование.
Вы видите, что Arduino подключен к USB-порту на экране, и это указывает на то, что он включен и начал выполнение программного обеспечения.
Если все шаги выполнены правильно, на ЖК-дисплее отобразится время 12:00:00.
Поздравляем, вы только что построили схему Arduino, которая отображает время в Tinkercad.
Теперь вы можете начать установку времени с помощью кнопок.
Теперь вы можете построить схему, используя реальные компоненты.
Вы можете посмотреть видео и подписаться на мой канал.
Читайте об этом проекте на моем сайте AeroArduino.com
Часы реального времени с отображением температуры на Arduino
— Реклама —
Этот проект демонстрирует, как можно построить часы реального времени (RTC) с дисплеем температуры, используя Arduino, микросхему RTC DS3231 и OLED-дисплей SSD1306 (128×64 пикселей).
Чип DS3231 RTC более точен, чем DS1307, а также имеет встроенный датчик температуры. Он поддерживает отсчет времени даже при отключении основного источника питания. Он использует интерфейс I2C для связи с ведущим устройством (микроконтроллером), в данном случае с Arduino.
DS3231 и SSD1306 OLED используют одну и ту же шину I2C, но микроконтроллер может обмениваться данными только с одним из них одновременно, в зависимости от отправленного адреса. Адрес DS3231 RTC — 0×68, а адрес SSD1306 OLED — 0×3C.
На рис. 1 показан авторский прототип, а на рис. 2 показана блок-схема схемы.
Рис. 1: Авторский прототипРис. 2: Блок-схема проектаСхема и работа
Принципиальная схема часов реального времени Arduino с индикацией температуры показана на рис. 3. Она построена на основе Arduino Uno (Board1), регулятора 5V 7805 (IC1), 2.4 см OLED-дисплей SSD1306 (DIS1), модуль DS3231 RTC (RTC1) и несколько других компонентов.
SSD1306 OLED-дисплей
OLED (органический светоизлучающий диод) представляет собой плоское светоизлучающее устройство, разработанное с использованием тонких органических пленок, последовательно соединенных между двумя электрическими проводниками. OLED-дисплей, используемый в этом проекте, показан на рис. 4. Он имеет улучшенное качество изображения, полный угол обзора, высокую яркость, лучшую контрастность, широкий цветовой диапазон и низкое энергопотребление. Он более эффективен и надежен по сравнению с простым ЖК-дисплеем.
Рис. 4: Модуль дисплея SSD1306 OLEDОн в основном используется в таких цифровых устройствах отображения, как компьютерные мониторы, мобильные телефоны, портативные видеоигры и телевизионные экраны. Он легко доступен на рынке, а также в интернет-магазинах.
Модуль дисплея подключается к Arduino с помощью четырех проводов — двух для питания и еще двух для данных, что делает проводку очень простой. Соединение для передачи данных основано на интерфейсе I2C (межинтегральная схема), который также известен как TWI (двухпроводной интерфейс).
Модуль DS3231 RTC
Модуль DS3231 — это недорогие высокоточные часы реального времени, которые могут отображать время в часах, минутах и секундах, а также информацию о дне, месяце и годе. Он имеет автоматическую компенсацию високосных лет и месяцев с менее чем 31 днем.
Модуль может работать как от 3,3 В, так и от 5 В, что делает его подходящим для многих платформ разработки или микроконтроллеров. Вход батареи составляет 3 В, и типичная батарея CR2032 3 В может питать модуль и хранить информацию более года. Используемый в этом проекте модуль DS3231 (спереди и сзади) показан на рис. 5.9.0003 Рис. 5: Модуль RTC DS3231
Протокол связи I2C, используемый в модуле, упрощает подключение к плате Arduino. Все, что нам нужно, это четыре контакта: контакты VCC и GND для питания модуля и контакты SDA и SCL для связи I2C.
Блок питания
Регулируемый блок питания состоит из двухполупериодного выпрямителя, построенного на основе диодов 1N4007 (D1 и D2), двух конденсаторов (C1 и C2), регулятора напряжения 5 В 7805 (IC1) и 230 В пер. 0-12 В, 500 мА вторичный понижающий трансформатор (X1). В проекте требуется два источника питания: 12 В постоянного тока для разъема питания Arduino Uno и 5 В для DS3231 RTC и модуля SSD1306 OLED.
Arduino Uno
Сердцем проекта является плата Arduino Uno R3, основанная на микроконтроллере ATmega328/ATmega328P. Он имеет 14 цифровых входов/выходов (I/O), шесть аналоговых входов, флэш-память 32 КБ, кварцевый генератор 16 МГц, соединение USB, разъем питания, разъем ICSP, кнопку сброса и другие. Его можно запрограммировать с помощью программного обеспечения Arduino IDE.
В схеме есть две кнопки: S1 для настройки и S2 для изменения режима. Они используются для установки времени и даты часов реального времени. Заземляющее соединение Arduino должно быть подключено к заземлению модуля RTC1 и модуля дисплея DIS1.
Конструкция и тестирование
После выполнения всех подключений проверьте работу схемы, нажав кнопку режима (S2), а затем отпустите ее. Курсор на дисплее будет мигать в поле дня недели. Нажмите и удерживайте кнопку установки (S1), чтобы перейти от дня недели к следующему дню с частотой 5 Гц, или сделайте короткое нажатие, чтобы перейти к следующей настройке.
Нажмите и отпустите кнопку режима (S2), чтобы переместить курсор в поле месяца. Нажмите и удерживайте кнопку настройки (S1), чтобы быстро прокрутить месяцы, или сделайте короткое нажатие, чтобы перейти к следующей настройке. Нажмите и отпустите кнопку S2, чтобы переместить курсор в поле даты. Нажмите и удерживайте кнопку S1, чтобы быстро прокрутить даты, или сделайте короткое нажатие, чтобы перейти к следующей настройке.
Обратите внимание, что микросхема RTC знает правильное количество дней в каждом месяце. Нажмите и отпустите кнопку S2, чтобы переместить курсор в поле года. Нажмите и удерживайте кнопку S1, чтобы быстро прокрутить годы, или сделайте короткое нажатие, чтобы перейти к следующей настройке. Допустимые диапазоны: от 2000 до 2099. Чип RTC автоматически отслеживает високосные годы. Когда вы впервые включите часы, дата будет 1 января 1900 года. Просто переведите год на правильное значение.
Нажмите и отпустите кнопку S2, чтобы перевести курсор в поле часов. Нажмите и удерживайте кнопку S1, чтобы быстро прокрутить часы, или сделайте короткое нажатие, чтобы перейти к следующей настройке. Часы в проекте используют только 24-часовой режим. Нажмите и отпустите кнопку S2, чтобы переместить курсор в поле минут. Нажмите и удерживайте кнопку S1, чтобы быстро прокрутить минуты, или сделайте короткое нажатие, чтобы перейти к следующей настройке. Нажмите и отпустите кнопку S2, чтобы переместить курсор в поле секунд. Кратковременно нажмите кнопку S2, чтобы обнулить секунды, или удерживайте кнопку, чтобы зафиксировать секунды на нуле, и отпустите, чтобы синхронизироваться с внешним источником времени. Чип DS3231 RTC имеет встроенный датчик температуры.
Таким образом, он показывает время, дату и год вместе с показаниями температуры (см. рис. 6).
Рис. 6: Цифровые часы с индикатором температурыПрограммное обеспечение
Работа схемы управляется программой (main_code. ino), загруженной во внутреннюю память Arduino Uno. В программе реализованы все необходимые функции.
Программа/скетч написана на языке программирования Arduino. Arduino IDE версии 1.8.11 используется для компиляции и загрузки программы на плату Arduino.
В этом проекте для программирования требуются следующие заголовочные файлы в main_code.ino:
#include
#include
#include
Для кода Arduino (main_code.ino) требуются две внешние библиотеки: Adafruit-GFX-Library-master.zip и Adafruit_SSD1306-master.zip. Вам необходимо включить их в Arduino IDE перед компиляцией и загрузкой кода на плату Arduino.
Схема печатной платы часов реального времени Arduino с дисплеем температуры показана на рис. 7, а схема расположения компонентов на рис. 8.
Рис. 7: Схема печатной платы часов реального времени с дисплеем температурыРис. 8: Компоновка компонентов печатной платыЗагрузить PDF-файлы печатной платы и компоновки компонентов:
щелкните здесьЗагрузить
Исходный код После сборки схемы на печатной плате подключите контакты Arduino Uno к печатной плате с помощью перемычек.