Цифровые часы Arduino с использованием модуля RTC

Попробуйте наш инструмент устранения неполадок





В этом посте мы собираемся создать цифровые часы, используя модуль RTC или Real Time Clock. Мы разберемся, что такое модуль «RTC», как взаимодействовать с Arduino и что он делает.

К:



Модуль RTC - это схема, которая точно отслеживает текущее время. Он выполняет две функции: он взаимодействует с микроконтроллерами и микропроцессорами для определения текущего времени и действует как резервная схема для поддержания времени в случае сбоя питания, поскольку имеет встроенную систему резервного питания от батареи.

Мы можем найти RTC в любых электронных устройствах, где время является важной функцией устройства.



Например, наш компьютер или ноутбук сохраняет свое время даже после отключения питания или извлечения аккумулятора. На материнской плате любого компьютера мы можем найти батарею CMOS, которая питает схему RTC.

Подобную схему мы будем использовать в этом проекте.

Модуль RTC - это недорогое устройство, которое можно найти на любых сайтах электронной коммерции и в местных магазинах электронных проектов.

Иллюстрация типичного модуля RTC DS1307:

Большинство модулей RTC поставляются с батареей (CR2032) на момент покупки. Существуют разные размеры и модели, показанное выше может отличаться для вас. Но убедитесь, что номер модели - DS1307. Код, написанный в этом посте, совместим только с DS1307.

Теперь вы кое-что знаете о RTC. А теперь перейдем к дизайну цифровых часов. Прежде чем продолжить этот проект, вам необходимо загрузить библиотеку по следующим ссылкам и установить в своей среде IDE:

• DS1307RTC.h

Ссылка: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Ссылка: github.com/PaulStoffregen/Time

Две другие библиотеки были бы предустановлены в Arduino IDE, если вы используете последнюю версию.

• LiquidCrystal.h

• Wire.h

Схема:

Схема соединения между Arduino и ЖК-дисплеем стандартная, мы можем найти аналогичное соединение в других проектах на основе ЖК-дисплеев. Единственный дополнительный компонент - это часы реального времени.

Чтобы уменьшить перегрузку проводов во время прототипа, RTC можно подключить к аналоговым контактам непосредственно на Arduino. Припаяйте SC1, SDA, Vcc и GND с помощью штыревых контактов заголовка и вставьте его с A2 в контакты A5, как показано на прототипе.

Авторский прототип:

Как правильно вставить RTC на Arduino:

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

Как установить время:

После того, как модуль RTC запрограммирован, он поддерживает время, даже если он удален из Arduino. Батареи должно хватить минимум на пару лет.

Нет кнопки для настройки времени, следующая программа установит время в RTC. Время автоматически синхронизируется со временем вашего компьютера во время компиляции кода, поэтому перед загрузкой программ убедитесь, что на вашем компьютере установлено правильное время.
Загрузите этот код «SetTime», чтобы установить время с подключенным RTC:

#include  #include  #include  int P=A3 //Assign power pins for RTC int N=A2 const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } 

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

Это означает, что ваше соединение между RTC и Arduino правильное и время установлено.

Теперь загрузите следующий код для отображения времени на ЖК-дисплее.

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  LiquidCrystal lcd(12, 11, 5, 4, 3, 2) int P=A3 int N=A2 void setup() { lcd.begin(16,2) pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) } void loop() { tmElements_t tm lcd.clear() if (RTC.read(tm)) { if(tm.Hour>=12) { lcd.setCursor(14,0) lcd.print('PM') } if(tm.Hour<12) { lcd.setCursor(14,0) lcd.print('AM') } lcd.setCursor(0,0) lcd.print('TIME:') if(tm.Hour>12) //24Hrs to 12 Hrs conversion// { if(tm.Hour==13) lcd.print('01') if(tm.Hour==14) lcd.print('02') if(tm.Hour==15) lcd.print('03') if(tm.Hour==16) lcd.print('04') if(tm.Hour==17) lcd.print('05') if(tm.Hour==18) lcd.print('06') if(tm.Hour==19) lcd.print('07') if(tm.Hour==20) lcd.print('08') if(tm.Hour==21) lcd.print('09') if(tm.Hour==22) lcd.print('10') if(tm.Hour==23) lcd.print('11') } else { lcd.print(tm.Hour) } lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0,1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0,0) lcd.print('RTC stopped!!!') lcd.setCursor(0,1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0,0) lcd.print('Read error!') lcd.setCursor(0,1) lcd.print('Check circuitry!') } delay(500) } delay(500) } //------------Program Developed by R.Girish-------// 

Как только это будет сделано, вы должны увидеть, что время и дата отображаются на ЖК-дисплее и работают.

Примечание: Код «SetTime» модифицирован из примера кода DS1307RTC для оптимизации проводных соединений для модуля RTC, загрузка исходного кода не устанавливает время.

Цифровой будильник с использованием Arduino

В этом выше мы узнали, как построить базовые часы Arduino с использованием модуля RTC, в следующем разделе мы исследуем, как их можно модернизировать в схему цифрового будильника с помощью Arduino.

Есть люди, которым не нужен будильник, они просыпаются естественным образом, есть люди, которые просыпаются после того, как будильник звонит несколько раз, а есть люди, которые нажимают кнопку повтора несколько раз и идут в колледж / на работу поздно с некоторые извинения.

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

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

Эти часы могут показывать время в 12-часовом формате и дату в формате ДД / ММ / ГГГГ.

Время и дата будут отображаться на ЖК-дисплее 16 x 2. Модуль часов реального времени или часов реального времени отслеживает время и может сохранять правильное время даже после длительного отключения электроэнергии.

Предусмотрено 5 кнопок, функции которых будут описаны в ближайшее время. Мозг проекта Arduino может любая модель на ваш выбор, мы бы порекомендовали Arduino pro mini или Arduino nano из-за его компактных размеров.

А теперь давайте погрузимся в схемы.

Вышеупомянутая схема предназначена для подключения дисплея Arduino, регулировки контрастности дисплея путем вращения потенциометра 10K.

Ниже представлена ​​остальная часть схемы:

Схема может питаться от настенного адаптера 9В 500мА.

Функции 5 кнопок:

S1 - используется для остановки тревоги (это также кнопка сброса).
S2 - используется для установки будильника. При длительном нажатии S2 вы попадете в меню настройки будильника.
S3 - используется для увеличения часов.
S4 - используется для увеличения минут.
S5 - используется для переключения статуса тревоги. Если «*» отображается на ЖК-дисплее в правом нижнем углу, сигнализация включена, если «*» не существует, статистика сигнализации отключена.

Более подробно о том, как установить будильник, рассказывается в конце статьи.

Загрузите файлы библиотеки ниже:

Ссылка1: github.com/PaulStoffregen/DS1307RTC
Ссылка2: github.com/PaulStoffregen/Time

Теперь нам нужно установить время для модуля RTC, время будет синхронизировано с вашего ПК на модуль RTC.

Загрузите приведенный ниже код, чтобы установить время и открыть последовательный монитор:

//------------------------------------------------// #include  #include  #include  const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } //----------------------------------------// 

Теперь вы успешно установили время в RTC
Далее вам необходимо загрузить следующий основной код:

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  #include  const int rs = 7 const int en = 6 const int d4 = 5 const int d5 = 4 const int d6 = 3 const int d7 = 2 const int buzzer = 8 boolean alarm = false boolean outloop = true const int setAlarm = A0 const int Hrs = A1 const int Min = A2 const int ok = A3 const int HrsADD = 0 const int MinADD = 1 const int ALsave = 2 int HrsVal = 0 int MinVal = 0 int H = 0 int M = 0 int S = 0 int i = 0 int j = 0 int k = 0 LiquidCrystal lcd(rs, en, d4, d5, d6, d7) void setup() { Serial.begin(9600) lcd.begin(16, 2) pinMode(buzzer, OUTPUT) pinMode(setAlarm, INPUT) pinMode(Hrs, INPUT) pinMode(Min, INPUT) pinMode(ok, INPUT) digitalWrite(setAlarm, HIGH) digitalWrite(Hrs, HIGH) digitalWrite(Min, HIGH) digitalWrite(ok, HIGH) } void loop() { tmElements_t tm lcd.clear() if (EEPROM.read(ALsave) == false) { lcd.setCursor(15, 1) lcd.print('') } if (EEPROM.read(ALsave) == true) { lcd.setCursor(15, 1) lcd.print(F('*')) } if (RTC.read(tm)) { if (tm.Hour >= 12) { lcd.setCursor(14, 0) lcd.print('PM') } if (tm.Hour < 12) { lcd.setCursor(14, 0) lcd.print('AM') } lcd.setCursor(0, 0) lcd.print('TIME:') H = tm.Hour if (tm.Hour > 12) { if (tm.Hour == 13) { lcd.print('01') } if (tm.Hour == 14) { lcd.print('02') } if (tm.Hour == 15) { lcd.print('03') } if (tm.Hour == 16) { lcd.print('04') } if (tm.Hour == 17) { lcd.print('05') } if (tm.Hour == 18) { lcd.print('06') } if (tm.Hour == 19) { lcd.print('07') } if (tm.Hour == 20) { lcd.print('08') } if (tm.Hour == 21) { lcd.print('09') } if (tm.Hour == 22) { lcd.print('10') } if (tm.Hour == 23) { lcd.print('11') } } else { lcd.print(tm.Hour) } M = tm.Minute S = tm.Second lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0, 1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0, 0) lcd.print('RTC stopped!!!') lcd.setCursor(0, 1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0, 0) lcd.print('Read error!') lcd.setCursor(0, 1) lcd.print('Check circuitry!') } } if (digitalRead(setAlarm) == LOW) { setALARM() } if (H == EEPROM.read(HrsADD) && M == EEPROM.read(MinADD) && S == 0) { if (EEPROM.read(ALsave) == true) { sound() } } if (digitalRead(ok) == LOW) { if (EEPROM.read(ALsave) == true) { EEPROM.write(ALsave, 0) alarm = false delay(1000) return } if (EEPROM.read(ALsave) == false) { EEPROM.write(ALsave, 1) alarm = true delay(1000) return } } delay(1000) } void setALARM() { HrsVal = EEPROM.read(HrsADD) MinVal = EEPROM.read(MinADD) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(' Min:')) lcd.print(EEPROM.read(MinADD)) delay(600) while (outloop) { if (HrsVal > 23) { HrsVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (MinVal > 59) { MinVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (digitalRead(Hrs) == LOW) { HrsVal = HrsVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(Min) == LOW) { MinVal = MinVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(setAlarm) == LOW) { EEPROM.write(HrsADD, HrsVal) EEPROM.write(MinADD, MinVal) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('Alarm is Set for')) lcd.setCursor(0, 1) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(':')) lcd.print(EEPROM.read(MinADD)) lcd.print(F(' Hrs')) delay(1000) outloop = false } } outloop = true } void sound() { lcd.clear() lcd.setCursor(0, 0) lcd.print('Wakey Wakey !!!') lcd.setCursor(0, 1) lcd.print('Its Time now.....') for (j = 0 j < 10 j++) { for (i = 0 i < 2  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(400) } for (k = 0 k < 10 k++) { for (i = 0 i < 4  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(250) } while (true) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } } //------------Program Developed by R.Girish-------// 

После загрузки вышеуказанного кода вы должны увидеть правильное время и дату на дисплее.

Теперь давайте посмотрим, как установить будильник:
• Нажмите и удерживайте S2, пока не увидите меню будильника.
• Нажмите S3 и S4, чтобы настроить часы и минуты соответственно.
• После установки желаемого времени еще раз нажмите S2. Будет сказано: «Будильник установлен на xx: xx часов».
• Если сигнализация включена, на дисплее отображается символ «*», если сигнализация выключена, символа «*» не будет.
• Вы можете включить / выключить будильник, нажав S5 на полсекунды. Не нажимайте долго, пока «*» не исчезнет (он снова вернется), просто нажмите и удерживайте полсекунды, чтобы переключить статус будильника.

ВАЖНАЯ ЗАМЕТКА:

Самая распространенная ошибка при установке будильника на любые часы - непреднамеренное переключение AM / PM, в результате чего будильник не срабатывает в желаемое время.

Чтобы решить эту проблему, предлагаемая настройка будильника рассчитана на 24-часовой формат времени.

Время, отображаемое на ЖК-дисплее, будет 12-часовым в формате AM / PM, но, когда вы устанавливаете будильник в этом проекте, вы должны установить 24-часовой формат от 0 до 23 часов.

Например: если вы хотите установить будильник на 21:00, вы должны установить 21 час 0 минут. Для 5 утра: 5 часов 0 минут и так далее.

Авторский прототип:

Вам нравится этот проект? Если у вас есть вопросы по этому проекту, не стесняйтесь выражать их в комментариях, вы можете получить быстрый ответ.

Видеоклип:




Предыдущая статья: Цепь индикатора уровня сигнала для зерновых бункеров зерноуборочного комбайна Следующая статья: 3 схемы синусоидального инвертора SG3525 высокой мощности