DS3231: часовник и календар в реално време за вашия Arduino

DS3231

В някои проекти е необходимо да имате доказателство за часа, часа или датата. Или поради необходимостта да се изпълняват определени функции въз основа на времето, да се поддържа календар на събитията или регистрация, да се поддържа времето в системата или просто да се създаде цифров часовник с Arduino, с DS3231 можете да го получите, друг от елементи които добавяме към списъка.

DS3231 е модулът, който търсите, и тук ще намерите всичко необходимо за неговото управление и ще ви покажа пример как интегрирайте го с Arduino с практически пример ...

Какво представлява DS3231?

DS3231

На първо място, трябва да знаете какво a RTC (часовник в реално време)или часовник в реално време. Тези чипове са много чести в множество приложения, всъщност вашият компютър има един от тях на дънната ви платка и също се захранва от CR2032 батерия също. Той е този, който поддържа времето и конфигурацията в BIOS / UEFI и от който операционната система го взема при зареждане, за да бъде навреме (въпреки че сега, с Интернет, синхронизацията със сървърите може да се използва за по-голяма точност, но това е друга история ...).

Това, което RTC прави, е да получи измервания на времето, толкова просто. Разликата от другите видове електронни часовници е, че те просто измерете времетои го прави, като брои импулсите на тактовия сигнал, като знае неговата честота и периоди. В допълнение към времето, RTC също ви позволява да водите счетоводство на дни, седмици, месеци и години. Тоест пълната дата ...

За да е възможно това, RTC трябва да бъде придружен от a Xtal или кварцов кристал който ще действа като резонатор, този, който осигурява честотата. Освен това се нуждаете от електронни схеми, способни да броят и съхраняват датата в паметта. Схемата трябва да може да отчита секунди, минути, часове, дни, седмици, месеци и години.

че паметта е непостояннаЕто защо се нуждае от батерията, за да има постоянна мощност. Ако нямате батерия или тя се изтощи, тя ще бъде изтрита ... Това се случва с компютрите, когато батерията се изтощи, те дават неправилно време. Ако го конфигурирате, докато компютърът е включен, времето ще се запази, тъй като RTC се захранва, но е по време на процесите, по време на които е изключен, когато е необходима тази батерия ...

За проекти за „направи си сам“ производителите обикновено използват два често срещани RTC чипа, които са DS1307 и DS3231. И двете са направени от Maxim (бивш Dallas Semiconductor), а DS3231 е по-точният от двата, тъй като не е толкова повлиян от температурните вариации, колкото първият. Следователно, той не се колебае толкова много в зависимост от температурата и задържа времето по-точно.

Понякога, при забележими температурни разлики, DS1307 може да изостава с 1 или 2 минути на ден. Нещо непоносимо за някои приложения.

DS3231 не е, че не се влияе от вариации, а че има вградени системи за измерване на температурата и компенсация, за да осигури точност от 2 ppm, което би било еквивалентно на забавяне във времето от около 172ms на ден, т.е.малко повече от 1 секунда седмично най-много. И на практика те обикновено варират само 1 или 2 секунди на месец.

Що се отнася до начина комуникирайте с RTC DS3131 за получаване на датите, които получава, се извършва от I2C шина. А за захранване можете да използвате 2.3 до 5.5v за DS3231, което е малко по-ниско от 4.5 до 5.5v за DS1307, така че може да бъде по-енергийно ефективен и да накара батерията да издържи по-дълго.

Освен това трябва да знаете, че тези модули обикновено имат EEPROM допълнителен AT24C32 за съхраняване на някои записи и предишни измервания, което е доста практично.

приложения

По отношение на приложенията вече споменах някои, като например да се внедри часовник с Arduino, за да се създаде система, която действа въз основа на Времето Каквото и да е, за да отделите време за оборудване като персонални компютри и много други електронни устройства и уреди, които имат време и т.н.

Може да се използва и в проекти за създаване на таймери за осветление, напоителни системи, регистратор на данни и др. Приложенията могат да бъдат най-многобройни ...

Купете RTC DS3231

Модулът DS3131 е евтин, и можете да го намерите в някои специализирани магазини за електроника или в големи магазини като eBay, AliExpress, Amazon и др. Ако се интересувате от такава, ето няколко препоръки:

DS3231 Arduino интеграция

Екранна снимка на Arduino IDE

Ако искате интегрирайте вашия DS3231 с вашата дъска Arduino и да започнете да създавате „синхронизирани“ проекти, първо трябва да направите съответните връзки. За да можете да го свържете, е толкова просто, колкото:

  • SLC щифтът на платката DS3231 трябва да бъде свързан към A5 на вашия Arduino UNO.
  • SDA на DS3231 е свързан с A4 на Arduino.
  • Vcc от модула ще премине към 5V от Arduino.
  • GND до GND.
Не забравяйте да инсталирате библиотеката, за да използвате RTC DS3231 във вашата IDE на Arduino, иначе кодът няма да работи ...

Сега системата е свързана, следващото нещо е да напишете скица изходен код да го програмирате. Можете да модифицирате кодовете и да ги адаптирате към вашите нужди, но можете да започнете, като просто вземете датата от RTC DS3231, свързан с 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
}

И за да използвате датата на RTC до насрочете някаква задача, като например за включване или изключване на светлините, за автоматично поливане или за подаване на аларма и др. Не забравяйте, че за работа с устройства с по-високо напрежение можете да използвате транзистори или реле:

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


Бъдете първите, които коментират

Оставете вашия коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

*

*

  1. Отговорен за данните: Мигел Анхел Гатон
  2. Предназначение на данните: Контрол на СПАМ, управление на коментари.
  3. Легитимация: Вашето съгласие
  4. Съобщаване на данните: Данните няма да бъдат съобщени на трети страни, освен по законово задължение.
  5. Съхранение на данни: База данни, хоствана от Occentus Networks (ЕС)
  6. Права: По всяко време можете да ограничите, възстановите и изтриете информацията си.