Мазмуну:

Ардуино менен реалдуу убакыт сааты: 3 кадам
Ардуино менен реалдуу убакыт сааты: 3 кадам

Video: Ардуино менен реалдуу убакыт сааты: 3 кадам

Video: Ардуино менен реалдуу убакыт сааты: 3 кадам
Video: DS3231 реалдуу убакыт сааты менен автоматтык баштоо-токтоочу контроллер 2024, Ноябрь
Anonim
Ардуино менен реалдуу убакыт сааты
Ардуино менен реалдуу убакыт сааты

Бул долбоордо биз Arduino жана RTC модулунун жардамы менен саат жасайбыз. Биз билгендей, Arduino чыныгы убакытты көрсөтө албайт, андыктан биз ЖКда туура убакытты көрсөтүү үчүн RTC модулун колдонобуз. Бардык кадамдарды кунт коюп окуңуз, ал саатты жасоого чоң жардам берет.

DS3231 Arduino коду DS1307 кодуна окшош жана ал RTC чиптери менен тең иштейт.

Астындагы Arduino коду DS3231 RTC үчүн эч кандай китепкананы колдонбойт, Wire китепканасы I2C конвенциясын колдонуп Arduino менен DS3231дин кат алышуусу үчүн.

Ооба! Көптөгөн электроника инженерлери убакытка негизделген долбоорлорунан көз каранды, бирок RTC толук ишенимдүү эмес. Бул батарейка менен иштейт жана эртеби -кечпи алмаштырылышы керек. IoT долбоорлоруна келе турган болсок, ал баалуу SPI (Serial Perifheral Interface) казыктарын ээлейт жана айланасында чырмалышкан зымдар менен башаламан болуп калат. Чечим …. Бул жерде биздин каарман NTP (Network time protocol) келет. NNTP интернеттен убакыт алгандыктан абдан так. Биз бул протоколду кардар-сервер режимин колдонуу менен иштетебиз. процесс ушунчалык жөнөкөй болгондуктан, биздин Nodemcu кардар катары иштейт жана UDP аркылуу серверден NTP пакетин сурайт. Өз кезегинде, сервер маалыматтарды талдай турган кардарга пакет жөнөтөт. NTP - универсалдуу убакыт синхрондоштуруу протоколу. Эми лабораторияларыбыздын иштөө бекетин жарык кылалы

1 -кадам: Керектүү компоненттер

  • Arduino тактасы
  • DS3231 RTC тактасы
  • 16x2 LCD экран
  • 2 x баскыч
  • 10K ом өзгөрмө каршылыгы (же потенциометр)
  • 330-Ом каршылыгы
  • 3V монеталуу батарея
  • Breadboard
  • Өткөргүч зымдар

RTC mocule DS3231

Убакыт-бул тез адамзаттык дүйнөдө талап кылынган маанилүү сезим. Реалдуу убакыт долбоорунда

Биз RTC колдонобуз (A. K. A Реалдуу убакыт сааты)

RTC Real-time-clock (RTC)-бул интегралдык схема (IC), ал учурдагы убакытты көзөмөлдөйт. RTC реалдуу режимде убакытка кам көрөт. RTC, адатта, өз убагында жетүүнү талап кылуу үчүн компьютердик энелерде жана камтылган системаларда кездешет.

2 -кадам: Arduino саатынын туташуусу

Arduino Саатынын туташуусу
Arduino Саатынын туташуусу
  • SCL пинди RTC модулуна Arduino A5ке туташтырыңыз
  • SDA пинин RTC модулуна Arduino A4ке туташтырыңыз
  • VCCди 5v менен GNDге GNDге туташтырыңыз
  • 8 -пинге баскычты туташтырыңыз
  • 9 -пинге башка баскычты туташтырыңыз
  • Ардуинонун 2 -пинине RSтин ЖК туташтырыңыз
  • Ардуинонун 3 -пинине LCD E'син туташтырыңыз
  • ЖКнын D7'син Arduino 7 -пин туташтырыңыз
  • LCD D6'ны Arduino 6 -пинге туташтырыңыз
  • LCD D5'ти Arduino 5 -пин туташтырыңыз
  • ЖКнын D4'ин Arduino 4 -пинге туташтырыңыз
  • GSNге VSS & K туташтырыңыз
  • VDD & A'ны 5vге туташтырыңыз
  • Вотту потенциометрдин чыккычына туташтырыңыз

3 -кадам: RTC менен Arduino саатынын коду

RTC менен Arduino саатынын коду
RTC менен Arduino саатынын коду

DS3231 BCD форматында гана иштейт жана BCDди ондукка жана тескерисинче айландыруу үчүн мен төмөндөгү 2 сапты колдоном (мүнөт үчүн мисал): // BCDди ондук мүнөткө айландыруу = (мүнөт >> 4) * 10 + (мүнөт & 0x0F);

// Ондукту BCDminuteга айландыруу = ((мүнөт / 10) << 4) + (мүнөт % 10); void DS3231_display (): убакытты жана календарды көрсөтөт, убакытты көрсөтүүдөн мурун жана календардык маалыматтар BCDден ондук форматка которулат. void blink_parameter ():

// DS3231 жана Arduino аркылуу баскычтары бар реалдуу убакыт сааты жана календары // LCD китепканасынын кодун камтыйт #include // Wire китепканасынын кодун камтыйт (I2C протоколунун түзмөктөрү үчүн керек) #кошуу // ЖК модулунун байланыштары (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) пинге туташкан; // button2 9 -пинге туташкан // ЖКнын мамычаларынын жана катарларынын санын орнотуу lcd.begin (16, 2); Wire.begin (); // i2c автобусына кошул} char Time = "TIME:::"; char Календар = "DATE: / / 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 (Убакыт); // Display lcd.setCursor (0, 1); lcd.print (Календарь); // Календарды көрсөтүү} void blink_parameter () {байт j = 0; while (j 23) // Эгерде саат> 23 ==> саат = 0 параметр = 0; if (i == 1 && parameter> 59) // If minutes> 59 ==> minutes = 0 parameter = 0; if (i == 2 && parameter> 31) // If date> 31 ==> date = 1 parameter = 1; if (i == 3 && parameter> 12) // If month> 12 ==> month = 1 parameter = 1; if (i == 4 && parameter> 99) // If year> 99 ==> year = 0 parameter = 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)) {// If button (pin #8) is pressed i ++; // Кийинки параметр кайтаруучу параметр үчүн 'i' көбөйтүү; // Параметрдин маанисин кайтаруу жана чыгуу}}} void loop () {if (! DigitalRead (8)) {// If button (pin #8) is pressed 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); // DS3231 дареги менен I2C протоколун баштаңыз 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); // DS3231 дареги менен I2C протоколун баштаңыз Wire.write (0); // Реестр дарегин жөнөтүү Wire.endTransmission (жалган); // I2C кайра баштоо Wire.requestFrom (0x68, 7); // DS3231ден 7 байт сураңыз жана 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); // 50м күтө}

Сунушталууда: