Mundarija:

Arduino bilan real vaqt soati: 3 qadam
Arduino bilan real vaqt soati: 3 qadam

Video: Arduino bilan real vaqt soati: 3 qadam

Video: Arduino bilan real vaqt soati: 3 qadam
Video: buka buka raqisi yoqqan bõlsa bitta layk 2024, Iyul
Anonim
Arduino bilan real vaqtda soat
Arduino bilan real vaqtda soat

Ushbu loyihada biz Arduino va RTC moduli yordamida soat yasaymiz. Ma'lumki, Arduino haqiqiy vaqtni ko'rsatolmaydi, shuning uchun biz LCD displeyda kerakli vaqtni ko'rsatish uchun RTC modulidan foydalanamiz. Har bir qadamni diqqat bilan o'qing, bu sizga soat mexanizmini yaratishga yordam beradi.

DS3231 Arduino kodi DS1307 kodiga o'xshaydi va u ikkala RTC chiplari bilan ishlaydi.

Pastdagi Arduino kodi DS3231 RTC uchun hech qanday kutubxonadan foydalanmaydi, Wire kutubxonasi I2C konventsiyasidan foydalangan holda Arduino va DS3231 o'rtasidagi yozishmalar uchun.

Ha! Ko'pgina elektron muhandislar o'z vaqtiga asoslangan loyihalariga ishonishadi, lekin RTC to'liq ishonchli emas. U batareya bilan ishlaydi va uni tez yoki kech almashtirish kerak. IoT loyihalariga keladigan bo'lsak, u qimmatli SPI (Serial Periferik Interfeys) pinlarini egallaydi va atrofidagi simlar chalkashib ketadi. Yechim…. Mana bizning qahramonimiz NTP (Tarmoq vaqt protokoli). NTP juda aniq, chunki u internetdan vaqt oladi. Biz ushbu protokolni mijoz-server rejimidan foydalanamiz. jarayon shu qadar oddiyki, bizning Nodemcu mijoz vazifasini bajaradi va UDP yordamida serverdan NTP paketini so'raydi. Buning evaziga server mijozga ma'lumotlarni tahlil qiladigan paket yuboradi. NTP - bu universal sinxronizatsiya protokoli. Keling, laboratoriyalarimizning ish joyini yoritib beraylik

1 -qadam: kerakli komponentlar

  • Arduino taxtasi
  • DS3231 RTC platasi
  • 16x2 LCD displey
  • 2 marta bosish tugmasi
  • 10K ohmli o'zgaruvchan qarshilik (yoki potansiyometr)
  • 330 ohmli qarshilik
  • 3V tanga batareyasi
  • Non paneli
  • Jumper simlari

RTC mokulasi DS3231

Vaqt-bu insoniyat tez rivojlanayotgan dunyoda zaruriy tuyg'u. Haqiqiy vaqtda loyihada

Biz RTC-dan foydalanamiz (A. K. A real vaqtda soat)

RTC Real-time-clock (RTC)-bu joriy vaqtni kuzatib boradigan, elektron rejim (IC). RTC vaqtni real rejimda boshqaradi. O'z vaqtida kirishni talab qilish uchun RTC odatda kompyuter anakartlarida va o'rnatilgan tizimlarda bo'ladi.

2 -qadam: Arduino soatining ulanishi

Arduino soatining ulanishi
Arduino soatining ulanishi
  • SCL pinini RTC moduliga Arduino A5 ga ulang
  • SDA pinini RTC moduliga Arduino A4 ga ulang
  • VCC ni 5v ga va GND ni GND ga ulang
  • Tugmani pin 8 ga ulang
  • Boshqa tugmani pin 9 ga ulang
  • LCD displeyini Arduino -ning 2 -piniga ulang
  • LCD E -ni Arduino -ning 3 -piniga ulang
  • LCD D7 -ni Arduino -ning 7 -piniga ulang
  • LCD D6 -ni Arduino -ning 6 -piniga ulang
  • LCD D5 -ni Arduino -ning 5 -piniga ulang
  • LCD D4 -ni Arduino -ning 4 -piniga ulang
  • VSS & K ni GND ga ulang
  • VDD va A ni 5v ga ulang
  • Vo -ni potentsiometr chiqish piniga ulang

3 -qadam: Arduino RTC bilan soat kodi

Arduino CTC uchun kod
Arduino CTC uchun kod

DS3231 faqat BCD formatida ishlaydi va BCDni kasrli va teskari tomonga aylantirish uchun men quyidagi 2 satrdan foydalanganman (misol uchun daqiqa): // BCDni o'nli daqiqaga aylantirish = (daqiqa >> 4) * 10 + (daqiqa va 0x0F);

// O'nli kasrni BCDminute ga aylantirish = ((daqiqa / 10) << 4) + (daqiqa % 10); void DS3231_display (): vaqt va taqvimni ko'rsatadi, vaqt va kalendar ma'lumotlarini ko'rsatishdan oldin BCD dan o'nlik formatga o'tkaziladi. void blink_parameter ():

// DS3231 va Arduino -dan foydalangan holda tugmachalari bo'lgan real vaqtda soat va taqvim // LCD kutubxona kodini o'z ichiga oladi #include // simli kutubxona kodini o'z ichiga oladi (I2C protokoli qurilmalari uchun kerak) #kiritish // LCD modul ulanishlari (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) piniga ulangan; // tugma 2 pin 9 ga ulangan // LCD displeyidagi ustunlar va qatorlar sonini sozlash lcd.begin (16, 2); Wire.begin (); // i2c avtobusiga qo'shilish} char Time = "TIME:::"; char Calendar = "DATE: / / 20"; bayt i, ikkinchi, daqiqa, soat, sana, oy, yil; void DS3231_display () {// BCDni o'nli soniyaga aylantirish = (soniya >> 4) * 10 + (ikkinchi va 0x0F); daqiqa = (daqiqa >> 4) * 10 + (daqiqa & 0x0F); soat = (soat >> 4) * 10 + (soat & 0x0F); sana = (sana >> 4) * 10 + (sana va 0x0F); oy = (oy >> 4) * 10 + (oy va 0x0F); yil = (yil >> 4) * 10 + (yil & 0x0F); // Oxirgi konvertatsiya vaqti [12] = ikkinchi % 10 + 48; Vaqt [11] = soniya / 10 + 48; Vaqt [9] = daqiqa % 10 + 48; Vaqt [8] = daqiqa / 10 + 48; Vaqt [6] = soat % 10 + 48; Vaqt [5] = soat / 10 + 48; Kalendar [14] = yil % 10 + 48; Kalendar [13] = yil / 10 + 48; Kalendar [9] = oy % 10 + 48; Kalendar [8] = oy / 10 + 48; Kalendar [6] = sana % 10 + 48; Taqvim [5] = sana / 10 + 48; lcd.setCursor (0, 0); lcd.print (Vaqt); // Vaqtni ko'rsatish lcd.setCursor (0, 1); lcd.print (taqvim); // Taqvimni ko'rsatish} void blink_parameter () {bayt j = 0; while (j 23) // Agar soat> 23 ==> soat = 0 parametr = 0 bo'lsa; if (i == 1 && parametr> 59) // Agar daqiqa> 59 ==> daqiqa = 0 parametr = 0; if (i == 2 && parametr> 31) // Agar sana> 31 ==> sana = 1 parametr = 1; if (i == 3 && parametr> 12) // Agar oy> 12 ==> oy = 1 parametr = 1; if (i == 4 && parametr> 99) // Agar yil> 99 ==> yil = 0 parametr = 0; sprintf (matn, "%02u", parametr); lcd.setCursor (x, y); lcd.print (matn); kechikish (200); // 200ms kuting} lcd.setCursor (x, y); lcd.print (""); // ikkita bo'sh joyni ko'rsatish blink_parameter (); sprintf (matn, "%02u", parametr); lcd.setCursor (x, y); lcd.print (matn); blink_parametr (); if (! digitalRead (8)) {// Agar tugma (pin #8) i ++ bosilsa; // Keyingi parametr qaytish parametri uchun 'i' balandligi; // Parametr qiymatini qaytaring va}}} void loop () {if (! DigitalRead (8)) {// If (pin #8) tugmasi bosilsa i = 0; soat = tahrir (5, 0, soat); daqiqa = tahrir (8, 0, daqiqa); sana = tahrirlash (5, 1, sana); oy = tahrir (8, 1, oy); yil = tahrir (13, 1, yil); // O'nli kasrni BCD daqiqasiga aylantirish = ((daqiqa / 10) << 4) + (daqiqa % 10); soat = ((soat / 10) << 4) + (soat % 10); sana = ((sana / 10) << 4) + (sana % 10); oy = ((oy / 10) << 4) + (oy % 10); yil = ((yil / 10) << 4) + (yil % 10); // Konversiyani tugatish // DS3231 RTC Wire.beginTransmission -ga ma'lumotlarni yozish (0x68); // Wire.write (0) DS3231 manzili bilan I2C protokolini ishga tushiring; // Ro'yxatdan o'tish manzilini yuboring Wire.write (0); // Sesondlarni qayta o'rnating va Wire.write osilatorini ishga tushiring (daqiqa); // Wire.write daqiqasini yozing (soat); // Yozish vaqti Wire.write (1); // Yozish kuni (ishlatilmaydi) Wire.write (sana); // Wire.write sanasini yozish (oy); // Wire.write oyini yozing (yil); // Wire.endTransmission yilini yozing (); // uzatishni to'xtating va I2C avtobusining kechikishini bo'shating (200); // 200ms kuting} Wire.beginTransmission (0x68); // Wire.write (0) DS3231 manzili bilan I2C protokolini ishga tushiring; // Wire.endTransmission ro'yxatdan o'tish manzilini yuborish (noto'g'ri); // I2Cni qayta ishga tushirish Wire.requestFrom (0x68, 7); // DS3231 -dan 7 bayt talab qiling va ikkinchi o'qish oxirida I2C avtobusini chiqaring = Wire.read (); // Registrdan soniyani o'qing 0 daqiqa = Wire.read (); // Registrdan minutlarni o'qish 1 soat = Wire.read (); // 2 Wire.read () registridan o'qish vaqti; // 3 -registrdan o'qish kuni (ishlatilmaydi) sana = Wire.read (); // Ro'yxatdan o'tilgan sanani o'qish 4 oy = Wire.read (); // Ro'yxatdan o'tish oyini o'qing 5 yil = Wire.read (); // Ro'yxatdan o'tish yilini o'qing 6 DS3231_display (); // Diaplay vaqti va taqvim kechikishi (50); // 50 daqiqa kuting}

Tavsiya: