Spisu treści:

Zegar czasu rzeczywistego z Arduino: 3 kroki
Zegar czasu rzeczywistego z Arduino: 3 kroki

Wideo: Zegar czasu rzeczywistego z Arduino: 3 kroki

Wideo: Zegar czasu rzeczywistego z Arduino: 3 kroki
Wideo: FLProg8:установка часов реального времени с помощью ЖК-меню| Визуальное программирование для Arduino 2024, Lipiec
Anonim
Zegar czasu rzeczywistego z Arduino
Zegar czasu rzeczywistego z Arduino

W tym projekcie wykonamy zegar za pomocą modułu Arduino i RTC. Jak wiemy Arduino nie może wyświetlać aktualnego czasu, dlatego użyjemy modułu RTC, aby wyświetlić właściwy czas na wyświetlaczu LCD. Przeczytaj uważnie wszystkie kroki, co bardzo pomoże ci w zegarku.

Kod Arduino DS3231 jest podobny do kodu DS1307 i działa z obydwoma układami RTC.

Poniższy kod Arduino nie wykorzystuje żadnej biblioteki dla DS3231 RTC, biblioteka Wire służy do korespondencji między Arduino i DS3231 przy użyciu konwencji I2C.

Tak! Wielu inżynierów elektroników polega na nim w swoich projektach opartych na czasie, ale RTC nie jest całkowicie niezawodny. Jest zasilany bateryjnie i musi zostać wymieniony prędzej czy później. W projektach IoT zajmuje cenne piny SPI (Serial Peripheral Interface) i robi bałagan z plątaniną przewodów. Rozwiązanie…. Oto nasz bohater NTP (protokół czasu sieciowego). NTP jest tak dokładny, ponieważ pobiera czas z Internetu. Będziemy obsługiwać ten protokół w trybie klient-serwer. proces jest tak prosty, że nasz Nodemcu działa jako klient i żąda pakietu NTP z serwera za pomocą UDP. W zamian serwer wysyła pakiet do klienta, który analizuje dane. NTP to uniwersalny protokół synchronizacji czasu. Teraz rozświetlmy nasze stanowisko pracy w laboratorium

Krok 1: Wymagane składniki

  • Płytka Arduino
  • DS3231 Płytka RTC
  • Ekran LCD 16x2
  • 2 x przycisk
  • Rezystor zmienny 10K ohm (lub potencjometr)
  • Rezystor 330 omów
  • Bateria pastylkowa 3 V
  • Deska do krojenia chleba
  • Przewody połączeniowe

Moduł RTC DS3231

Czas jest podstawowym zmysłem wymaganym w tym szybkim świecie istot ludzkich. Projekt w czasie rzeczywistym

Używamy RTC (zegar czasu rzeczywistego A. K. A)

RTC Zegar czasu rzeczywistego (RTC) to układ scalony (IC), który śledzi aktualny czas. RTC dba o czas w trybie rzeczywistym. RTC zwykle znajduje się na płytach głównych komputerów i systemach wbudowanych, aby wymagać szybkiego dostępu.

Krok 2: Podłączenie zegara Arduino

Połączenie zegara Arduino
Połączenie zegara Arduino
  • Podłącz pin SCL do modułu RTC do Arduino A5
  • Podłącz pin SDA do modułu RTC do Arduino A4
  • Podłącz VCC do 5 v i GND do GND
  • Podłącz przycisk do bolca 8
  • Podłącz kolejny przycisk do kołka 9
  • Podłącz RS wyświetlacza LCD do pinu 2 Arduino
  • Podłącz E wyświetlacza LCD do pinu 3 Arduino
  • Podłącz D7 wyświetlacza LCD do pinu 7 Arduino
  • Podłącz D6 wyświetlacza LCD do pinu 6 Arduino
  • Podłącz D5 wyświetlacza LCD do pinu 5 Arduino
  • Podłącz D4 wyświetlacza LCD do pinu 4 Arduino
  • Podłącz VSS i K do GND
  • Podłącz VDD i A do 5v
  • Podłącz vo do pinu wyjściowego potencjometru

Krok 3: Kod dla zegara Arduino z RTC

Kod zegara Arduino z RTC
Kod zegara Arduino z RTC

DS3231 działa tylko z formatem BCD i do konwersji BCD na dziesiętny i odwrotnie użyłem 2 linii poniżej (przykład dla minuty):// Konwertuj BCD na decimalminute = (minuta >> 4) * 10 + (minuta i 0x0F);

// Konwersja dziesiętna na BCDminuta = ((minuta / 10) << 4) + (minuta % 10); void DS3231_display(): wyświetla czas i kalendarz, przed wyświetleniem czasu i danych kalendarza są konwertowane z formatu BCD do formatu dziesiętnego.void blink_parameter():

// Zegar czasu rzeczywistego i kalendarz z przyciskami ustawiania za pomocą DS3231 i Arduino // zawiera kod biblioteki LCD #include // zawiera kod biblioteki przewodów (wymagany dla urządzeń z protokołem I2C) #include // Połączenia modułu LCD (RS, E, D4, D5, D6, D7) LiquidCrystal lcd(2, 3, 4, 5, 6, 7); void setup() { pinMode(8, INPUT_PULLUP); //przycisk1 jest podłączony do pinu 8 pinMode(9, INPUT_PULLUP); //przycisk 2 jest podłączony do pinu 9 // ustawia liczbę kolumn i wierszy LCD lcd.begin(16, 2); Wire.początek(); // Dołącz do magistrali i2c } char Czas = "CZAS::: "; char Kalendarz = "DATA: / /20"; bajt i, sekunda, minuta, godzina, data, miesiąc, rok; void DS3231_display(){ // Konwertuj BCD na sekundy dziesiętne = (sekunda >> 4) * 10 + (sekunda i 0x0F); minuta = (minuta >> 4) * 10 + (minuta i 0x0F); godzina = (godzina >> 4) * 10 + (godzina i 0x0F); data = (data >> 4) * 10 + (data i 0x0F); miesiąc = (miesiąc >> 4) * 10 + (miesiąc i 0x0F); rok = (rok >> 4) * 10 + (rok i 0x0F); // Czas zakończenia konwersji[12] = sekunda % 10 + 48; Czas[11] = sekunda / 10 + 48; Czas[9] = minuta % 10 + 48; Czas[8] = minuta / 10 + 48; Czas[6] = godzina % 10 + 48; Czas[5] = godzina / 10 + 48; Kalendarz[14] = rok % 10 + 48; Kalendarz[13] = rok / 10 + 48; Kalendarz[9] = miesiąc % 10 + 48; Kalendarz[8] = miesiąc / 10 + 48; Kalendarz[6] = data % 10 + 48; Kalendarz[5] = data / 10 + 48; lcd.setCursor(0, 0); lcd.print(czas); // Wyświetl czas lcd.setCursor(0, 1); lcd.print(Kalendarz); // Wyświetl kalendarz } void blink_parameter(){ byte j = 0; while(j 23) // Jeżeli godziny > 23 ==> godziny = 0 parametr = 0; if(i == 1 && parametr > 59) // If minuty > 59 ==> minuty = 0 parametr = 0; if(i == 2 && parametr > 31) // If data > 31 ==> data = 1 parametr = 1; if(i == 3 && parametr > 12) // If miesiąc > 12 ==> miesiąc = 1 parametr = 1; if(i == 4 && parametr > 99) // If rok > 99 ==> rok = 0 parametr = 0; sprintf(tekst, "%02u", parametr); lcd.setCursor(x, y); lcd.print(tekst); opóźnienie(200); // Czekaj 200 ms } lcd.setCursor(x, y); lcd.print(" "); // Wyświetl dwie spacje blink_parameter(); sprintf(tekst, "%02u", parametr); lcd.setCursor(x, y); lcd.print(tekst); parametr_mignięcia(); if(!digitalRead(8)){ // Jeśli przycisk (pin #8) jest wciśnięty i++; // Zwiększenie 'i' dla następnego parametru return parametr; // Zwróć wartość parametru i wyjdź } } } void loop() { if(!digitalRead(8)){ // Jeżeli przycisk (pin #8) został naciśnięty i = 0; godzina = edycja(5, 0, godzina); minuta = edytuj(8, 0, minuta); data = edycja(5, 1, data); miesiąc = edytuj(8, 1, miesiąc); rok = edycja(13, 1, rok); // Konwersja dziesiętna na BCD minuta = ((minuta / 10) << 4) + (minuta % 10); godzina = ((godzina / 10) << 4) + (godzina % 10); data = ((data / 10) << 4) + (data % 10); miesiąc = ((miesiąc / 10) << 4) + (miesiąc % 10); rok = ((rok / 10) << 4) + (rok % 10); // Zakończ konwersję // Zapis danych do DS3231 RTC Wire.beginTransmission(0x68); // Uruchom protokół I2C z adresem DS3231 Wire.write(0); // Wyślij adres rejestru Wire.write(0); // Zresetuj sesondy i uruchom oscylator Wire.write(minute); // Napisz minutę Wire.write(hour); // Zapisz godzinę Wire.write(1); // Dzień zapisu (nie używany) Wire.write(data); // data zapisu Wire.write(miesiąc); // Zapisz miesiąc Wire.write(year); // Zapisz rok Wire.endTransmission(); // Zatrzymaj transmisję i zwolnij opóźnienie magistrali I2C(200); // Czekaj 200ms } Wire.beginTransmission(0x68); // Uruchom protokół I2C z adresem DS3231 Wire.write(0); // Wyślij adres rejestru Wire.endTransmission(false); // Ponowne uruchomienie I2C Wire.requestFrom(0x68, 7); // Zażądaj 7 bajtów od DS3231 i zwolnij magistralę I2C pod koniec odczytu sekund = Wire.read(); // Odczytaj sekundy z rejestru 0 minuta = Wire.read(); // Odczytaj minuty z rejestru 1 godzina = Wire.read(); // Odczytaj godzinę z rejestru 2 Wire.read(); // Odczytaj dzień z rejestru 3 (nieużywany) date = Wire.read(); // Odczytaj datę z rejestru 4 miesiąc = Wire.read(); // Odczytaj miesiąc z rejestru 5 rok = Wire.read(); // Odczytaj rok z rejestru 6 DS3231_display(); // Czas wyświetlania i opóźnienie kalendarza(50); // Czekaj 50ms }

Zalecana: