DS3231: jam dan kalender waktu nyata untuk Arduino Anda

DS3231

Dalam beberapa proyek, diperlukan bukti waktu, jam, atau tanggal. Baik karena kebutuhan untuk menjalankan fungsi tertentu berdasarkan waktu, untuk memelihara kalender acara atau pendaftaran, untuk menyimpan waktu dalam sistem, atau hanya untuk membuat jam digital dengan Arduino. Dengan DS3231 Anda bisa mendapatkannya, salah satu dari komponen yang kami tambahkan ke daftar.

DS3231 adalah modul yang Anda cari, dan di sini Anda akan menemukan semua yang Anda butuhkan untuk mengontrolnya dan saya juga akan menunjukkan contoh bagaimana mengintegrasikannya dengan Arduino dengan contoh praktis ...

Apa itu DS3231?

DS3231

Pertama-tama, Anda harus tahu apa a RTC (Jam Waktu Nyata), atau jam waktu nyata. Chip ini sangat sering digunakan di banyak aplikasi, pada kenyataannya, PC Anda memiliki salah satunya di motherboard Anda, dan juga didukung oleh Baterai CR2032 juga. Ini adalah salah satu yang menjaga waktu dan konfigurasi di BIOS / UEFI dan dari mana sistem operasi mengambilnya saat boot agar tepat waktu (meskipun sekarang, dengan Internet, sinkronisasi dengan server dapat digunakan untuk presisi yang lebih baik, tetapi ini adalah cerita lain…).

Apa yang dilakukan RTC adalah mendapatkan pengukuran waktu, sesederhana itu. Perbedaan dari jenis jam tangan elektronik lainnya adalah bentuknya yang sederhana mengukur waktu, dan melakukannya dengan menghitung pulsa sinyal clock, mengetahui frekuensi dan periodenya. Selain waktu, RTC juga memungkinkan Anda menyimpan akun hari, minggu, bulan, dan tahun. Artinya, tanggal lengkap ...

Untuk mewujudkannya, RTC harus disertai dengan a Xtal atau kristal kuarsa yang akan bertindak sebagai resonator, yang menyediakan frekuensi. Selain itu, Anda membutuhkan sirkuit elektronik yang mampu menghitung dan menyimpan tanggal dalam memori. Sirkuit harus mampu menghitung detik, menit, jam, hari, minggu, bulan dan tahun.

bahwa memori tidak stabilItulah mengapa ia membutuhkan baterai, agar memiliki daya yang konstan. Jika Anda tidak memiliki baterai atau habis, itu akan dihapus ... Itulah yang terjadi pada PC ketika baterai habis, mereka memberikan waktu yang salah. Jika Anda mengkonfigurasinya saat PC hidup, waktu akan disimpan, karena RTC sedang dinyalakan, tetapi selama proses dimatikan saat baterai itu dibutuhkan ...

Untuk proyek DIY, pembuat biasanya menggunakan dua chip RTC yang umum, yaitu DS1307 dan DS3231. Keduanya dibuat oleh Maxim (sebelumnya Dallas Semiconductor), dan DS3231 adalah yang lebih akurat dari keduanya, karena tidak terpengaruh oleh variasi suhu seperti yang sebelumnya. Oleh karena itu, ia tidak terlalu berfluktuasi tergantung pada suhu, dan menjaga waktu dengan lebih tepat.

Kadang-kadang, dengan perbedaan suhu yang nyata, DS1307 dapat tertinggal 1 atau 2 menit per hari. Sesuatu yang tidak dapat ditoleransi untuk beberapa aplikasi.

DS3231 bukannya tidak terpengaruh oleh variasi, tetapi memiliki pengukuran suhu dan sistem kompensasi bawaan untuk memastikan keakuratan 2ppm, yang setara dengan a jeda waktu sekitar 172 milidetik per hari, yaitu paling lama lebih dari 1 detik seminggu. Dan dalam praktiknya, biasanya hanya bervariasi 1 atau 2 detik sebulan.

Adapun caranya berkomunikasi dengan RTC DS3131 untuk mendapatkan nilai tanggal yang didapatnya, itu dilakukan oleh Bus I2C. Dan untuk tenaga, Anda bisa menggunakan 2.3 sampai 5.5v untuk DS3231, yang terbilang lebih rendah dari 4.5 sampai 5.5v untuk DS1307, sehingga bisa lebih hemat energi dan membuat baterai lebih awet.

Juga, Anda harus tahu bahwa modul ini biasanya memiliki file EEPROM AT24C32 tambahan untuk menyimpan beberapa catatan dan pengukuran sebelumnya, yang cukup praktis.

aplikasi

Adapun aplikasinya, saya telah menyebutkan beberapa, seperti menerapkan jam dengan Arduino, untuk membuat sistem yang bertindak berdasarkan Waktu Apapun, untuk menjaga waktu pada peralatan seperti PC dan banyak perangkat elektronik lainnya dan peralatan yang punya waktu, dll.

Bisa juga digunakan dalam proyek membuat timer untuk penerangan, sistem irigasi, datalogger, dll. Aplikasinya bisa menjadi yang paling banyak ...

Beli RTC DS3231

Modul DS3131 itu murah, dan Anda dapat menemukannya di beberapa toko elektronik khusus atau di toko besar seperti eBay, AliExpress, Amazon, dll. Jika Anda tertarik untuk memilikinya, berikut beberapa rekomendasinya:

Integrasi Arduino DS3231

Tangkapan layar dari Arduino IDE

Jika Anda ingin mengintegrasikan DS3231 Anda dengan papan Arduino Anda dan mulai membuat proyek "berjangka waktu", Anda harus membuat koneksi yang sesuai terlebih dahulu. Untuk dapat menghubungkannya, itu sesederhana:

  • Pin SLC papan DS3231 harus dihubungkan ke A5 Anda Arduino UNO.
  • SDA dari DS3231 terhubung ke A4 dari Arduino.
  • Vcc dari modul akan beralih ke 5V dari Arduino.
  • GND ke GND.
Ingatlah untuk menginstal perpustakaan untuk menggunakan RTC DS3231 di Arduino IDE Anda atau kodenya tidak akan berfungsi ...

Sekarang Anda memiliki sistem yang terhubung, hal berikutnya adalah menulis buat sketsa kode sumber untuk memprogramnya. Anda dapat memodifikasi kode dan menyesuaikannya dengan kebutuhan Anda, tetapi Anda dapat memulai hanya dengan mendapatkan tanggal dari RTC DS3231 yang terhubung ke 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
}

Dan untuk menggunakan tanggal RTC untuk jadwalkan beberapa tugas, seperti untuk menyalakan atau mematikan lampu, untuk penyiraman otomatis, atau untuk membunyikan alarm, dll. Ingatlah bahwa untuk menangani perangkat tegangan tinggi, Anda dapat menggunakan transistor atau menyampaikan:

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


Jadilah yang pertama mengomentari

tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.