DS3231: realtime klok en kalender voor uw Arduino

DS3231

Bij sommige projecten is het nodig om een ​​bewijs van de tijd, het uur of de datum te hebben. Ofwel vanwege de noodzaak om bepaalde functies uit te voeren op basis van tijd, om een ​​evenementenkalender of registratie bij te houden, om de tijd in een systeem bij te houden, of gewoon om een ​​digitale klok te creëren met Arduino. Met de DS3231 je kunt het krijgen, nog een van de componenten die we aan de lijst toevoegen.

De DS3231 is de module die u zocht, en hier vindt u alles wat u nodig heeft voor de bediening ervan en ik zal u ook een voorbeeld laten zien van hoe integreer het met Arduino met een praktisch voorbeeld ...

Wat is de DS3231?

DS3231

Allereerst moet u weten wat een RTC (realtime klok), of real-time klok. Deze chips komen zeer vaak voor in een groot aantal toepassingen, uw pc heeft er zelfs een op uw moederbord en deze wordt ook aangedreven door een CR2032-batterij ook. Het is degene die de tijd en de configuratie in het BIOS / UEFI bijhoudt en van waaruit het besturingssysteem het overneemt bij het opstarten om op tijd te zijn (hoewel nu, met internet, synchronisatie met servers kan worden gebruikt voor meer precisie, maar dit is een ander verhaal ...).

Wat de RTC doet, is tijdmetingen verkrijgen, zo simpel. Het verschil met andere soorten elektronische horloges is dat ze simpelweg meet de tijd, en het doet dit door kloksignaalpulsen te tellen, waarbij het de frequentie en de perioden ervan kent. Naast de tijd kun je met een RTC ook een overzicht bijhouden van de dagen, weken, maanden en jaren. Dat wil zeggen, de volledige datum ...

Om dit mogelijk te maken dient de RTC vergezeld te zijn van een Xtal of kwartskristal die zal fungeren als een resonator, degene die de frequentie levert. Bovendien hebt u elektronische schakelingen nodig die de datum kunnen tellen en in een geheugen kunnen opslaan. Het circuit moet seconden, minuten, uren, dagen, weken, maanden en jaren kunnen tellen.

Esa geheugen is vluchtigDaarom heeft het de batterij nodig om constant vermogen te hebben. Als je geen batterij hebt of deze is leeg, wordt deze gewist ... Dat is wat er gebeurt met pc's als de batterij leeg is, ze geven een verkeerde tijd aan. Als u het configureert terwijl de pc is ingeschakeld, wordt de tijd bewaard, aangezien de RTC wordt gevoed, maar tijdens de processen waarin het is uitgeschakeld wanneer die batterij nodig is ...

Voor doe-het-zelfprojecten gebruiken makers meestal twee gewone RTC-chips, namelijk de DS1307 en DS3231. Beide zijn gemaakt door Maxim (voorheen Dallas Semiconductor), en de DS3231 is de meest nauwkeurige van de twee, omdat hij niet zo wordt beïnvloed door temperatuurschommelingen als de eerste. Daarom fluctueert het niet zo veel afhankelijk van de temperatuur en houdt het de tijd nauwkeuriger bij.

Soms, met merkbare temperatuurverschillen, kan de DS1307 een vertraging van 1 of 2 minuten per dag hebben. Iets ondraaglijk voor sommige toepassingen.

De DS3231 is niet ongevoelig voor variaties, maar heeft ingebouwde temperatuurmeet- en compensatiesystemen om een ​​nauwkeurigheid van 2ppm te garanderen, wat overeenkomt met een tijdsvertraging van ongeveer 172 ms per dag, dat wil zeggen iets meer dan 1 seconde per week. En in de praktijk variëren ze meestal maar 1 of 2 seconden per maand.

Wat betreft de weg communiceren met de RTC DS3131 om de datumwaarden die het krijgt, te verkrijgen, wordt het gedaan door I2C-bus. En voor stroom gebruik je 2.3 tot 5.5v voor de DS3231, wat iets lager is dan de 4.5 tot 5.5v voor de DS1307, dus het kan energiezuiniger zijn en ervoor zorgen dat de batterij langer meegaat.

U moet ook weten dat deze modules meestal een EEPROM aanvullende AT24C32 om enkele records en eerdere metingen op te slaan, wat best praktisch is.

toepassingen

Wat betreft de toepassingen, heb ik er al enkele genoemd, zoals het implementeren van een klok met Arduino, om een ​​systeem te creëren dat werkt op basis van De tijd Hoe dan ook, om de tijd bij te houden op apparatuur zoals pc's en vele andere elektronische apparaten en apparaten die tijd hebben, enz.

Ook te gebruiken in projecten om timers te maken voor verlichting, irrigatiesystemen, datalogger, etc. De toepassingen kunnen de meest talrijke zijn ...

Koop een RTC DS3231

De module DS3131 is goedkoop, en je kunt het vinden in sommige gespecialiseerde elektronicawinkels of in grote winkels zoals eBay, AliExpress, Amazon, enz. Als u er een wilt hebben, volgen hier enkele aanbevelingen:

DS3231 Arduino-integratie

Screenshot van Arduino IDE

Als u wilt dat integreer uw DS3231 met uw Arduino-bord en begin met het maken van "getimede" projecten, moet u eerst de juiste verbindingen maken. Om het te kunnen verbinden, is het zo simpel als:

  • De SLC-pin van het DS3231-bord moet worden aangesloten op de A5 van uw Arduino UNO.
  • SDA van de DS3231 is aangesloten op A4 van Arduino.
  • Vcc van de module gaat van Arduino naar 5V.
  • GND naar GND.
Vergeet niet om de bibliotheek te installeren om de RTC DS3231 in uw Arduino IDE te gebruiken, anders werkt de code niet ...

Nu je het systeem hebt aangesloten, is het volgende dat je het schets broncode om het te programmeren. U kunt de codes wijzigen en aanpassen aan uw behoeften, maar u zou kunnen beginnen door simpelweg de datum op te halen van een RTC DS3231 die op Arduino is aangesloten:

#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
}

En om de RTC-datum te gebruiken plan een taak, zoals voor het in- of uitschakelen van lichten, voor automatisch sproeien of voor een alarm, enz. Onthoud dat u voor het hanteren van apparaten met een hoger voltage transistors of kunt gebruiken relais:

#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);
}


De inhoud van het artikel voldoet aan onze principes van redactionele ethiek. Klik op om een ​​fout te melden hier.

Wees de eerste om te reageren

Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.