Делаем самостоятельно будильник на Arduino
27 августа в 12:03
Узнаем как реализовать на основе Arduino будильник с помощью модуля RTC DS3231.
В этой статье мы собираемся сделать Ардуино будильник, в котором мы будем использовать модуль RTC DS3231, чтобы получить текущее время и дату, а OLED покажет это время и дату.
Мы будем использовать библиотеку EEPROM для хранения времени будильника, которое мы будем вводить, используя модуль клавиатуры 4X4.
Когда новое введенное время будильника будет соответствовать текущему времени будильника, тогда зуммер начнет подавать звуковой сигнал, пока мы не удержим клавишу “C” на клавиатуре. Клавиша “#” будет использоваться для изменения пароля.
Необходимыми компонентами для устройства будильника Arduino являются:
- Arduino Uno
- 128X32 Монохромный OLED дисплей
- Модуль RTC DS3231
- 4X4 клавиатура
- 9В аккумулятор или батарея
- Зуммер
- Переключатель
- Соединительные провода
Шаг 2. Схема соединения
Принципиальная схема устройства будильника Arduino достаточно большая. Прежде всего, подключите OLED к Arduino. Соединения для OLED с Arduino следующие:
- CS-выход OLED на пин 10 Arduino
- DC-вывод OLED на пин 9 Arduino
- RST вывод OLED на вывод 8 Arduino
- D1 или CLK вывод OLED на вывод 11 Arduino
- D0 или DIN-штырь OLED на вывод 13 Arduino
Затем подключите модуль DS3231 к Arduino. Соединения следующие:
- Подключите GND DS3231 к GND Arduino.
- Подключите VCC DS3231 к 5V Arduino.
- Подключите SDA DS3231 к A4 Arduino.
- Подключите SCL DS3231 к A5 Arduino.
После этого подключите клавиатуру 4X4 к Arduino. Подключите первые 4 контакта клавиатуры, строка A0, A1, A2, A3 и последние четыре, которые относятся к контактам столбца к 6, 5, 4 и 3.
Подключите положительный контакт зуммера к контакту 7 Arduino и отрицательный сигнал зуммера к GND Arduino.
В конце, подключите положительный провод батареи к одному концу переключателя, а другой конец переключателя – к Vin Arduino.
Затем подключите отрицательный провод батареи к заземлению Arduino.
Шаг 3. Код для Ардуино бдильника
Сам код можно скачать или скопировать ниже. Дальше будет объяснение кода и ссылки на скачивание нужных библиотек.
Скачать arduino-budilnik.ino#include #include #include #include #include #include #include DS3231 rtc(SDA, SCL); Time t; #define buz 7 #define OLED_MOSI 11 #define OLED_CLK 13 #define OLED_DC 9 #define OLED_CS 10 #define OLED_RESET 8 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); int Hor, Min, Sec, tim, dat, h, m, s; int ASCII = 48; char key = 0; char buffer[2]; const byte numRows= 4; const byte numCols= 4; char keymap[numRows][numCols]= { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte rowPins[numRows] = {A0, A1, A2, A3}; byte colPins[numCols]= {6, 5, 4, 3}; Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols); void setup() { Wire.begin(); rtc.begin(); pinMode(buz, OUTPUT); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); welcome(); //uncomment these lines to set the date and time //rtc.setDOW(SATURDAY); // Set Day-of-Week to SUNDAY //rtc.setTime(10, 54, 0); // Set the time to 12:00:00 (24hr format) //rtc.setDate(7, 1, 2017); // Day, Month, Year } void loop() { t = rtc.getTime(); Hor = t.hour; Min = t.min; Sec = t.sec; tim = rtc.getTimeStr(); dat = rtc.getDateStr(); char key = myKeypad.getKey(); if (key == 'C'){ digitalWrite(buz, LOW); EEPROM.write(2, ASCII+6); EEPROM.write(3, ASCII); } if(key == '#'){ display.clearDisplay(); display.setCursor(0,0); display.print(“Enter New Time”); display.setCursor(0,10); display.display(); int j =0; int i=0; while( j
Источник: https://ArduinoPlus.ru/arduino-budilnik/
Урок 19. RTC часы с будильником
В предыдущем уроке 18, мы подключили Trema RTC часы реального времени с Trema кнопками и LCD I2C дисплеем к arduino Uno, написали скетч, для установки времени при помощи кнопок.
Теперь расширим функционал получившихся часов, добавив к ним функцию будильника. А код, который будет выполняться при срабатывании будильника выведем в отдельную функцию “Func_alarm_action()”, чтоб Вы смогли легко его найти и изменить. Например, при срабатывании будильника, открывать жалюзи, включать свет или музыку, включить через реле тостер или кофе-машину и т.д.
Нам понадобится:
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C)
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki – Установка библиотек в Arduino IDE.
Видео:
Схема подключения:
Подключение модулей RTC и LCD, данного урока, осуществляется к аппаратным выводам SDA, и SCL.
GND | GND |
Vcc | +5V |
SDA (Serial DAta) | A4 |
SCL (Serial CLock) | A5 |
Подключение кнопок: кнопка «SET» к выводу 2, кнопка «UP» к выводу 3 и копка «DOWN» к выводу 4.
Зуммер подключаем к выводу 5, а светодиод к выводу 13 (дублируя встроенный в arduino).
Алгоритм работы кнопок следующий:
- В режиме вывода даты/времени/будильника (обычный режим):
- Кратковременное нажатие на кнопку SET переключает режимы вывода: даты/времени/будильника
- Удержание кнопки SET переводит часы в режим установки даты/времени/будильника (зависит от того, каким был режим вывода)
- Кнопки UP и DOWN, в режиме вывода будильника, активируют/деактивируют будильник.Если будильник активен, то в правом верхнем углу экрана появляется значок будильника.
- В режиме установки даты/времени/будильника:
- Кратковременное нажатие на кнопку SET – переход между устанавливаемыми параметрами (сек, мин, час, дни, мес, год, д.н.)
- Удержание кнопки SET выводит часы из режима установки
- Каждое нажатие на кнопку UP увеличивает значение устанавливаемого параметра даты или времени
- Каждое нажатие на кнопку DOWN уменьшает значение устанавливаемого параметра даты или времени
- Во время работы сигнализации будильника:
- Удержание любой кнопки в течении 1 секунды, отключает сигнализацию (без выполнения их действий, в любом режиме)
Код программы:
Работа кнопок, вывод и установка времени, описывались в уроке 18, в этом уроке рассмотрим работу будильника:
В начале кода добавляем две константы: PIN_alarm_TONE и PIN_alarm_LED, указывающие номера выводов зуммера и светодиода.
А также добавляем четыре переменные: VAR_alarm_MIN, VAR_alarm_HOUR, VAR_alarm_FLAG1 и VAR_alarm_FLAG2.
- VAR_alarm_MIN – переменная в которой хранится значение минут, при котором сработает будильник (по умолчанию 0 минут)
- VAR_alarm_HOUR – переменная в которой хранится значение часов, при котором сработает будильник (по умолчанию 0 часов)
- VAR_alarm_FLAG1 – флаг разрешения работы будильника, false – не активен, true – активен (по умолчанию true – активен)
- VAR_alarm_FLAG2 – флаг указывающий на то, что будильник сработал “сигнализация” (по умолчанию false – не сработал)
Последняя переменная которую мы добавили – MAS_alarm_SYM, она содержит изображение символа будильника для вывода на дисплей.
В функции loop, после вывода информации на дисплей, добавляем проверку: не пора ли включить будильник?
void loop(){ if(millis()%1000==0){ // если прошла 1 секунда … …
// проверка будильника if(VAR_alarm_FLAG1){ // если будильник включён if(time.seconds==00){ // если в текущем времени 0 секунд if(time.minutes==VAR_alarm_MIN){ // если совпали минуты if(time.Hours==VAR_alarm_HOUR){ // если совпали часы VAR_alarm_FLAG2=true; // устанавливаем флаг разрешающий совершение действий будильника (сигнализация) } } } }else{VAR_alarm_FLAG2=false;} // если будильник выключен, то сбрасываем флаг разрешающий совершение действий будильника (сигнализация) if(VAR_alarm_FLAG2){Func_alarm_action();}// запускаем действия будильника } Func_buttons_control(); // передаём управление кнопкам
}
- если будильник включён (установлен флаг VAR_alarm_FLAG1)
- если в текущем времени 0 секунд (time.seconds==00)
- если количество минут текущего времени (time.minutes) равно количеству минут установленных в будильнике (VAR_alarm_MIN)
- если количество часов текущего времени (time.Hours) равно количеству часов установленных в будильнике (VAR_alarm_HOUR)то устанавливаем флаг VAR_alarm_FLAG2 (указывающий на то, что будильник сработал)
- если установлен флаг VAR_alarm_FLAG2, то запускаем действия будильника (действия описаны в функции Func_alarm_action)Так как проверка будильника и запуск функции Func_alarm_action() находится внутри условия if(millis()%1000==0){…}, то действия будильника будут выполняться один раз в секунду.
Теперь всё готово для создания полного кода:
// Подключаем библиотеки:
#include // подключаем библиотеку для работы с шиной I2C
#include // подключаем библиотеку для работы с LCD дисплеем
#include // подключаем библиотеку для работы с RTC модулем
LiquidCrystal_I2C lcd(0x27,16,2); // объявляем переменную для работы с LCD дисплеем, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
iarduino_RTC time(RTC_DS1307); // объявляем переменную для работы с RTC модулем, указывая название модуля
// Объявляем переменные и константы:
const uint8_t PIN_button_SET = 2; // указываем номер вывода arduino, к которому подключена кнопка SET
const uint8_t PIN_button_UP = 3; // указываем номер вывода arduino, к которому подключена кнопка UP
const uint8_t PIN_button_DOWN = 4; // указываем номер вывода arduino, к которому подключена кнопка DOWN
const uint8_t PIN_alarm_TONE = 5; // указываем номер вывода arduino, к которому подключён зуммер будильника
const uint8_t PIN_alarm_LED = 13; // указываем номер вывода arduino, к которому подключён светодиод uint8_t VAR_mode_SHOW = 1; // режим вывода: 1-время 2-дата 3-время_будильника uint8_t VAR_mode_SET = 0; // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели 8-мин_будильника 9-час_будильника uint8_t VAR_alarm_MIN = 0; // будильник минуты uint8_t VAR_alarm_HOUR = 0; // будильник часы bool VAR_alarm_FLAG1 = true; // будильник разрешение работы bool VAR_alarm_FLAG2 = false; // будильник совершение действий (сигнализация) byte MAS_alarm_SYM[8]={B00000,B01110,B10101,B10111,B10001,B01110,B00000,B00000}; // символ будильника для отображения на дисплее
void setup() { pinMode(PIN_button_SET, INPUT); // устанавливаем режим работы вывода PIN_button_SET, как “вход” pinMode(PIN_button_UP, INPUT); // устанавливаем режим работы вывода PIN_button_UP, как “вход” pinMode(PIN_button_DOWN, INPUT); // устанавливаем режим работы вывода PIN_button_DOWN, как “вход” pinMode(PIN_alarm_TONE, OUTPUT); // устанавливаем режим работы вывода PIN_alarm_TONE, как “выход” pinMode(PIN_alarm_LED, OUTPUT); // устанавливаем режим работы вывода PIN_alarm_LED, как “выход” digitalWrite(PIN_alarm_TONE, LOW); // устанавливаем уровень логического «0» на выводе PIN_alarm_TONE digitalWrite(PIN_alarm_LED, LOW); // устанавливаем уровень логического «0» на выводе PIN_alarm_LED delay(300); // ждем 300мс time.begin(); // инициируем RTC модуль lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея lcd.createChar(1, MAS_alarm_SYM); // загружаем символ будильника под номером 1
}
void loop(){ if(millis()%1000==0){ // если прошла 1 секунда if(VAR_mode_SET==0){ // если дата/время/будильник выводятся, а не устанавливаются lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 lcd.print(“iArduino.ru”); // выводим текст “iArduino.ru” lcd.setCursor(15, 0); // устанавливаем курсор в позицию: столбец 15, строка 0 lcd.print(VAR_alarm_FLAG1?”1″:” “); // выводим значёк будильника }else{ // если дата/время/будильник устанавливаются, а не выводятся lcd.setCursor(0, 0); // устанавливаем курсор в позицию: столбец 0, строка 0 if(VAR_mode_SHOW==1){lcd.print(“Set time:” );} if(VAR_mode_SHOW==2){lcd.print(“Set date:” );} if(VAR_mode_SHOW==3){lcd.print(“Set alarm:”);} } if(VAR_mode_SHOW==1){ // если установлен режим вывода времени lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(time.gettime(“H:i:s”)); // выводим время } if(VAR_mode_SHOW==2){ // если установлен режим вывода даты lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 lcd.print(time.gettime(“d-m-Y D”)); // выводим дату } if(VAR_mode_SHOW==3){ // если установлен режим вывода будильника lcd.setCursor(0, 1); // устанавливаем курсор в позицию: столбец 0, строка 1 if(VAR_mode_SET==0){lcd.print(“Alarm “);} time.gettime(); // обновляем значение переменной time.seconds, для “мигания” устанавливаемым параметром будильника if(VAR_mode_SET==9&&time.seconds%2){lcd.print(” “);}else{if(VAR_alarm_HOUR
Источник: https://lesson.iarduino.ru/page/urok-19-rtc-chasy-s-budilnikom/
Часы реального времени на RTC модулях Ардуино DS1302, DS1307, DS3231
Во многих проектах Ардуино требуется отслеживать и фиксировать время наступления тех или иных событий.
Модуль часов реального времени, оснащенный дополнительной батарей, позволяет хранить текущую дату, не завися от наличия питания на самом устройстве.
В этой статье мы поговорим о наиболее часто встречающихся модулях RTC DS1307, DS1302, DS3231, которые можно использовать с платой Arduino.
Модули часов реального времени в проектах Arduino
Модуль часов представляет собой небольшую плату, содержащей, как правило, одну из микросхем DS1307, DS1302, DS3231.Кроме этого, на плате практически можно найти механизм установки батарейки питания.
Такие платы часто применяется для учета времени, даты, дня недели и других хронометрических параметров. Модули работают от автономного питания – батареек, аккумуляторов, и продолжают проводить отсчет, даже если на Ардуино отключилось питание.
Наиболее распространенными моделями часов являются DS1302, DS1307, DS3231. Они основаны на подключаемом к Arduino модуле RTC (часы реального времени).
Часы ведут отсчет в единицах, которые удобны обычному человеку – минуты, часы, дни недели и другие, в отличие от обычных счетчиков и тактовых генераторов, которые считывают «тики».
В Ардуино имеется специальная функция millis(), которая также может считывать различные временные интервалы. Но основным недостатком этой функции является сбрасывание в ноль при включении таймера.
С ее помощью можно считать только время, установить дату или день недели невозможно. Для решения этой проблемы и используются модули часов реального времени.
Электронная схема включает в себя микросхему, источник питания, кварцевый резонатор и резисторы. Кварцевый резонатор работает на частоте 32768 Гц, которая является удобной для обычного двоичного счетчика. В схеме DS3231 имеется встроенный кварц и термостабилизация, которые позволяют получить значения высокой точности.
Сравнение популярных модулей RTC DS1302, DS1307, DS3231
В этой таблице мы привели список наиболее популярных модулей и их основные характеристики.
Название | Частота | Точность | Поддерживаемые протоколы |
DS1307 | 1 Гц, 4.096 кГц, 8.192 кГц, 32.768 кГц | Зависит от кварца – обычно значение достигает 2,5 секунды в сутки, добиться точности выше 1 секунды в сутки невозможно. Также точность зависит от температуры. | I2C |
DS1302 | 32.768 кГц | 5 секунд в сутки | I2C, SPI |
DS3231 | Два выхода – первый на 32.768 кГц, второй – программируемый от 1 Гц до 8.192 кГц | ±2 ppm при температурах от 0С до 40С.±3,5 ppm при температурах от -40С до 85С.Точность измерения температуры – ±3С | I2C |
Модуль DS1307
DS1307 – это модуль, который используется для отсчета времени. Он собран на основе микросхемы DS1307ZN, питание поступает от литиевой батарейки для реализации автономной работы в течение длительного промежутка времени.
Батарея на плате крепится на обратной стороне. На модуле имеется микросхема AT24C32 — это энергонезависимая память EEPROM на 32 Кбайт. Обе микросхемы связаны между собой шиной I2C.
DS1307 обладает низким энергопотреблением и содержит часы и календарь по 2100 год.
Модуль обладает следующими параметрами:
- Питание – 5В;
- Диапазон рабочих температур от -40С до 85С;
- 56 байт памяти;
- Литиевая батарейка LIR2032;
- Реализует 12-ти и 24-х часовые режимы;
- Поддержка интерфейса I2C.
Модуль оправдано использовать в случаях, когда данные считываются довольно редко, с интервалом в неделю и более. Это позволяет экономить на питании, так как при бесперебойном использовании придется больше тратить напряжения, даже при наличии батарейки. Наличие памяти позволяет регистрировать различные параметры (например, измерение температуры) и считывать полученную информацию из модуля.
Взаимодействие с другими устройствами и обмен с ними информацией производится с помощью интерфейса I2C с контактов SCL и SDA.
В схеме установлены резисторы, которые позволяют обеспечивать необходимый уровень сигнала. Также на плате имеется специальное место для крепления датчика температуры DS18B20.
Контакты распределены в 2 группы, шаг 2,54 мм. В первой группе контактов находятся следующие выводы:
- DS – вывод для датчика DS18B20;
- SCL – линия тактирования;
- SDA – линия данных;
- VCC – 5В;
- GND.
Во второй группе контактов находятся:
- SQ – 1 МГц;
- DS ;
- SCL;
- SDA;
- VCC;
- GND;
- BAT – вход для литиевой батареи.
Для подключения к плате Ардуино нужны сама плата (в данном случае рассматривается Arduino Uno), модуль часов реального времени RTC DS1307, провода и USB кабель.
Чтобы подключить контроллер к Ардуино, используются 4 пина – VCC, земля, SCL, SDA.. VCC с часов подключается к 5В на Ардуино, земля с часов – к земле с Ардуино, SDA – А4, SCL – А5.
Для начала работы с модулем часов нужно установить библиотеки DS1307RTC, TimeLib и Wire. Можно использовать для работы и RTCLib.
Проверка RTC модуля
При запуске первого кода программа будет считывать данные с модуля раз в секунду.
Сначала можно посмотреть, как поведет себя программа, если достать из модуля батарейку и заменить на другую, пока плата Ардуино не присоединена к компьютеру.
Нужно подождать несколько секунд и вытащить батарею, в итоге часы перезагрузятся. Затем нужно выбрать пример в меню Examples→RTClib→ds1307. Важно правильно поставить скорость передачи на 57600 bps.
При открытии окна серийного монитора должны появиться следующие строки:
Будет показывать время 0:0:0. Это связано с тем, что в часах пропадает питание, и отсчет времени прекратится. По этой причине нельзя вытаскивать батарею во время работы модуля.
Чтобы провести настройку времени на модуле, нужно в скетче найти строку
RTC.adjust(DateTime(__DATE__, __TIME__));
В этой строке будут находиться данные с компьютера, которые используются ля прошивки модуля часов реального времени. Для корректной работы нужно сначала проверить правильность даты и времени на компьютере, и только потом начинать прошивать модуль часов. После настройки в мониторе отобразятся следующие данные:
Настройка произведена корректно и дополнительно перенастраивать часы реального времени не придется.
Считывание времени. Как только модуль настроен, можно отправлять запросы на получение времени. Для этого используется функция now(), возвращающая объект DateTime, который содержит информацию о времени и дате. Существует ряд библиотек, которые используются для считывания времени.
Например, RTC.year() и RTC.hour() – они отдельно получают информацию о годе и часе. При работе с ними может возникнуть проблема: например, запрос на вывод времени будет сделан в 1:19:59.
Прежде чем показать время 1:20:00, часы выведут время 1:19:00, то есть, по сути, будет потеряна одна минута. Поэтому эти библиотеки целесообразно использовать в случаях, когда считывание происходит нечасто – раз в несколько дней.
Существуют и другие функции для вызова времени, но если нужно уменьшить или избежать погрешностей, лучше использовать now() и из нее уже вытаскивать необходимые показания.
Пример проекта с i2C модулем часов и дисплеем
Проект представляет собой обычные часы, на индикатор будет выведено точное время, а двоеточие между цифрами будет мигать с интервалом раз в одну секунду.
Для реализации проекта потребуются плата Arduino Uno, цифровой индикатор, часы реального времени (в данном случае вышеописанный модуль ds1307), шилд для подключения (в данном случае используется Troyka Shield), батарейка для часов и провода.
В проекте используется простой четырехразрядный индикатор на микросхеме TM1637. Устройство обладает двухпроводным интерфейсом и обеспечивает 8 уровней яркости монитора. Используется только для показа времени в формате часы:минуты.
Индикатор прост в использовании и легко подключается. Его выгодно применять для проектов, когда не требуется поминутная или почасовая проверка данных.
Для получения более полной информации о времени и дате используются жидкокристаллические мониторы.
Модуль часов подключается к контактам SCL/SDA, которые относятся к шине I2C. Также нужно подключить землю и питание. К Ардуино подключается так же, как описан выше: SDA – A4, SCL – A5, земля с модуля к земле с Ардуино, VCC -5V.
Индикатор подключается просто – выводы с него CLK и DIO подключаются к любым цифровым пинам на плате.
Скетч. Для написания кода используется функция setup, которая позволяет инициализировать часы и индикатор, записать время компиляции. Вывод времени на экран будет выполнен с помощью loop.
#include #include “TM1637.h” #include “DS1307.h” //нужно включить все необходимые библиотеки для работы с часами и дисплеем. char compileTime[] = __TIME__; //время компиляции. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 //номера с выходов Ардуино, к которым присоединяется экран; void setup() { display.set(); display.init(); //подключение и настройка экрана. clock.begin(); //включение часов. byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 2); byte second = getInt(compileTime, 4); //получение времени. clock.fillByHMS(hour, minute, second); //подготовка для записывания в модуль времени. clock.setTime(); //происходит запись полученной информации во внутреннюю память, начало считывания времени. } void loop() { int8_t timeDisp[4]; //отображение на каждом из четырех разрядов. clock.getTime();//запрос на получение времени. timeDisp[0] = clock.hour / 10; timeDisp[1] = clock.hour % 10; timeDisp[2] = clock.minute / 10; timeDisp[3] = clock.minute % 10; //различные операции для получения десятков, единиц часов, минут и так далее. display.display(timeDisp); //вывод времени на индикатор display.point(clock.second % 2 ? POINT_ON : POINT_OFF);//включение и выключение двоеточия через секунду. } char getInt(const char* string, int startIndex) { return int(string[startIndex] – '0') * 10 + int(string[startIndex+1]) – '0'; //действия для корректной записи времени в двухзначное целое число. В ином случае на экране будет отображена просто пара символов. }
После этого скетч нужно загрузить и на мониторе будет показано время.
Программу можно немного модернизировать. При отключении питания выше написанный скетч приведет к тому, что после включения на дисплее будет указано время, которое было установлено при компиляции.
В функции setup каждый раз будет рассчитываться время, которое прошло с 00:00:00 до начала компиляции.
Этот хэш будет сравниваться с тем, что хранятся в EEPROM, которые сохраняются при отключении питания.
Для записи и чтения времени в энергонезависимую память или из нее нужно добавить функции EEPROMWriteInt и EEPROMReadInt. Они нужны для проверки совпадения/несовпадения хэша с хэшем, записанным в EEPROM.
Можно усовершенствовать проект. Если использовать жидкокристаллический монитор, можно сделать проект, который будет отображать дату и время на экране. Подключение всех элементов показано на рисунке.
В результате в коде нужно будет указать новую библиотеку (для жидкокристаллических экранов это LiquidCrystal), и добавить в функцию loop() строки для получения даты.
Алгоритм работы следующий:
- Подключение всех компонентов;
- Загрузка скетча;
- Проверка – на экране монитора должны меняться ежесекундно время и дата. Если на экране указано неправильное время, нужно добавить в скетч функцию RTC.write (tmElements_t tm). Проблемы с неправильно указанным временем связаны с тем, что модуль часов сбрасывает дату и время на 00:00:00 01/01/2000 при выключении.
- Функция write позволяет получить дату и время с компьютера, после чего на экране будут указаны верные параметры.
Заключение
Модули часов используются во многих проектах. Они нужны для систем регистрации данных, при создании таймеров и управляющих устройств, которые работают по заданному расписанию, в бытовых приборах.
С помощью широко распространенных и дешевых модулей вы можете создать такие проекты как будильник или регистратор данных с сенсоров, записывая информацию на SD-карту или показывая время на экране дисплея.
В этой статье мы рассмотрели типичные сценарии использования и варианты подключения наиболее популярных видов модулей.
Источник: https://ArduinoMaster.ru/datchiki-arduino/arduino-chasy-rtc-ds1307-ds1302-ds3231/
DS3231 arduino подключение
DS3231 arduino подключение — часы реального времени
DS3231 arduino подключение — это автономная дешевая плата, в которой имеется встроенный кварц с термо-стабилизацией с исключительной точность хода часами в режиме реального времени.
В состав модуля также входит литий-ионный аккумулятор, обладающий лучшим соотношением массы и накопленной энергии.
Встроенный генератор позволил сократить количество деталей в схеме и повысить корректность работы прибора.
Технические характеристики устройства
Напряжение питания: | 3.3В и 5В/v |
Чип памяти:: | AT24C32 (32 Кб) |
Точность: | ± 0.432 сек в день |
Частота кварца: | 32.768 кГц |
Поддерживаемый протокол: | I2C |
Габариты: | 38мм x 22мм x 15мм |
Базовая информация
Большая часть микросхем, аналогичных одной из самых доступных типов модульного устройства часов реального времени DS1307, применяется схема простого кварцевого генератора. DS3231 arduino подключение, которого не представляет никакой сложности.
Данная схема выполнена на двух транзисторах с рабочей частотой 32 кГц. Однако и в этих приборах имеется свое несовершенство, так при различных температурных составляющих изменяется диапазон частот у кварца.
А это в свою очередь создает неточность при обработке и подсчете времени.
Этот недостаток был решен в микросхеме DS3231, за счет внедрения в нее термо-компенсированного кварцевого генератора поддерживающий температурную стабильность частоты.
При этом реальное время всегда находится в высокоточном режиме (в случае надобности, параметры температуры возможно подсчитать). DS3231 гарантирует работу с выводом информации по всем значениям, начиная от секунд и заканчивая месяцем и годом.
Помимо этого он определяет сколько дней в текущем месяце и делает коррекцию при високосном годе.
Само устройство собрано на основе чипа DS3231N. Чтобы подтянуть линии 32K, SQW, SCL и SDA была применена сборка из резисторов RP1 с номиналом 4.7 кОм. Но здесь нужно учитывать одну зависимость.
При использовании некоего количества приборов с шиной обеспечивающей передачу информации через интерфейс I2C, тогда нужно убрать резисторы на остальных модулях.
Другая резисторная сборка, также служащая для поддержания стабильного уровня нуля на линиях A0, A1 и A2 и для изменения памяти адреса у микросхемы AT24C32N.
Подзарядка аккумулятора
Для обеспечения подзарядки аккумулятора служит цепочка, собранная на сопротивлении R5 и выпрямительном диоде D1. Вообще то эту цепь можно убрать, поскольку дисковые литиевые элементы SR2032 могут служить много лет.
Светодиод визуальной индикации, включенный через сопротивление R1 показывает, что модуль включен и готов к работе. Так как DS3231 arduino подключение выполнено по интерфейсной шине I2C, то для удобства использования электрические шины поданы на два коннектора J1 и J2.
Для чего служат другие контакты — показано в таблице ниже.
Источник: http://usilitelstabo.ru/ds3231-arduino-podklyuchenie.html
Часы-будильник на Arduino. Корпус сделан из конструктора LEGO. LEGO Arduino
Пришел у меня 5 летний ребенок из садика и сказал, что ему задали сделать проект умные устройства в доме. Корпус можно сделать из любого подручного конструктора.
Можно сделать из LEGO конструктора.
Немного поразмыслив решили мы с сыном сделать часы-будильник на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 .
Подключение электроники осуществляется вот по токай схеме.
Корпус из LEGO для чесов мы собрали достаточно быстро, это как кубик рубика заказать.В итоги у нас получились вот такие красивые часы с кнопочкой сбоку. Данная кнопочка отключает будильник.
Прошивка для часов на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 в среде Arduino IDE:
#include #include “TM1637.h” #define CLK 4 #define DIO 3 int soundPin = 1; // объявляем переменную с номером пина спикера const int buttonPin = 5; // номер входа, подключенный к кнопке int sensorValue = 0; boolean status = false; TM1637 tm1637(CLK,DIO); ///// часы .. byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { TinyWireM.beginTransmission(0x68); TinyWireM.send(0); TinyWireM.send(decToBcd(second)); TinyWireM.send(decToBcd(minute)); TinyWireM.send(decToBcd(hour)); TinyWireM.send(decToBcd(dayOfWeek)); TinyWireM.send(decToBcd(dayOfMonth)); TinyWireM.send(decToBcd(month)); TinyWireM.send(decToBcd(year)); TinyWireM.endTransmission(); } void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { TinyWireM.beginTransmission(0x68); TinyWireM.send(0); TinyWireM.endTransmission(); TinyWireM.requestFrom(0x68, 7); *second = bcdToDec(TinyWireM.receive() & 0x7f); *minute = bcdToDec(TinyWireM.receive()); *hour = bcdToDec(TinyWireM.receive() & 0x3f); *dayOfWeek = bcdToDec(TinyWireM.receive()); *dayOfMonth = bcdToDec(TinyWireM.receive()); *month = bcdToDec(TinyWireM.receive()); *year = bcdToDec(TinyWireM.receive()); } float get3231Temp(){ byte tMSB, tLSB; float temp3231; TinyWireM.beginTransmission(0x68); TinyWireM.send(0x11); TinyWireM.endTransmission(); TinyWireM.requestFrom(0x68, 2); if(TinyWireM.available()) { tMSB = TinyWireM.receive(); //2's complement int portion tLSB = TinyWireM.receive(); //fraction portion temp3231 = (tMSB & B01111111); //do 2's math on Tmsb temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8 } else { //oh noes, no data! } return temp3231; } ///////////////// void setup() { TinyWireM.begin(); tm1637.init(); tm1637.set(7); // яркость, от 0 до 7 pinMode(soundPin, OUTPUT); //объявляем пин как выход. pinMode(buttonPin, INPUT_PULLUP); pinMode(5, INPUT); // установка часов //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; second = 30; minute = 50; hour = 06; dayOfWeek = 3; // день недели //dayOfMonth = 1; // день ///month = 4; //year = 14; setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); } void loop(){ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); byte temp = get3231Temp(); int8_t TimeDisp[4]; TimeDisp[0] = hour / 10; TimeDisp[1] = hour % 10; TimeDisp[2] = minute / 10; TimeDisp[3] = minute % 10; if (second%2) tm1637.point(POINT_ON); // включаем точки else tm1637.point(POINT_OFF); // выключаем точки // } buttonValue = digitalRead(buttonPin); // считываем данные с кнопки if(hour==7) { if (minute==00) { if (second < 30) status = true; else status = false; } } if (buttonValue) status = false; if (status) { tone(soundPin, 1500); // включаем звук частотой 100 Гц delay(200); tone(soundPin, 1000); // включаем звук частотой 100 Гц delay(200); tone(soundPin, 500); // включаем звук частотой 100 Гц delay(200); } else noTone(soundPin); // выключаем звук tm1637.display(TimeDisp); // отправляем массив на экран }
Звуковой сигнал будет генерировать функция tone(). Как видно из программы настраивать время срабатывания будильника мы не сможем. Это связанна с тем что у Digispark мало пинов. И все уже заняты.
https://www.youtube.com/watch?v=t9AcsxQv-5k
Если данный проект реализовать например на Atduino NANO, тогда можно реализовать настройку времени срабатывания будильника. Написать мелодии будильника и прочие фишки. Если данное видео и статья будут востребованы, то я сниму переделку на Arduino NANO. Но для первого раза я считаю что получилась не плох. А вы как считает? Пишите в комментариях свое мнение.
Источник: https://portal-pk.ru/news/160-chasy-budilnik-na-arduino-korpus-sdelan-iz-konstruktora.html
Библиотека DS3231
описание библиотеки для использования в Arduino модуля реального времени DS3231 на русском языке
Скачать: на официальном сайте зеркало1 зеркало2
Time;
Структура управления данными времени и даты.
Переменные:
hour, min, sec: Для определения данных времени
date, mon, year: Для определения данных даты
dow: День недели, начиная с понедельника
Пример: Time t; // Определяем структуру с именем t класса “время”
Дни недели
Используется совместно с setDOW() и Time.dow
MONDAY: 1
TUESDAY: 2
WEDNESDAY: 3
THURSDAY: 4
FRIDAY: 5
SATURDAY: 6
SUNDAY: 7
Длина названия
Используется совместно с getTimeStr(), getDateStr(), getDOWStr() and getMonthStr()
FORMAT_SHORT: 1 (полное название)
FORMAT_LONG: 2 (сокращенное (3 буквенное) название)
Формат даты
Используется совместно с getDateStr()
FORMAT_LITTLEENDIAN: 1 (дд.мм.гггг)
FORMAT_BIGENDIAN: 2 (гггг.мм.дд)
FORMAT_MIDDLEENDIAN: 3 (мм.дд.гггг)
Частота на выходе SQW
Используется совместно с setSQWRate()
SQW_RATE_1: 1 (1 Гц)
SQW_RATE_1K: 2 (1024 Гц)
SQW_RATE_4K: 3 (4096 Гц)
SQW_RATE_8K: 4 (8192 Гц)
Логический уровень на выходе INT/SQW
Используется совместно с setOutput()
OUTPUT_SQW: 1
OUTPUT_INT: 2
DS3231(SDA, SCL);
Инициализация библиотеки с помощью интерфейса I2C
Параметры:
SDA: Вывод подключения SDA-пина DS3231
SCL: Вывод подключения SCL-пина DS3231
Пример: DS3231 rtc(SDA, SCL); // Инициализация библиотеки DS3231 с помощью интерфейса I2C
getTime();
Считать текущие данные из DS3231.
Параметры:Нет
Возврат: формат Time-structure
Пример:t = rtc.getTime(); // Считать текущую дату и время.
getTimeStr([format]);
Считать текущее время в виде строковой переменной.
Параметры:
format:
FORMAT_LONG“ЧЧ:ММ:СС” (По умолчанию)
FORMAT_SHORT “ЧЧ:ММ”
Возврат: Строковое значение, содержащее текущее время с секундами или без них.
Пример:Serial.print(rtc.getTimeStr()); // Отправить текущее время через последовательный порт
getDateStr([slformat[, eformat[, divider]]]);
Считать текущую дату в виде строковой переменной.
Параметры:
slformat:
FORMAT_LONGГод из 4х цифр (ГГГГ) (По умолчанию)
FORMAT_SHORT Год из 2х цифр (ГГ)
eformat:
FORMAT_LITTLEENDIAN “ДД.ММ.ГГГГ” (По умолчанию)
FORMAT_BIGENDIAN“ГГГГ.ММ.ДД”
FORMAT_MIDDLEENDIAN“ММ.ДД.ГГГГ”
divider:
Символ для разделения. По умолчанию '.'
Возврат: Строковое значение, содержащее текущую дату в указанном формате.
Пример:Serial.print(rtc.getDateStr()); // Отправить текущую дату через последовательный порт (В формате “ДД.ММ.ГГГГ”)
getDOWStr([format]);
Считать текущий день недели в виде строковой переменной.
Параметры:
format:
FORMAT_LONGДень недели на английском языке (По умолчанию)
FORMAT_SHORTСокращенное название дня недели на английском языке (3 символа)
Возврат:Строковое значение, содержащее текущий день день недели в полном или сокращенном формате.
Пример:Serial.print(rtc.getDOWStr(FORMAT_SHORT)); // Отправить сокращенное название текущего дня недели через последовательный порт
getMonthStr([format]);
Считать текущий месяц в виде строковой переменной.
Параметры:
format:
FORMAT_LONGназвание месяца на английском языке (По умолчанию)
FORMAT_SHORTСокращенное название месяца на английском языке (3 символа)
Возврат: Строковое значение, содержащее текущий месяц в полном или сокращенном формате.
Пример:Serial.print(rtc.getMonthStr()); // Отправить название текущего месяца через последовательный порт
getUnixTime(time);
Преобразование значения времени и даты в формат Unix Time (UNIX-время).
Параметры:
Время: Переменная, содержащее дату и время для преобразования
Возврат: Unix Time для предоставленного значения времени
Пример: Serial.print(rtc.getUnixTime(rtc.getTime())); // Отправить текущее значение Unixtime через последовательный порт
Примечание:UNIX-время (англ. Unix time) или POSIX-время — система описания моментов во времени, принятая в UNIX и других POSIX-совместимых операционных системах. Определяется как количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); время с этого момента называют «эрой UNIX» (англ. Unix Epoch).
getTemp();
Получить текущую температуру от внутреннего термометра DS3231.
Параметры: Нет
Возврат: Значение текущей температуры (с плавающей точкой) микросхемы DS3231 в ° Цельсия
Пример:Serial.print(rtc.getTemp()); // Отправить значение температуры через последовательный порт
Примечание: Внутренняя температура измеряется и обновляются каждые 64 секунд.
Температура измеряется с точностью 0,25° C.
setTime(hour, min, sec);
Установка времени.
Параметры:
hour:Часы (0-23)
min:Минуты (0-59)
sec: Секунды (0-59)
Пример:rtc.setTime(23, 59, 59); // Установка времени 23:59:59
setDate(date, mon, year);
Установка даты.
Параметры:
date:День (1-31)
mon:Месяц (1-12)
year: Год (2000-2099)
Пример:rtc.setDate(16, 5, 2016); // Установка даты 16 мая 2016г.
Примечание: Защиты от ввода неправильной даты нет. Т.е., возможно ввести 31 февраля, но результат будет не предсказуем
setDOW(dow);
Установка дня недели.
Параметры:
dow: День недели (1-7)
Если параметр не задан, значение параметра будет рассчитываться на основе данных, хранящихся в настоящее время в DS3231.
Пример:rtc.setDOW(FRIDAY); // Установить день недели – Пятница
Примечание:Устанавливаются от понедельника (1) до воскресенья (7).
Источник: http://mynobook.blogspot.com/2016/05/ds3231.html
Обзор часов реального времени DS3231 (RTC) – RobotChip
Автор: vip.sergey.mir · 16.01.2017
Модуль DS3231 (RTC, ZS-042) — представляет собой недорогую плату с чрезвычайно точными часами реального времени (RTC), с температурной компенсацией кварцевого генератора и кристалла.
Модуль включает в себя литиевую батарею, которая поддерживает бесперебойную работу, даже при отключении источник питания.
Интегрированный генератор улучшить точность устройства и позволил уменьшить количество компонентов.
► Напряжение питания: 3.3В и 5В ► Чип памяти: AT24C32 (32 Кб) ► Точность: ± 0.432 сек в день ► Частота кварца:32.768 кГц ► Поддерживаемый протокол: I2C
► Габариты: 38мм x 22мм x 15мм
Общие сведения
Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени.
Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать).
Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год.
Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.
Теперь немного о самом модуле, построен он на микросхеме DS3231N. Резисторная сборка RP1 (4.7 кОм), необходима для подтяжки линий 32K, SQW, SCL и SDA (кстати, если используется несколько модулей с шиной I2C, необходимо выпаять подтягивающие резисторы на других модулях).
Вторая сборка резисторов, необходима для подтяжки линий A0, A1 и A2, необходимы они для смены адресации микросхемы памяти AT24C32N. Резистор R5 и диод D1, служат для подзарядки батарее, в принципе их можно выпаять, так как обычной батарейки SR2032 хватает на годы.
Так же установлена микросхема памяти AT24C32N, это как бы бонус, для работы часов RTC DS3231N в ней нет необходимости. Резистор R1 и светодиод Power, сигнализируют о включении модуля.
Как и говорилось, модуль работает по шине I2C, для удобства эти шины были выведены на два разъема J1 и J2, назначение остальных контактов, можно посмотреть ниже.
Назначение J1
► 32K: выход, частота 32 кГц ► SQW: выход ► SCL: линия тактирования (Serial CLock) ► SDA: линия данных (Serial Dфta) ► VCC: «+» питание модуля
► GND: «-» питание модуля
Назначение J2
► SCL: линия тактирования (Serial CLock) ► SDA: линия данных (Serial Data) ► VCC: «+» питание модуля
► GND: «-» питание модуля
Немного расскажу, о микросхеме AT24C32N, это микросхема с 32к памятью (EEPROM) от производителя Atmel, собранная в корпусе SOIC8, работающая по двухпроводной шине I2C. Адрес микросхемы 0x57, при необходимости легко меняется, с помощью перемычек A0, A1 и A2 (это позволяет увеличить количество подключенных микросхем AT24C32/64).
Так как чип AT24C32N имеет, три адресных входа (A0, A1 и A2), которые могут находится в двух состояния, либо лог «1» или лог «0», микросхеме доступны восемь адресов. от 0x50 до 0x57.
Необходимые детали: ► Arduino UNO R3 x 1 шт. ► Часы реального времени на DS3231, RTC, SPI, AT24C32 x 1 шт.
► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.
Подключение:
В данном примере буду использовать только модуль DS3231 и Arduino UNO R3, все данные будут передаваться в «Мониторинг порта».
Схема не сложная, необходимо всего четыре провода, сначала подключаем шину I2C, SCL в A4 (Arduino UNO) и SDA в A5 (Arduino UNO), осталось подключить питание GND к GND и VCC к 5V (можно записать и от 3.
3В), схема собрана, теперь надо подготовить программную часть.
Библиотеки работающий с DS3231 нет в среде разработке IDE Arduino, необходимо скачать «DS3231 » и добавить в среду разработки Arduino.
Установка времени DS3231
При первом включении необходимо запрограммировать время, откройте пример из библиотеки DS3231 «Файл» —> «Примеры» —> «DS3231» —> «Arduino» —> «DS3231_Serial_Easy», или скопируйте код снизу
Тестирование производилось на Arduino IDE 1.8.0 Дата тестирования 31.08.2018г.#include // Подключаем библиотеку Wire DS3231 rtc(SDA, SCL); // Инициализация DS3231 Serial.begin(115200); // Установка последовательного соединения rtc.begin(); // Инициализировать rtc rtc.setDOW(FRIDAY); // Установить день-недели rtc.setTime(16, 29, 0); // Установить время 16:29:00 (формат 24 часа) rtc.setDate(31, 8, 2018); // Установить дату 31 августа 2018 года Serial.print(rtc.getDOWStr()); // Отправляем день-неделя Serial.print(rtc.getDateStr()); // Отправляем дату Serial.println(rtc.getTimeStr()); // Отправляем время delay (1000); // Задержка в одну секунду |
Скачать скетч
Загружаем скетч в контроллер Arduino и открываем «Мониторинг порта»
Вот и все.
Ссылки
Библиотека libraries-DS3231
Купить на Aliexpress
Контроллер Arduino UNO R3
Часы реального времени RTC DS3231
Комплект проводов DuPont, 2,54 мм, 20 см
Купить в Самаре и области
Купить контроллер Arduino UNO R3
Купить провода DuPont, 2,54 мм, 20 см
Купить часы реального времени RTC DS3231
Источник: http://robotchip.ru/obzor-chasov-realnogo-vremeni-ds3231/
LCD часы, будильник и таймер с детектором движения на Arduino
xncD145 20-02-2016, 17:32 19 760 Arduino / Часы<\p>
Этот проект отлично может подойти для вашего рабочего уголка, или гаража где вы занимаетесь разработкой самоделок. Готовый проект в одном модуле включает в себя множество функций: часы с отображением даты и времени, секундомер, будильник, отслеживание движения (для автоматического отключения когда вас нет на месте).
Материалы:
– Arduino Uno- LCD шилд (с кнопками, в проекте используется шилд от DFRobot)- Коробка для корпуса- Зуммер- Инфракрасный датчик движения (PIR)- Соединительные провода (мама/мама)- Джек 2.1 мм- Переходник для кроны 9В 2.1 мм / 5.5 мм- Крона 9 В- Часы реального времени
Шаг первый. Модуль часов реального времени.
Часто модуль часов поставляют в виде конструктора, который приходится собирать самому. Обычно сборка не вызывает проблем, плюс производители выпускают инструкции по сборке их модуля. Также батарейка идёт в комплекте с часами, её хватит более чем на три года.
Шаг второй. Коннектор питания.
Для упрощения подключения конструкции к Arduino автор использует джек на 2.1 мм с припаянными контактами. В коробке проделывают отверстие, и джек закрепляют клеем. Таким образом, подключение к Arduino не составит проблем.
Крону просто установят на заднюю часть бокса. Если рассмотреть фото поближе можно заметить ещё одно отверстие в коробке. Его делать не нужно, это просто неудачная попытка сделать отверстие, в него джек просто не влез.
Шаг третий.
Подсоединение проводов.
Автором были приобретены разноцветные провода мама/мама. Обошлись они недорого, но сильно облегчили процесс сборки. Проводники подключили к зуммеру, ПИР датчику движения, модулю часов, чтобы потом все это подсоединить к LCD шилду.
Шаг четвёртый. Подключение к LCD шилду.
На шилде имеется 5 рядов контактов, их пины на Arduino 1-5 соответственно. Имеется контакт для 5 В и GND, это всё и использовалось для подключения. Для передачи данных с зуммером, датчиком и часами реального времени используются аналоговые пины Arduino. Датчик с часами, конечно же, подключали к земле и питанию.
Шаг пятый. Установка в коробку.
В этом шаге конструкцию помещают в отдельный бокс. В первую очередь в коробку укладывают кабели от LCD шилда. Arduino закрепляют винтом нижней правой части корпуса.
Для удержания микроконтроллера достаточно одного винта, тем более что автор использует такой бокс, в котором рёбра жёсткости располагаются на месте отверстий для двух других винтов.
Далее, на Arduino устанавливают LCD шилд, кабели которого огибают плату с правой стороны (видно на фото ниже). Модуль часов отлично подходит для установки в левом нижнем углу, для его крепления используется один винт.
Такая установка компонентов разрешает без проблем подключить джек 2.1 мм к Arduino. Датчик движения ставят так чтобы была возможность его снять, потому что он мешает подключить кабель USB к плате.
Шаг шестой. Программирование.
Как указано в начале статьи часы должны не только отображать время и дату, но и таймер с будильников. На шилде имеется 5 кнопок, которые можно запрограммировать. Использоваться они будут для различных режимов работы часов. Зуммер будет отрабатывать при нажатии каждой кнопки, а при работе будильника он подаст несколько сигналов.
Скетч для Arduino.
За основу автором взят скетч от Adafruit, его разработали для часов реального времени. В нём используют библиотеку RTClib.
Далее, автор добавил кусок кода для LCD шилда от DFRobot (опция управления кнопками). И кусок кода добавил от себя исключительно под этот проект. Финальную версию кода можно скачать под статьёй.
Ниже представлены фото с разными режимами работы часов.
Шаг седьмой. Функции кнопок.
Как видно на фото ниже каждая кнопка на шилде подписана, пять из них были запрограммированы так:- Первая кнопка (SELECT) — это меню. Кнопка отображает листание имеющихся функций (таймер, будильник).- Вторая кнопка (LEFT) — эта кнопка отвечает за выбор функции. Дополнительная функция кнопки увеличение значения на 10 когда вводятся часы и минуты.
– Третья и четвёртая кнопки (UP, DOWN) — используются для увеличения и уменьшения значений часов и минут при настройке будильника и таймера. Дополнительная функция кнопок для переключения времени суток AM и PM.- Пятая кнопка (RIGHT) — это кнопка ввода. Используется для принятия значения (настроенное время таймера, часов).- Шестая кнопка (RST) — кнопка используется для перезагрузки Arduino.
motionclock-master.zip [4.87 Kb] (скачиваний: 1121)
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.
Идея
Описание
Исполнение
Итоговая оценка: 9.67
Источник: https://USamodelkina.ru/6987-lcd-chasy-budilnik-i-taymer-s-detektorom-dvizheniya-na-arduino.html