DS3231: sanntidsklokke og kalender for Arduino

DS3231

I noen prosjekter er det nødvendig å ha bevis på klokkeslett, time eller dato. Enten på grunn av behovet for å utføre visse funksjoner basert på tid, å opprettholde en hendelseskalender eller registrering, å holde tiden i et system, eller bare å lage en digital klokke med Arduino. Med DS3231 du kan få det, en annen av komponenter som vi legger til på listen.

DS3231 er modulen du lette etter, og her finner du alt du trenger for kontrollen, og jeg vil også vise deg et eksempel på hvordan integrer den med Arduino med et praktisk eksempel ...

Hva er DS3231?

DS3231

Først av alt, bør du vite hva en RTC (sanntidsklokke), eller sanntidsklokke. Disse sjetongene er veldig hyppige i mange applikasjoner, faktisk har PC-en din en av dem på hovedkortet ditt, og den drives også av en CR2032 batteri også. Det er den som opprettholder tiden og konfigurasjonen i BIOS / UEFI og som operativsystemet tar det fra når den startes for å være i tide (selv om nå, med Internett, kan synkronisering med servere brukes for større presisjon, men dette er en annen historie ...).

Det RTC gjør er å oppnå tidsmålinger, så enkelt. Forskjellen fra andre typer elektroniske klokker er at de bare måle tiden, og det gjør det ved å telle klokkesignalpulser, og vite dens frekvens og perioder. I tillegg til tiden lar en RTC deg også føre regnskap over dager, uker, måneder og år. Det vil si full dato ...

For at dette skal være mulig, må RTC være ledsaget av en Xtal eller kvartskrystall som vil fungere som en resonator, den som gir frekvensen. I tillegg trenger du elektroniske kretsløp som er i stand til å telle og lagre datoen i et minne. Kretsløpet må være i stand til å telle sekunder, minutter, timer, dager, uker, måneder og år.

At minnet er ustabiltDet er derfor det trenger batteriet for å ha konstant strøm. Hvis du ikke har et batteri eller det går tomt, blir det slettet ... Det er det som skjer med PC-er når batteriet går tom, de gir feil tid. Hvis du konfigurerer den mens PC-en er på, vil tiden holdes, siden RTC-en blir slått på, men det er under prosessene den er av når batteriet er nødvendig ...

For DIY-prosjekter bruker produsenter vanligvis to vanlige RTC-brikker, som er DS1307 og DS3231. Begge er laget av Maxim (tidligere Dallas Semiconductor), og DS3231 er den mer nøyaktige av de to, da den ikke er så påvirket av temperaturvariasjoner som den tidligere gjør. Derfor svinger det ikke så mye avhengig av temperaturen, og det holder tiden mer presist.

Noen ganger, med merkbare temperaturforskjeller, kan DS1307 være ute av fase med opptil 1 eller 2 minutter per dag. Noe utålelig for noen applikasjoner.

DS3231 er ikke at den er upåvirket av variasjoner, men at den har innebygde temperaturmåling og kompensasjonssystemer for å sikre en nøyaktighet på 2 ppm, noe som tilsvarer en tidsforsinkelse 172ms om dagen, det vil si litt mer enn 1 sekund i uken på det meste. Og i praksis varierer de vanligvis bare 1 eller 2 sekunder i måneden.

Når det gjelder måten kommunisere med RTC DS3131 for å få datoverdiene den får, gjøres det av I2C buss. Og for strøm kan du bruke 2.3 til 5.5 v for DS3231, som er noe lavere enn 4.5 til 5.5 v for DS1307, slik at den kan være mer energieffektiv og få batteriet til å vare lenger.

Du bør også vite at disse modulene vanligvis har en EEPROM ekstra AT24C32 å lagre noen poster og tidligere målinger, noe som er ganske praktisk.

søknader

Når det gjelder applikasjonene, har jeg allerede nevnt noen, for eksempel å implementere en klokke med Arduino, for å lage et system som fungerer basert på Tiden Uansett, for å holde tiden på utstyr som PCer og mange andre elektroniske enheter og apparater som har tid, etc.

Kan også brukes i prosjekter å lage timere for belysning, vanningsanlegg, datalogger osv. Søknadene kan være de mange ...

Kjøp en RTC DS3231

Modulen DS3131 er billig, og du finner den i noen spesialiserte elektronikkbutikker eller i store butikker som eBay, AliExpress, Amazon, etc. Hvis du er interessert i å ha en, er det noen anbefalinger:

DS3231 Arduino-integrasjon

Skjermbilde av Arduino IDE

Hvis du vil integrer DS3231 med Arduino-kortet og begynn å lage "tidsbestemte" prosjekter, må du først lage de riktige forbindelsene. For å kunne koble den til, er det så enkelt som:

  • SLC-pinnen på DS3231-kortet må være koblet til A5 på din Arduino UNO.
  • SDA av DS3231 er koblet til A4 av Arduino.
  • Vcc fra modulen vil gå til 5V fra Arduino.
  • GND til GND.
Husk å installere biblioteket for å bruke RTC DS3231 i din Arduino IDE, ellers fungerer ikke koden ...

Nå har du koblet systemet til, neste ting er å skrive skisse kildekode for å programmere det. Du kan endre kodene og tilpasse dem til dine behov, men du kan starte med å bare få datoen fra en RTC DS3231 koblet til Arduino:

#include <Wire.h>
#include "RTClib.h"
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",  "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };
 
void setup() {
   Serial.begin(9600);
   delay(1000); 
 
   if (!rtc.begin()) {
      Serial.println(F("No se encuentra el RTC"));
      while (1);
   }
 
   // Si se ha perdido el suministro eléctrico, fijar fecha y hora
   if (rtc.lostPower()) {
      // Fijar a fecha y hora (poner la de compilación del sketch)
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      
      // Fijar a fecha y hora específica. En este ejemplo el 2021-01-01 a las 00:00:00
      // rtc.adjust(DateTime(2020, 1, 1, 0, 0, 0));
   }
}
//Imprimir completa obtenida la fecha en decimal
void printDate(DateTime date)
{
   Serial.print(date.year(), DEC);
   Serial.print('/');
   Serial.print(date.month(), DEC);
   Serial.print('/');
   Serial.print(date.day(), DEC);
   Serial.print(" (");
   Serial.print(daysOfTheWeek[date.dayOfTheWeek()]);
   Serial.print(") ");
   Serial.print(date.hour(), DEC);
   Serial.print(':');
   Serial.print(date.minute(), DEC);
   Serial.print(':');
   Serial.print(date.second(), DEC);
   Serial.println();
}
 
void loop() {
   // Obtener fecha actual y mostrar por Serial
   DateTime now = rtc.now();
   printDate(now);
 
   delay(3000);    //Espera 3 segundos
}

Og for å bruke RTC-datoen til planlegge noen oppgaver, for eksempel for å slå lys på eller av, for automatisk vanning, eller for at en alarm skal lyde, etc. Husk at for å håndtere høyspenningsenheter kan du bruke transistorer eller stafett:

#include <Wire.h>
#include "RTClib.h"
 
const int outputPin = LED_BUILTIN;
bool state = false;
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
void setup() {
   Serial.begin(9600);
   delay(1000);
 
   if (!rtc.begin()) {
      Serial.println(F("Couldn't find RTC"));
      while (1);
   }
 
   if (rtc.lostPower()) {
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   }
}
 
// Se comprueba si está programado el encendido
bool isScheduledON(DateTime date)
{
   int weekDay = date.dayOfTheWeek();
   float hours = date.hour() + date.minute() / 60.0;
 
   // Configuración de horas de 08:30 a 9:30 y de 22:00 a 23:00 (usando decimal)
   bool hourCondition = (hours > 8.50 && hours < 9.50) || (hours > 22.00 && hours < 23.00);
 
   // Configuración del día Lunes, Sábado y Domingo con números (recuerda que en inglés comienza la semana en Domingo=0, Lunes=1,...
   bool dayCondition = (weekDay == 1 || weekDay == 6 || weekDay == 0); 
   if (hourCondition && dayCondition)
   {
      return true;
   }
   return false;
}
 
void loop() {
   DateTime now = rtc.now();
 
   if (state == false && isScheduledON(now))      // Apagado
   {
      digitalWrite(outputPin, HIGH);
      state = true;
      Serial.print("Activado");
   }
   else if (state == true && !isScheduledON(now))  // Encendido
   {
      digitalWrite(outputPin, LOW);
      state = false;
      Serial.print("Desactivado");
   }
 
   delay(3000);
}


Innholdet i artikkelen følger våre prinsipper for redaksjonell etikk. Klikk på for å rapportere en feil her.

Bli den første til å kommentere

Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.