Съдържание:

Часовник в реално време с Arduino: 3 стъпки
Часовник в реално време с Arduino: 3 стъпки

Видео: Часовник в реално време с Arduino: 3 стъпки

Видео: Часовник в реално време с Arduino: 3 стъпки
Видео: Automatic Start-Stop Controller with DS3231 Real-Time Clock 2024, Юли
Anonim
Часовник в реално време с Arduino
Часовник в реално време с Arduino

В този проект ще направим часовник с помощта на модула Arduino и RTC. Както знаем, Arduino не може да покаже действителното време, така че ще използваме RTC модула за показване на точното време на LCD дисплея. Прочетете внимателно цялата стъпка, тя ще ви помогне много да направите часовника.

Кодът DS3231 Arduino е като кода DS1307 и работи с двата RTC чипа.

Кодът Arduino отдолу не използва никаква библиотека за DS3231 RTC, библиотеката Wire е за кореспонденция между Arduino и DS3231, използвайки конвенцията I2C.

Да! Много инженери по електроника зависят от него за своите проекти, базирани на времето, но RTC не е напълно надежден. Работи с батерии и трябва да се смени скоро или по -късно. Идвайки в IoT проекти, той заема ценни щифтове за SPI (Serial Peripheral Interface) и се обърква с оплетени проводници. Решение … Тук идва нашият герой NTP (протокол за мрежово време). NTP е толкова точен, тъй като получава време от интернет. Ще управляваме този протокол, използвайки режим клиент-сървър. процесът е толкова прост, че нашият Nodemcu действа като клиент и иска NTP пакет от сървъра, използвайки UDP. В замяна сървърът изпраща пакет до клиента, който анализира данните. NTP е универсалният протокол за синхронизация на времето. Нека сега осветим лабораторната си работна станция

Стъпка 1: Необходими компоненти

  • Дъска Arduino
  • DS3231 RTC платка
  • 16x2 LCD екран
  • 2 x бутон
  • 10K ом променлив резистор (или потенциометър)
  • 330-омов резистор
  • 3V монетарна батерия
  • Платка
  • Кабелни проводници

RTC мокула DS3231

Времето е съществен смисъл, необходим в този забързан свят на хората. В проект в реално време

Използваме RTC (часовник в реално време A. K. A)

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

Стъпка 2: Свързване на Arduino Clock

Свързване на часовника Arduino
Свързване на часовника Arduino
  • Свържете SCL щифт към RTC модул към Arduino A5
  • Свържете SDA щифт към RTC модул към Arduino A4
  • Свържете VCC към 5v и GND към GND
  • Свържете бутон към щифта 8
  • Свържете друг бутон към щифта 9
  • Свържете RS на LCD към щифт 2 на Arduino
  • Свържете E на LCD към щифт 3 на Arduino
  • Свържете D7 на LCD към щифт 7 на Arduino
  • Свържете D6 на LCD към щифт 6 на Arduino
  • Свържете D5 на LCD към щифт 5 на Arduino
  • Свържете D4 на LCD към щифт 4 на Arduino
  • Свържете VSS & K към GND
  • Свържете VDD & A към 5v
  • Свържете vo към изходния щифт на потенциометъра

Стъпка 3: Код за часовник Arduino с RTC

Код за часовник Arduino с RTC
Код за часовник Arduino с RTC

DS3231 работи само с BCD формат и за преобразуване на BCD в десетичен и обратно Използвах 2 реда по -долу (пример за минута): // Конвертиране на BCD в десетична минута = (минута >> 4) * 10 + (минута & 0x0F);

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

// Часовник и календар в реално време с зададени бутони, използващи DS3231 и Arduino // включва код на LCD библиотеката #include // включва код на библиотеката на проводника (необходим за устройства с протокол I2C) #include // LCD модулни връзки (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // button1 е свързан към пин 8 pinMode (9, INPUT_PULLUP); // бутон 2 е свързан към щифт 9 // настройва броя на колоните и редовете на LCD дисплея lcd.begin (16, 2); Wire.begin (); // Присъединете се към i2c автобус} char Time = "TIME:::"; char Calendar = "ДАТА: / / 20"; байт i, втора, минута, час, дата, месец, година; void DS3231_display () {// Конвертира BCD в десетична секунда = (втора >> 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 () {байт 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); // Изчакайте 200ms} lcd.setCursor (x, y); lcd.print (""); // Показване на две интервали blink_parameter (); sprintf (текст, "%02u", параметър); lcd.setCursor (x, y); lcd.print (текст); blink_parameter (); if (! digitalRead (8)) {// Ако е натиснат бутон (щифт #8) i ++; // Увеличаване на „i“за следващия параметър за връщане на параметър; // Върнете стойността на параметъра и излезте}}} void loop () {if (! DigitalRead (8)) {// Ако е натиснат бутон (щифт #8) i = 0; час = редактиране (5, 0, час); минута = редактиране (8, 0, минута); дата = редактиране (5, 1, дата); месец = редактиране (8, 1, месец); година = редактиране (13, 1, година); // Конвертиране на десетичен знак в BCD минута = ((минута / 10) << 4) + (минута % 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 (минута); // Записване на минута Wire.write (час); // Пише час Wire.write (1); // Записване на ден (не се използва) Wire.write (дата); // Записване на дата Wire.write (месец); // Запишете месец Wire.write (година); // Напишете година Wire.endTransmission (); // Спиране на предаването и освобождаване на закъснението на I2C шината (200); // Изчакайте 200ms} Wire.beginTransmission (0x68); // Стартиране на I2C протокол с адрес DS3231 Wire.write (0); // Изпращане на адрес на регистрация Wire.endTransmission (false); // I2C рестартиране Wire.requestFrom (0x68, 7); // Изискване на 7 байта от DS3231 и освобождаване на I2C шина в края на второто четене = Wire.read (); // Четене на секунди от регистър 0 минута = Wire.read (); // Прочетете минутите от регистъра 1 час = Wire.read (); // Четене на час от регистър 2 Wire.read (); // Четене на ден от регистър 3 (не се използва) дата = Wire.read (); // Прочетете дата от регистъра 4 месеца = Wire.read (); // Четене на месец от регистър 5 година = Wire.read (); // Прочетете година от регистър 6 DS3231_display (); // Време на показване и забавяне на календара (50); // Изчакайте 50ms}

Препоръчано: