Mündəricat:

Arduino ilə Real Zaman Saatı: 3 addım
Arduino ilə Real Zaman Saatı: 3 addım

Video: Arduino ilə Real Zaman Saatı: 3 addım

Video: Arduino ilə Real Zaman Saatı: 3 addım
Video: Контроллер автоматического пуска-останова с часами реального времени DS3231 2024, Iyul
Anonim
Arduino ilə Real Zaman Saatı
Arduino ilə Real Zaman Saatı

Bu layihədə Arduino və RTC modulunun köməyi ilə bir saat düzəldəcəyik. Bildiyimiz kimi, Arduino həqiqi vaxtı göstərə bilmir, buna görə də LCD -də doğru vaxtı göstərmək üçün RTC modulundan istifadə edəcəyik. Bütün addımları diqqətlə oxuyun, saat işini qurmağınıza çox kömək edəcək.

DS3231 Arduino kodu DS1307 koduna bənzəyir və hər iki RTC çipi ilə işləyir.

Altındakı Arduino kodu, DS3231 RTC üçün heç bir kitabxanadan istifadə etmir, Wire kitabxanası I2C konvensiyasından istifadə edərək Arduino ilə DS3231 arasındakı yazışmalar üçündür.

Bəli! Bir çox elektronika mühəndisi zamana əsaslanan layihələrindən asılıdır, lakin RTC tamamilə etibarlı deyil. Batareya ilə işləyir və tez və ya gec dəyişdirilməlidir. IoT layihələrinə gəldikdə, dəyərli SPI (Serial Periferik İnterfeys) pinlərini tutur və ətrafında dolanan tellərlə qarışıq olur. Həll…. Burada qəhrəmanımız NTP (Şəbəkə vaxtı protokolu) gəlir. İnternetdən vaxt aldığı üçün NTP çox dəqiqdir. Bu protokolu müştəri-server rejimində işlədəcəyik. proses o qədər sadədir ki, Nodemcu müştəri kimi çıxış edir və UDP istifadə edərək serverdən NTP paketi tələb edir. Bunun müqabilində, server müştəriyə məlumatları təhlil edən bir paket göndərir. NTP universal vaxt sinxronizasiya protokoludur. İndi laboratoriyalarımızın iş stansiyasını işıqlandıraq

Addım 1: Tələb olunan komponentlər

  • Arduino lövhəsi
  • DS3231 RTC lövhəsi
  • 16x2 LCD ekran
  • 2 x düymə
  • 10K ohm dəyişən müqavimət (və ya potansiometr)
  • 330 ohm müqavimət
  • 3V sikkə hüceyrəli batareya
  • Çörək lövhəsi
  • Jumper telləri

RTC mokulu DS3231

Zaman, bu sürətli insan dünyasında tələb olunan vacib bir mənadır. Real vaxt layihəsində

RTC (A. K. A Real vaxt saatı) istifadə edirik

RTC Real-time-clock (RTC), cari vaxtı izləyən inteqrasiya edilmiş bir dövrədir (RTC), real rejimdə vaxta diqqət yetirir. RTC ümumiyyətlə kompüter anakartlarında və quraşdırılmış sistemlərdə olur və vaxtında giriş tələb olunur.

Addım 2: Arduino Saat Bağlantısı

Arduino Saat Bağlantısı
Arduino Saat Bağlantısı
  • SCL pinini RTC moduluna Arduino A5 -ə qoşun
  • SDA pinini RTC moduluna Arduino A4 -ə qoşun
  • VCC -ni 5v -ə və GND -ni GND -ə qoşun
  • 8 düyməsinə bir düyməni bağlayın
  • Pin 9 -a başqa bir düyməni bağlayın
  • LCD RS -ni Arduinonun 2 -ci pininə qoşun
  • LCD E -ni Arduinonun 3 -cü pininə qoşun
  • LCD D7 -ni Arduinonun 7 -ci pininə qoşun
  • LCD D6'yı Arduino'nun 6 pininə bağlayın
  • LCD D5 -i Arduinonun 5 -ci pininə qoşun
  • LCD D4 -ü Arduinonun 4 -cü pininə qoşun
  • VSS & K -ni GND -ə qoşun
  • VDD və A -ni 5v -ə qoşun
  • Vo potensiometr çıxış pininə qoşun

Addım 3: RTC ilə Arduino Saatı üçün Kod

RTC ilə Arduino Saatı üçün kod
RTC ilə Arduino Saatı üçün kod

DS3231 yalnız BCD formatı ilə işləyir və BCD -ni onluğa və əksinə çevirmək üçün aşağıdakı 2 sətri istifadə etdim (dəqiqə üçün nümunə): // BCD -ni onluq dəqiqəyə çevirin = (dəqiqə >> 4) * 10 + (dəqiqə & 0x0F);

// Onluğu BCDminute -a çevirin = ((dəqiqə / 10) << 4) + (dəqiqə % 10); void DS3231_display (): vaxtı və təqvimi göstərməzdən əvvəl vaxtı və təqvimi göstərir, BCD -dən onlu formata çevrilir. void blink_parameter ():

// DS3231 və Arduino istifadə edərək düymələri olan real vaxt saatı və təqvim // LCD kitabxana kodunu daxil edin #daxil edin // Tel kitabxana kodunu daxil edin (I2C protokol cihazları üçün lazımdır) #daxil edin/ LCD modul əlaqələri (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) pininə bağlıdır; // düymə2 pin 9 -a bağlıdır // LCD -nin sütun və satır sayını təyin edin lcd.begin (16, 2); Wire.begin (); // i2c avtobusuna qoşul} char Time = "TIME:::"; char Calendar = "DATE: / / 20"; bayt i, ikinci, dəqiqə, saat, tarix, ay, il; void DS3231_display () {// BCD -ni ondalık saniyəyə çevirin = (ikinci >> 4) * 10 + (ikinci & 0x0F); dəqiqə = (dəqiqə >> 4) * 10 + (dəqiqə & 0x0F); saat = (saat >> 4) * 10 + (saat & 0x0F); date = (date >> 4) * 10 + (date & 0x0F); ay = (ay >> 4) * 10 + (ay & 0x0F); il = (il >> 4) * 10 + (il & 0x0F); // Bitirmə müddəti [12] = ikinci % 10 + 48; Zaman [11] = saniyə / 10 + 48; Vaxt [9] = dəqiqə % 10 + 48; Zaman [8] = dəqiqə / 10 + 48; Vaxt [6] = saat % 10 + 48; Zaman [5] = saat / 10 + 48; Təqvim [14] = il % 10 + 48; Təqvim [13] = il / 10 + 48; Təqvim [9] = ay % 10 + 48; Təqvim [8] = ay / 10 + 48; Təqvim [6] = tarix % 10 + 48; Təqvim [5] = tarix / 10 + 48; lcd.setCursor (0, 0); lcd.print (Zaman); // Ekran vaxtı lcd.setCursor (0, 1); lcd.print (Təqvim); // Təqvimi göstər} void blink_parameter () {byte j = 0; while (j 23) // Saat> 23 ==> saat = 0 parametri = 0 olarsa; if (i == 1 && parametresi> 59) // If minutes> 59 ==> minutes = 0 parameter = 0; if (i == 2 && parametresi> 31) // Əgər tarix> 31 ==> tarix = 1 parametr = 1; if (i == 3 && parametresi> 12) // Ay> 12 ==> ay = 1 parametr = 1; if (i == 4 && parametresi> 99) // Əgər il> 99 ==> il = 0 parametri = 0; sprintf (mətn, "%02u", parametr); lcd.setCursor (x, y); lcd.print (mətn); gecikmə (200); // Gözləyin 200ms} lcd.setCursor (x, y); lcd.print (""); // İki boşluğu göstər blink_parameter (); sprintf (mətn, "%02u", parametr); lcd.setCursor (x, y); lcd.print (mətn); blink_parametr (); if (! digitalRead (8)) {// Əgər düyməyə (pin #8) basılırsa i ++; // Növbəti parametr qaytarma parametri üçün 'i' artır; // Parametr dəyərini qaytarın və}}} void loop () {if (! DigitalRead (8)) {// If (pin #8) düyməsinə basıldıqda i = 0; saat = redaktə (5, 0, saat); dəqiqə = redaktə (8, 0, dəqiqə); tarix = düzəliş (5, 1, tarix); ay = düzəliş (8, 1, ay); il = düzəliş (13, 1, il); // Onluğu BCD dəqiqəsinə çevirin = ((dəqiqə / 10) << 4) + (dəqiqə % 10); saat = ((saat / 10) << 4) + (saat % 10); tarix = ((tarix / 10) << 4) + (tarix % 10); ay = ((ay / 10) << 4) + (ay % 10); il = ((il / 10) << 4) + (il % 10); // Dönüşümü bitirin // DS3231 RTC Wire.beginTransmission (0x68) məlumatlarını yazın; // Wire.write (0) DS3231 ünvanı ilə I2C protokoluna başlayın; // Qeydiyyat ünvanı göndər Wire.write (0); // Sesondları sıfırlayın və Wire.write osilatorunu işə salın (dəqiqə); // Dəqiqə yaz Wire.write (saat); // Saat yaz Wire.write (1); // Yazma günü (istifadə olunmur) Wire.write (tarix); // Tarix yaz Wire.write (ay); // Ay yaz Wire.write (il); // Wire.endTransmission ilini yazın (); // Ötürməni dayandırın və I2C avtobus gecikməsini buraxın (200); // Gözləyin 200ms} Wire.beginTransmission (0x68); // Wire.write (0) DS3231 ünvanı ilə I2C protokoluna başlayın; // Qeydiyyat ünvanı göndər Wire.endTransmission (yalan); // I2C Wire.requestFrom -dan yenidən başladın (0x68, 7); // DS3231 -dən 7 bayt istəyin və oxu sonunda I2C avtobusunu buraxın = Wire.read (); // Qeyddən saniyələri oxu 0 dəqiqə = Wire.read (); // Qeyddən 1 dəqiqəni oxuyun = Wire.read (); // 2 Wire.read () qeydindən saatı oxuyun. // Qeyd 3 -dən oxunan gün (istifadə olunmur) tarix = Wire.read (); // Qeydiyyat tarixindən oxu tarixi 4 ay = Wire.read (); // Qeydiyyatdan ay oxu 5 il = Wire.read (); // Qeydiyyatdan 6 il oxuyun DS3231_display (); // Diaplay vaxtı və təqvim gecikməsi (50); // 50ms gözləyin}

Tövsiyə: