DS3231: jam nyata sareng almenak pikeun Arduino anjeun

DS3231

Dina sababaraha proyék perlu aya buktina waktos, jam, atanapi tanggal na. Boh kusabab perluna ngalakukeun fungsi-fungsi anu tangtu dumasar kana waktos, pikeun ngajaga kalénder acara atanapi pendaptaran, ngajaga waktos dina sistem, atanapi ngan saukur pikeun nyiptakeun jam digital sareng Arduino. Kalayan DS3231 éta anjeun tiasa kéngingkeunana, anu sanésna tina komponén yén urang tambahkeun kana daptar.

DS3231 mangrupikeun modul anu anjeun milari, sareng didieu anjeun bakal mendakan sadayana anu anjeun peryogikeun kanggo kontrolna sareng kuring ogé bakal nunjukkeun conto kumaha ngahijikeun sareng Arduino sareng conto anu praktis ...

Naon DS3231?

DS3231

Mimiti, anjeun kedah terang naon a RTC (Jam Waktos Asli), atanapi jam nyata. Chip ieu sering pisan di seueur aplikasi, kanyataanna, PC anjeun ngagaduhan salah sahiji dina motherboard anjeun, sareng éta ogé dijalankeun ku Batré CR2032 oge. Éta mangrupikeun anu ngajaga waktos sareng konfigurasi dina BIOS / UEFI sareng dimana sistem operasi nyandakna nalika boot janten tepat waktos (sanaos ayeuna, ku Internét, sinkronisasi sareng sérver tiasa dianggo pikeun langkung pas, tapi ieu nyaéta carita anu sanés…).

Anu dilakukeun ku RTC nyaéta kéngingkeun pangukuran waktos, saderhana éta. Béda tina jinis jam tangan éléktronik anu sanésna nyaéta saderhana ngukur waktuna, sareng éta dilakukeun ku ngitung pulsa sinyal jam, terang frekuensi sareng période na. Salaku tambahan kana waktos, RTC ogé ngamungkinkeun anjeun nyimpen akuntansi ngeunaan sababaraha dinten, minggu, bulan sareng taun. Nyaéta, tanggal lengkep ...

Pikeun ieu tiasa dilakukeun, RTC kedah dibarengan ku a Xtal atanapi kristal kuarsa anu bakal meta salaku résonator, salah sahiji anu nyayogikeun frékuénsi. Salaku tambahan, anjeun peryogi sirkuit éléktronik anu sanggup ngitung sareng nyimpen tanggal dina mémori. Sirkuit kedah tiasa ngitung detik, menit, jam, dinten, minggu, bulan sareng taun.

Esa mémori volatilÉta sababna naha peryogi batréna, kanggo gaduh kakuatan anu konstan. Upami anjeun teu gaduh batré atanapi éta béak, éta bakal dihapus ... Éta anu kajadian ka PC nalika batréna béak, éta bakal masihan waktos anu teu leres. Upami anjeun ngonpigurasikeunana samentawis PC hurung, waktos na bakal dijaga, kumargi RTC didukung, nanging éta salami prosés nalika pareum nalika aki-aki diperyogikeun

Pikeun proyek DIY, anu ngadamel biasana nganggo dua chip RTC umum, nyaéta DS1307 sareng DS3231. Duanana dilakukeun ku Maxim (baheulana Dallas Semiconductor), sareng DS3231 langkung akurat ti dua, sabab henteu kapangaruhan ku variasi suhu sapertos anu tiheula. Ku alatan éta, éta henteu turun naek pisan gumantung kana suhuna, sareng éta ngajaga waktos langkung pas.

Kadang-kadang, kalayan bédana suhu anu jelas, DS1307 tiasa katinggaleun 1 atanapi 2 mnt per dinten. Hal anu teu kaampeuh pikeun sababaraha aplikasi.

DS3231 sanés henteu kapangaruhan ku variasi, tapi éta sistem pengukuran suhu sareng kompensasi internal pikeun mastikeun akurasi 2ppm, anu sami sareng waktos tunduh sakitar 172ms sapoé, nyaéta, sakedik langkung ti 1 detik saminggu paling seueur. Sareng dina prakna, aranjeunna biasana ngan ukur 1 atanapi 2 detik sasasih.

Sedengkeun pikeun jalan komunikasi sareng RTC DS3131 pikeun kéngingkeun nilai tanggal anu dikéngingkeun, éta dilakukeun ku Beus I2C. Sareng pikeun kakuatan, anjeun tiasa nganggo 2.3 dugi ka 5.5v kanggo DS3231, anu rada langkung handap tina 4.5 dugi ka 5.5v pikeun DS1307, janten tiasa langkung épisién énergi sareng batréna tahan langkung lami.

Ogé, anjeun kedah terang yén modul ieu biasana ngagaduhan a EEPROM tambahan AT24C32 pikeun nyimpen sababaraha rékaman sareng pangukuran sateuacanna, anu lumayan praktis.

aplikasi

Sedengkeun pikeun aplikasina, kuring parantos nyebatkeun sababaraha, sapertos nerapkeun jam sareng Arduino, pikeun nyiptakeun sistem anu meta dumasar kana Waktos Naon waé, pikeun ngajaga waktos dina alat sapertos PC sareng seueur alat éléktronik sareng alat-alat sanés anu ngagaduhan waktos, sareng anu sanésna.

Ogé tiasa dianggo dina proyék pikeun nyiptakeun timer pikeun pencahayaan, sistem irigasi, datalogger, jst. Aplikasi na tiasa paling seueur ...

Mésér RTC DS3231

Éta modul DS3131 mirah, sareng anjeun tiasa mendakannana di sababaraha toko éléktronik khusus atanapi toko ageung sapertos eBay, AliExpress, Amazon, jsb. Upami anjeun resep ngagaduhan hiji, ieu sababaraha saran:

DS3231 Arduino Integrasi

Potret layar tina Arduino IDE

Upami anjeun hoyong ngahijikeun DS3231 anjeun sareng dewan Arduino anjeun sareng mimitian nyiptakeun "waktuna" proyek, anjeun mimitina kedah ngadamel sambungan anu cocog. Pikeun tiasa nyambungkeunana, éta saderhana:

  • Pin SLC tina papan DS3231 kedah disambungkeun kana A5 anjeun Arduino UNO.
  • SDA tina DS3231 nyambung ka A4 of Arduino.
  • Vcc tina modul bakal angkat ka 5V ti Arduino.
  • GND ka GND.
Émut masang perpustakaan pikeun nganggo RTC DS3231 dina Arduino IDE anjeun atanapi kode na moal jalan ...

Ayeuna anjeun gaduh sistem anu nyambung, hal anu salajengna nyaéta nyeratna kode sumber sketsa pikeun program éta. Anjeun tiasa ngarobih kode sareng adaptasi kana kabutuhan anjeun, tapi anjeun tiasa ngamimitian ku ngan saukur kéngingkeun tanggalna tina RTC DS3231 nyambung ka 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
}

Sareng dina urutan nganggo tanggal RTC ka ngajadwalkeun sababaraha tugas, sapertos pikeun ngahurungkeun atanapi mareuman lampu, pikeun nyiram otomatis, atanapi pikeun alarm disada, jsb. Émut yén pikeun nanganan alat voltase anu langkung luhur anjeun tiasa nganggo transistor atanapi relay:

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


Eusi tulisan taat kana prinsip urang tina étika éditorial. Pikeun ngalaporkeun kasalahan klik di dieu.

Janten kahiji komen

Ninggalkeun koméntar anjeun

email alamat anjeun moal diterbitkeun. Widang diperlukeun téh ditandaan ku *

*

*

  1. Jawab data: Miguel Ángel Gatón
  2. Tujuan tina data: Kontrol SPAM, manajemén koméntar.
  3. Legitimasi: idin anjeun
  4. Komunikasi data: Data moal dikomunikasikan ka pihak katilu kacuali ku kawajiban hukum.
  5. Panyimpenan data: Basis data anu diayakeun ku Occentus Networks (EU)
  6. Hak: Iraha waé anjeun tiasa ngawatesan, cageur sareng mupus inpormasi anjeun.