Innehållsförteckning:

Realtidsklocka med Arduino: 3 steg
Realtidsklocka med Arduino: 3 steg

Video: Realtidsklocka med Arduino: 3 steg

Video: Realtidsklocka med Arduino: 3 steg
Video: Контроллер автоматического пуска-останова с часами реального времени DS3231 2024, November
Anonim
Realtidsklocka med Arduino
Realtidsklocka med Arduino

I detta projekt kommer vi att göra en klocka med hjälp av Arduino- och RTC -modulen. Som vi vet kan Arduino inte visa den verkliga tiden så vi kommer att använda RTC -modulen för att visa rätt tid på LCD -skärmen. Läs igenom hela steget noga, det kommer att hjälpa dig mycket att göra klockan.

DS3231 Arduino -koden är som DS1307 -koden och den fungerar med båda RTC -chipsen.

Arduino -koden nedan använder inte något bibliotek för DS3231 RTC, Wire -biblioteket är för korrespondensen mellan Arduino och DS3231 som använder I2C -konventionen.

Ja! Många elektronikingenjörer är beroende av det för sina tidsbaserade projekt men RTC är inte helt pålitlig. Den är batteridriven och måste bytas ut snart eller senare. När det kommer till IoT -projekt upptar det värdefulla SPI -stift (Serial Peripheral Interface) och blir rörigt med trådar som trasslar runt. Lösning…. Här kommer vår hjälte NTP (Network time protocol). NTP är så korrekt eftersom det får tid från internet. Vi kommer att använda detta protokoll med ett klient-server-läge. processen är så enkel att vår Nodemcu fungerar som en klient och begär ett NTP -paket från servern med UDP. I gengäld skickar servern ett paket till klienten som analyserar data. NTP är det universella tidssynkroniseringsprotokollet. Låt oss nu lysa upp våra labs arbetsstation

Steg 1: Obligatoriska komponenter

  • Arduino -bräda
  • DS3231 RTC -kort
  • 16x2 LCD -skärm
  • 2 x tryckknapp
  • 10K ohm variabelt motstånd (eller potentiometer)
  • 330-ohm motstånd
  • 3V myntcellsbatteri
  • Bakbord
  • Bygelkablar

RTC -mokul DS3231

Tid är en viktig känsla som krävs i denna snabba värld av människor. I realtidsprojekt

Vi använder RTC (A. K. A realtidsklocka)

RTC Real-time-clock (RTC) är en integrerad krets (IC) som håller reda på aktuell tid. RTC tar hand om tid i realläge. RTC finns vanligtvis i datorns moderkort och inbyggda system som kräver snabb åtkomst.

Steg 2: Anslutning av Arduino Clock

Anslutning av Arduino -klocka
Anslutning av Arduino -klocka
  • Anslut SCL -stift till RTC -modulen till Arduino A5
  • Anslut SDA -stift till RTC -modulen till Arduino A4
  • Anslut VCC TO 5v och GND TO GND
  • Anslut en tryckknapp till stiftet 8
  • Anslut en annan tryckknapp till stiftet 9
  • Anslut RS på LCD till stift 2 på Arduino
  • Anslut E på LCD till stift 3 på Arduino
  • Anslut D7 på LCD till stift 7 på Arduino
  • Anslut D6 på LCD till stift 6 på Arduino
  • Anslut D5 på LCD till stift 5 på Arduino
  • Anslut D4 på LCD till stift 4 på Arduino
  • Anslut VSS & K till GND
  • Anslut VDD & A till 5v
  • Anslut vo till potentiometerns utgångsstift

Steg 3: Kod för Arduino -klocka med RTC

Kod för Arduino -klocka med RTC
Kod för Arduino -klocka med RTC

DS3231 fungerar bara med BCD -format och för att konvertera BCD till decimal och vice versa använde jag de två raderna nedan (exempel för minut): // Konvertera BCD till decimalminute = (minut >> 4) * 10 + (minut och 0x0F);

// Konvertera decimal till BCDminute = ((minut / 10) << 4) + (minut % 10); void DS3231_display (): visar tid och kalender, innan visningstid och kalenderdata konverteras från BCD till decimalformat. ogiltig blink_parameter ():

// Realtidsklocka och kalender med inställda knappar med DS3231 och Arduino // inkluderar LCD -bibliotekskod #inkludera // inkludera trådbibliotekskod (behövs för I2C -protokollsenheter) #inkludera // LCD -modulanslutningar (RS, E, D4, D5, D6, D7) LiquidCrystal lcd (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // knapp1 är ansluten till pin 8 pinMode (9, INPUT_PULLUP); // knapp2 är ansluten till stift 9 // ställ in LCD -skärmens antal kolumner och rader lcd.begin (16, 2); Wire.begin (); // Anslut i2c -buss} char Time = "TIME:::"; char Calendar = "DATE: / / 20"; byte i, andra, minut, timme, datum, månad, år; void DS3231_display () {// Konvertera BCD till decimal sekund = (andra >> 4) * 10 + (andra & 0x0F); minut = (minut >> 4) * 10 + (minut & 0x0F); timme = (timme >> 4) * 10 + (timme & 0x0F); datum = (datum >> 4) * 10 + (datum & 0x0F); månad = (månad >> 4) * 10 + (månad & 0x0F); år = (år >> 4) * 10 + (år & 0x0F); // Slutkonverteringstid [12] = andra % 10 + 48; Tid [11] = andra / 10 + 48; Tid [9] = minut % 10 + 48; Tid [8] = minut / 10 + 48; Tid [6] = timme % 10 + 48; Tid [5] = timme / 10 + 48; Kalender [14] = år % 10 + 48; Kalender [13] = år / 10 + 48; Kalender [9] = månad % 10 + 48; Kalender [8] = månad / 10 + 48; Kalender [6] = datum % 10 + 48; Kalender [5] = datum / 10 + 48; lcd.setCursor (0, 0); lcd.print (tid); // Visningstid lcd.setCursor (0, 1); lcd.print (kalender); // Visa kalender} void blink_parameter () {byte j = 0; medan (j 23) // Om timmar> 23 ==> timmar = 0 parameter = 0; if (i == 1 && parameter> 59) // Om minuter> 59 ==> minuter = 0 parameter = 0; if (i == 2 && parameter> 31) // If date> 31 ==> date = 1 parameter = 1; if (i == 3 && parameter> 12) // If månad> 12 ==> månad = 1 parameter = 1; if (i == 4 && parameter> 99) // Om år> 99 ==> år = 0 parameter = 0; sprintf (text, "%02u", parameter); lcd.setCursor (x, y); lcd.print (text); fördröjning (200); // Vänta 200ms} lcd.setCursor (x, y); lcd.print (""); // Visa två mellanslag blink_parameter (); sprintf (text, "%02u", parameter); lcd.setCursor (x, y); lcd.print (text); blink_parameter (); om (! digitalRead (8)) {// Om knappen (pin #8) trycks in i ++; // Ökning 'i' för nästa parameterreturparameter; // Returnera parametervärdet och avsluta}}} void loop () {if (! DigitalRead (8)) {// If button (pin #8) is tryckt i = 0; timme = redigera (5, 0, timme); minut = redigera (8, 0, minut); datum = redigera (5, 1, datum); månad = redigera (8, 1, månad); år = redigera (13, 1, år); // Konvertera decimal till BCD minut = ((minut / 10) << 4) + (minut % 10); timme = ((timme / 10) << 4) + (timme % 10); datum = ((datum / 10) << 4) + (datum % 10); månad = ((månad / 10) << 4) + (månad % 10); år = ((år / 10) << 4) + (år % 10); // Avsluta konvertering // Skriv data till DS3231 RTC Wire.beginTransmission (0x68); // Starta I2C -protokollet med DS3231 -adressen Wire.write (0); // Skicka registeradress Wire.write (0); // Återställ sesonger och starta oscillatorn Wire.write (minut); // Skriv minut Wire.write (timme); // Skriv timme Wire.write (1); // Skriv dag (används inte) Wire.write (datum); // Skriv datum Wire.write (månad); // Skriv månad Wire.write (år); // Skriv år Wire.endTransmission (); // Stoppa överföringen och släpp I2C -bussfördröjningen (200); // Vänta 200 ms} Wire.beginTransmission (0x68); // Starta I2C -protokollet med DS3231 -adressen Wire.write (0); // Skicka registeradress Wire.endTransmission (false); // I2C starta om Wire.requestFrom (0x68, 7); // Begär 7 byte från DS3231 och släpp I2C -bussen i slutet av läsningen sekund = Wire.read (); // Läs sekunder från register 0 minut = Wire.read (); // Läs protokoll från registret 1 timme = Wire.read (); // Läs timme från register 2 Wire.read (); // Läs dag från register 3 (används inte) datum = Wire.read (); // Läs datum från register 4 månader = Wire.read (); // Läs månad från register 5 år = Wire.read (); // Läs år från register 6 DS3231_display (); // Diaplay -tid och kalenderfördröjning (50); // Vänta 50 ms}

Rekommenderad: