Mundarija:

Arduino bilan DS1307 va DS3231 real vaqtda soat modullaridan foydalanish: 3 qadam
Arduino bilan DS1307 va DS3231 real vaqtda soat modullaridan foydalanish: 3 qadam

Video: Arduino bilan DS1307 va DS3231 real vaqtda soat modullaridan foydalanish: 3 qadam

Video: Arduino bilan DS1307 va DS3231 real vaqtda soat modullaridan foydalanish: 3 qadam
Video: FLProg7: часы реального времени и температура | ESP32 NodeMCU | Визуальное программирование для 2024, Noyabr
Anonim
Arduino bilan DS1307 va DS3231 real vaqtda soat modullaridan foydalanish
Arduino bilan DS1307 va DS3231 real vaqtda soat modullaridan foydalanish
Arduino bilan DS1307 va DS3231 real vaqtda soat modullaridan foydalanish
Arduino bilan DS1307 va DS3231 real vaqtda soat modullaridan foydalanish

Biz har xil manbalardan Arduino bilan DS1307 va DS3231 real vaqtli soat modullaridan qanday foydalanish bo'yicha so'rovlarni olishni davom ettirmoqdamiz-shuning uchun bu ulardan foydalanish bo'yicha ikki qismli darslikning birinchisi. Bu Arduino qo'llanmasi uchun bizda ikkita real vaqtda ishlaydigan soat modullari mavjud, ulardan biri Maxim DS1307 (kvadrat moduli) va DS3231 (to'rtburchaklar modul) ga asoslangan.

Haqiqiy vaqtda soat modullarida IClar o'rtasida ikkita asosiy farq bor, bu vaqtni saqlashning aniqligi. Birinchi modulda ishlatiladigan DS1307 juda yaxshi ishlaydi, lekin tashqi harorat DS1307 ichki hisoblagichini boshqaradigan osilator sxemasining chastotasiga ta'sir qilishi mumkin.

Bu muammo kabi tuyulishi mumkin, lekin odatda soat oyiga taxminan besh yoki undan ko'p daqiqaga yopiq bo'ladi. DS3231 ancha aniqroq, chunki u tashqi omillar ta'sir qilmaydigan ichki osilatorga ega va shuning uchun yiliga bir necha daqiqagacha aniq bo'ladi. Agar sizda DS1307 moduli bo'lsa- o'zingizni yomon his qilmang, bu baribir qimmatbaho karta va sizga yaxshi xizmat qiladi. Ikkala modulda ham zaxira batareya kerak.

Yangi CR2032 batareyasini sotib olish va uni modulga moslashtirish yaxshidir. Vaqt va sanani kuzatib borish bilan bir qatorda, bu modullarda kichik EEPROM, signalizatsiya funktsiyasi (faqat DS3231) va har xil chastotali kvadrat to'lqinlarni yaratish qobiliyati ham bor-bularning barchasi ikkinchi darslik mavzusi bo'ladi.

1 -qadam: Modulingizni Arduino -ga ulash

Ikkala modul ham I2C avtobusidan foydalanadi, bu ulanishni juda osonlashtiradi.

Avval siz Arduino yoki I2C avtobus uchun mos keladigan taxtalarda qaysi pinlar ishlatilishini aniqlashingiz kerak - ular SDA (yoki ma'lumotlar) va SCL (yoki soat) sifatida ma'lum bo'ladi. Arduino Uno yoki mos keladigan taxtalarda bu pinlar ma'lumot va soat uchun A4 va A5; Arduino Mega-dagi pinlar ma'lumotlar va soat uchun D20 va D21; Va agar siz Pro Mini-ga mos keladigan pinlar A4 va A5 bo'lsa. asosiy pinlarga parallel bo'lgan ma'lumotlar va soat uchun.

DS1307 moduli

Agar sizda DS1307 moduli bo'lsa, siz simlarni taxtaga lehimlashingiz yoki o'tish joyidagi simlarni ishlatishingiz uchun bir qatorli kirish pimlariga lehimlashingiz kerak bo'ladi. Keyin SCL va SDA pinlarini Arduino -ga, Vcc pinini 5V -ga va GND -ni GND -ga ulang.

DS3231 moduli

Ushbu modulni ulash oson, chunki zavod plyonkalari taxtaga o'rnatilgan. Siz shunchaki SCL va SDA -dan Arduino -ga, yana modulning Vcc va GND pinlaridan 5V yoki 3.3. V va GND -ga o'tish kabellarini o'tkazishingiz mumkin. Biroq, bu simlarni lehimlash uchun boshqa tomondan takrorlanadi. Ushbu modullarning har ikkalasida ham kerakli tortishish rezistorlari mavjud, shuning uchun o'zingizni qo'shishingiz shart emas. I2C avtobusiga ulangan barcha qurilmalar singari, SDA va SCL simlarining uzunligini minimal darajada ushlab turishga harakat qiling.

2 -qadam: RTC modulidan vaqtni o'qish va yozish

RTC modulini ulaganingizdan so'ng. quyidagi eskizni kiriting va yuklang. Eskizdagi eslatmalar va funktsiyalar faqat DS3231 ga tegishli bo'lsa -da, kod DS1307 bilan ham ishlaydi.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Oddiy o'nlik sonlarni ikkilik kodli o'nli baytlarga aylantirish decToBcd (bayt val) {qaytish ((val/10*16) + (val%10)); } // Ikkilik kodli o'nli kasrni oddiy kasr sonlariga aylantirish bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.begin (9600); // bu erda boshlang'ich vaqtni belgilang: // DS3231 soniya, daqiqa, soat, kun, sana, oy, yil // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (bayt soniya, bayt daqiqa, bayt soat, dayOfWeek, day dayOfMonth, bayt oy, bayt yili) {// DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS) ga vaqt va sana ma'lumotlarini o'rnatadi; Wire.write (0); // Wire.write (decToBcd (sekundida)) registrini sekunddan boshlash uchun keyingi kirishni o'rnating; // soniyalarni belgilang Wire.write (decToBcd (daqiqa)); // daqiqalarni belgilang Wire.write (decToBcd (soat)); // Wire.write soatlarini belgilash (decToBcd (dayOfWeek))); // haftaning kunini belgilang (1 = yakshanba, 7 = shanba) Wire.write (decToBcd (dayOfMonth))); // sanani belgilash (1 dan 31 gacha) Wire.write (decToBcd (oy)); // oyni belgilang Wire.write (decToBcd (yil)); // belgilangan yil (0 dan 99 gacha) Wire.endTransmission (); } void readDS3231time (bayt *soniya, bayt *daqiqa, bayt *soat, bayt *dayOfWeek, bayt *dayOfMonth, bayt *oy, bayt *yil) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // DS3231 registr ko'rsatkichini 00h Wire.endTransmission () ga o'rnating; Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // DS3231 -dan 00 baytdan boshlab etti bayt ma'lumot so'rash *soniya = bcdToDec (Wire.read () & 0x7f); *daqiqa = bcdToDec (Wire.read ()); *soat = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *oy = bcdToDec (Wire.read ()); *yil = bcdToDec (Wire.read ()); } void displayTime () {bayt soniya, daqiqa, soat, dayOfWeek, dayOfMonth, oy, yil; // DS3231 readDS3231time -dan ma'lumotlarni olish (& ikkinchi, & daqiqa, & soat, & dayOfWeek, & dayOfMonth, & oy va yil); // uni ketma -ket monitorga yuborish Serial.print (soat, DEC); // Serial.print (":") ko'rsatilganda bayt o'zgaruvchisini o'nlik raqamga aylantirish; if (daqiqa <10) {Serial.print ("0"); } Serial.print (daqiqa, DEC); Serial.print (":"); if (ikkinchi <10) {Serial.print ("0"); } Serial.print (ikkinchi, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (oy, DEC); Serial.print ("/"); Serial.print (yil, DEC); Serial.print ("Hafta kuni:"); switch (dayOfWeek) {1 -holat: Serial.println ("Yakshanba"); tanaffus; 2 -holat: Serial.println ("Dushanba"); tanaffus; 3 -holat: Serial.println ("Seshanba"); tanaffus; 4 -holat: Serial.println ("chorshanba"); tanaffus; 5 -holat: Serial.println ("Payshanba"); tanaffus; 6 -holat: Serial.println ("Juma"); tanaffus; 7 -holat: Serial.println ("Shanba"); tanaffus; }} void loop () {displayTime (); // ketma-ket monitorda real vaqtda soat ma'lumotlarini ko'rsatish, kechiktirish (1000); // har soniyada}

Kod juda ko'p bo'lishi mumkin, lekin u yaxshi boshqariladigan qismlarga bo'linadi.

U birinchi navbatda I2C avtobus aloqasi uchun ishlatiladigan Wire kutubxonasini o'z ichiga oladi, keyin RTC uchun avtobus manzilini 0x68 deb belgilaydi. Bulardan keyin ikkita funktsiyani bajaradi, ular kasr sonlarini BCD (ikkilik kodli kasr) va aksincha o'zgartiradi. Bu zarur, chunki RTC IClari o'nlik kasrda emas, BCDda ishlaydi.

SetDS3231time () funktsiyasi soatni sozlash uchun ishlatiladi. Buni ishlatish juda oson, oddiygina qiymatlarni yildan -yilga kiritish va RTC o'sha paytdan boshlanadi. Masalan, agar siz quyidagi sana va vaqtni - 2014 yil 26 -noyabr, chorshanba va 21:42 va 30 soniyani belgilashni xohlasangiz:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

3 -qadam:

E'tibor bering, vaqt 24 soatlik vaqt bilan belgilanadi va to'rtinchi parametr "haftaning kuni" dir. Bu mos ravishda yakshanbadan shanbagacha 1 dan 7 gacha. Agar siz o'zingizning o'zgaruvchilaringizni qo'shsangiz, bu parametrlar bayt qiymatlari hisoblanadi.

Agar siz funktsiyani ishga tushirgan bo'lsangiz, uni // bilan oldindan belgilash va kodni qayta yuklash oqilona bo'ladi, shuning uchun quvvat aylangach yoki mikrokontroller qayta tiklansa, u vaqtni o'zgartirmaydi. Sizning RTC -dan vaqtni o'qish juda oddiy, aslida jarayonni displayTime () funktsiyasida aniq kuzatish mumkin. Ma'lumotni RTCdan saqlash uchun sizga yetti baytli o'zgaruvchi belgilanishi kerak bo'ladi va ular keyinchalik readDS3231time () funktsiyasiga kiritiladi. Masalan, agar sizning o'zgaruvchilaringiz:

bayt soniya, daqiqa, soat, dayOfWeek, dayOfMonth, oy, yil;

… siz ularni RTCdan olingan ma'lumotlar bilan yangilab turasiz:

readDS3232time (& ikkinchi, & daqiqa, & soat, & dayOfWeek, & dayOfMonth, & oy, va yil);

Vaqt va sanani ketma -ket monitorga yuborishdan tortib, namunali eskizdagi kabi ma'lumotlarni har xil chiqish moslamalari uchun mos shaklga aylantirishgacha, siz xohlaganingizcha o'zgaruvchilardan foydalanishingiz mumkin.

Hammasi ishlayotganini tekshirish uchun ko'rgazmali eskizga tegishli vaqt va sanani kiriting, yuklang, setDS3231time () funktsiyasini sharhlab, yana yuklang. Keyin ketma -ket monitorni oching va sizga joriy vaqt va sana ko'rsatiladigan displey ko'rsatilishi kerak.

Shu vaqtdan boshlab sizda real vaqtda soat modulidan ma'lumotlarni o'rnatish va olish uchun dasturiy vositalar mavjud va siz ushbu arzon modullardan qanday foydalanishni tushunasiz degan umiddamiz.

Ishlab chiqaruvchining veb-sayti-DS1307 va DS3231 dan real vaqtda ishlaydigan aniq IClar haqida ko'proq bilib olishingiz mumkin.

Bu xabar sizga pmdway.com tomonidan olib kelingan - ishlab chiqaruvchilar va elektronika ixlosmandlari uchun hamma narsa, butun dunyo bo'ylab bepul etkazib berish.

Tavsiya: