Оглавление:

Часы реального времени с Arduino: 3 шага
Часы реального времени с Arduino: 3 шага

Видео: Часы реального времени с Arduino: 3 шага

Видео: Часы реального времени с Arduino: 3 шага
Видео: Часы реального времени. Уроки Arduino 2024, Ноябрь
Anonim
Часы реального времени с Arduino
Часы реального времени с Arduino

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

Код DS3231 Arduino похож на код DS1307 и работает с обоими чипами RTC.

Код Arduino ниже не использует какую-либо библиотеку для DS3231 RTC, библиотека Wire предназначена для соответствия между Arduino и DS3231 с использованием соглашения I2C.

Ага! Многие инженеры-электронщики полагаются на него в своих временных проектах, но RTC не совсем надежен. Он работает от батареи и рано или поздно должен быть заменен. Применительно к проектам IoT он занимает ценные выводы SPI (последовательный периферийный интерфейс) и становится беспорядочным из-за спутанных проводов. Решение… А вот и наш герой NTP (сетевой протокол времени). NTP настолько точен, что получает время из Интернета. Мы собираемся работать с этим протоколом в режиме клиент-сервер. процесс настолько прост, что наш Nodemcu действует как клиент и запрашивает пакет NTP с сервера, используя UDP. В свою очередь, сервер отправляет пакет клиенту, который анализирует данные. NTP - это универсальный протокол синхронизации времени. Теперь давайте осветим рабочее место нашей лаборатории

Шаг 1. Необходимые компоненты

  • Плата Arduino
  • Плата DS3231 RTC
  • ЖК-экран 16x2
  • 2 кнопки
  • Переменный резистор 10 кОм (или потенциометр)
  • Резистор 330 Ом
  • Батарейка типа таблетка 3 В
  • Макетная плата
  • Провода перемычки

Модуль RTC DS3231

Время - это существенное чувство, необходимое в этом быстро меняющемся мире людей. В реальном времени проект

Мы используем RTC (A. K. A Real-time clock)

RTC Часы реального времени (RTC) - это интегральная схема (IC), которая отслеживает текущее время. RTC заботится о времени в реальном режиме. RTC обычно используется в материнских платах компьютеров и встраиваемых системах и требует своевременного доступа.

Шаг 2: Подключение часов Arduino

Подключение часов Arduino
Подключение часов Arduino
  • Подключите контакт SCL к модулю RTC к Arduino A5
  • Подключите вывод SDA к модулю RTC к Arduino A4
  • Подключите VCC к 5v и GND к GND
  • Подключите кнопку к контакту 8.
  • Подключите еще одну кнопку к контакту 9.
  • Подключите RS ЖК-дисплея к контакту 2 Arduino.
  • Подключите E ЖК-дисплея к контакту 3 Arduino
  • Подключите D7 ЖК-дисплея к контакту 7 Arduino.
  • Подключите D6 ЖК-дисплея к контакту 6 Arduino.
  • Подключите D5 ЖК-дисплея к контакту 5 Arduino.
  • Подключите D4 ЖК-дисплея к контакту 4 Arduino.
  • Подключите VSS & K к GND
  • Подключите VDD & A к 5v
  • Подключите vo к выходному контакту потенциометра

Шаг 3: Код для часов Arduino с RTC

Код для часов Arduino с RTC
Код для часов Arduino с RTC

DS3231 работает только с форматом BCD, и для преобразования BCD в десятичное и наоборот я использовал 2 строки ниже (пример для минуты): // Преобразование BCD в десятичныйminute = (минута >> 4) * 10 + (минута & 0x0F);

// Преобразование десятичной дроби в BCDminute = ((минута / 10) << 4) + (минута% 10); void DS3231_display (): отображает время и календарь, перед отображением времени и календаря данные преобразуются из BCD в десятичный формат. избегайте blink_parameter ():

// Часы и календарь реального времени с кнопками настройки с использованием DS3231 и Arduino // Включить код библиотеки ЖК-дисплея #include // Включить код библиотеки Wire (необходим для устройств протокола I2C) #include // Подключения модуля ЖК-дисплея (RS, E, D4, D5, D6, D7) ЖК-дисплей LiquidCrystal (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // button1 подключен к выводу 8 pinMode (9, INPUT_PULLUP); // button2 подключен к выводу 9 // настраиваем количество столбцов и строк ЖК-дисплея lcd.begin (16, 2); Wire.begin (); // Присоединяемся к шине i2c} char Time = "TIME:::"; char Calendar = "ДАТА: / / 20"; байт i, секунда, минута, час, число, месяц, год; void DS3231_display () {// Преобразуем двоично-десятичный код в десятичную секунду = (секунда >> 4) * 10 + (секунда & 0x0F); минута = (минута >> 4) * 10 + (минута & 0x0F); час = (час >> 4) * 10 + (час & 0x0F); дата = (дата >> 4) * 10 + (дата & 0x0F); месяц = (месяц >> 4) * 10 + (месяц & 0x0F); год = (год >> 4) * 10 + (год & 0x0F); // Время окончания преобразования [12] = секунда% 10 + 48; Время [11] = секунда / 10 + 48; Время [9] = минуты% 10 + 48; Время [8] = минута / 10 + 48; Время [6] = час% 10 + 48; Время [5] = час / 10 + 48; Календарь [14] = год% 10 + 48; Календарь [13] = год / 10 + 48; Календарь [9] = месяц% 10 + 48; Календарь [8] = месяц / 10 + 48; Календарь [6] = дата% 10 + 48; Календарь [5] = дата / 10 + 48; lcd.setCursor (0, 0); lcd.print (Время); // Отображение времени lcd.setCursor (0, 1); lcd.print (Календарь); // Отображение календаря} void blink_parameter () {byte j = 0; while (j 23) // Если часы> 23 ==> часы = 0 параметр = 0; if (i == 1 && параметр> 59) // Если минуты> 59 ==> минуты = 0 параметр = 0; if (i == 2 && параметр> 31) // Если дата> 31 ==> дата = 1 параметр = 1; if (i == 3 && параметр> 12) // Если месяц> 12 ==> месяц = 1 параметр = 1; if (i == 4 && параметр> 99) // Если год> 99 ==> год = 0 параметр = 0; sprintf (текст, "% 02u", параметр); lcd.setCursor (x, y); lcd.print (текст); задержка (200); // Ждем 200 мс} lcd.setCursor (x, y); lcd.print (""); // Отображаем два пробела blink_parameter (); sprintf (текст, "% 02u", параметр); lcd.setCursor (x, y); lcd.print (текст); blink_parameter (); if (! digitalRead (8)) {// Если кнопка (контакт №8) нажата i ++; // Увеличение 'i' для следующего параметра return parameter; // Возвращаем значение параметра и выходим}}} void loop () {if (! DigitalRead (8)) {// Если кнопка (контакт № 8) нажата i = 0; час = редактировать (5, 0, час); минута = редактировать (8, 0, минута); дата = редактировать (5, 1, дата); месяц = редактировать (8, 1, месяц); год = редактировать (13, 1, год); // Преобразование десятичной дроби в двоично-десятичное. Minute = ((minute / 10) << 4) + (minute% 10); час = ((час / 10) << 4) + (час% 10); дата = ((дата / 10) << 4) + (дата% 10); месяц = ((месяц / 10) << 4) + (месяц% 10); год = ((год / 10) << 4) + (год% 10); // Завершить преобразование // Записать данные в DS3231 RTC Wire.beginTransmission (0x68); // Запуск протокола I2C с адресом DS3231 Wire.write (0); // Отправляем адрес регистра Wire.write (0); // Сбрасываем сезоны и запускаем осциллятор Wire.write (minute); // Записываем минуту Wire.write (час); // Записываем час Wire.write (1); // Записываем день (не используется) Wire.write (date); // Записываем дату Wire.write (месяц); // Записываем месяц Wire.write (год); // Записываем год Wire.endTransmission (); // Остановка передачи и снятие задержки шины I2C (200); // Ждем 200 мс} Wire.beginTransmission (0x68); // Запуск протокола I2C с адресом DS3231 Wire.write (0); // Отправляем адрес регистра Wire.endTransmission (false); // перезапуск I2C Wire.requestFrom (0x68, 7); // Запрашиваем 7 байт у DS3231 и освобождаем шину I2C в конце чтения second = Wire.read (); // Считываем секунды из регистра 0 minute = Wire.read (); // Считываем минуты из регистра 1 час = Wire.read (); // Считываем час из регистра 2 Wire.read (); // Считываем день из регистра 3 (не используется) date = Wire.read (); // Считываем дату из регистра 4 month = Wire.read (); // Считываем месяц из регистра 5 year = Wire.read (); // Считываем год из регистра 6 DS3231_display (); // Время отображения и календарная задержка (50); // Ждем 50 мс}

Рекомендуемые: