DS3231: jam dan kalendar masa nyata untuk Arduino anda

DS3231

Dalam beberapa projek, perlu ada bukti masa, jam atau tarikh. Sama ada kerana keperluan untuk melakukan fungsi tertentu berdasarkan waktu, untuk mengekalkan kalender acara atau pendaftaran, untuk menyimpan waktu dalam sistem, atau hanya untuk membuat jam digital dengan Arduino. Dengan DS3231 anda boleh mendapatkannya, yang lain komponen yang kita tambahkan ke dalam senarai.

DS3231 adalah modul yang anda cari, dan di sini anda akan menemui semua yang anda perlukan untuk kawalannya dan saya juga akan menunjukkan contoh bagaimana mengintegrasikannya dengan Arduino dengan contoh praktikal ...

Apa itu DS3231?

DS3231

Pertama sekali, anda harus tahu apa itu a RTC (Jam Masa Nyata), atau jam masa nyata. Cip ini sangat kerap berlaku dalam banyak aplikasi, sebenarnya PC anda mempunyai salah satu daripadanya di papan induk anda, dan juga dikuasakan oleh Bateri CR2032 juga. Ia adalah yang menjaga masa dan konfigurasi dalam BIOS / UEFI dan dari mana sistem operasi mengambilnya semasa boot tepat pada waktunya (walaupun sekarang, dengan Internet, penyegerakan dengan pelayan dapat digunakan untuk ketepatan yang lebih besar, tetapi ini adalah kisah lain…).

Apa yang dilakukan RTC adalah mendapatkan pengukuran masa, sesederhana itu. Perbezaan dari jenis jam tangan elektronik lain adalah bahawa ia hanya mengukur masa, dan melakukannya dengan menghitung denyutan isyarat jam, mengetahui frekuensi dan noktahnya. Sebagai tambahan kepada masa, RTC juga membolehkan anda membuat perakaunan hari, minggu, bulan dan tahun. Iaitu, tarikh penuh ...

Agar ini dapat dicapai, RTC mesti disertakan dengan a Kristal Xtal atau kuarza yang akan bertindak sebagai resonator, yang memberikan frekuensi. Selain itu, anda memerlukan litar elektronik yang mampu mengira dan menyimpan tarikh dalam memori. Litar mesti dapat mengira detik, minit, jam, hari, minggu, bulan dan tahun.

Esa ingatan tidak stabilItulah sebabnya ia memerlukan bateri, untuk mempunyai daya berterusan. Sekiranya anda tidak mempunyai bateri atau habis, ia akan terpadam ... Itulah yang berlaku pada PC apabila bateri habis, mereka memberi masa yang tidak betul. Sekiranya anda mengkonfigurasinya semasa PC dihidupkan, waktunya akan disimpan, kerana RTC sedang dihidupkan, tetapi semasa proses di mana ia mati ketika bateri diperlukan ...

Untuk projek DIY, pembuat biasanya menggunakan dua cip RTC biasa, yang merupakan DS1307 dan DS3231. Kedua-duanya dibuat oleh Maxim (sebelumnya Dallas Semiconductor), dan DS3231 adalah yang lebih tepat dari keduanya, kerana tidak dipengaruhi oleh perubahan suhu seperti yang sebelumnya. Oleh itu, ia tidak berubah-ubah begitu banyak bergantung pada suhu, dan menyimpan masa dengan lebih tepat.

Kadang-kadang, dengan perbezaan suhu yang ketara, DS1307 mungkin ketinggalan 1 atau 2 min sehari. Sesuatu yang tidak dapat ditoleransi untuk beberapa aplikasi.

DS3231 tidak terpengaruh oleh variasi, tetapi ia mempunyai sistem pengukuran suhu dan pampasan bawaan untuk memastikan ketepatan 2ppm, yang setara dengan kelewatan masa kira-kira 172ms sehari, iaitu lebih daripada 1 saat seminggu paling banyak. Dan dalam praktiknya, mereka biasanya hanya berbeza 1 atau 2 saat dalam sebulan.

Adapun caranya berkomunikasi dengan RTC DS3131 untuk mendapatkan nilai tarikh yang diperoleh, ia dilakukan oleh Bas I2C. Untuk kuasa, anda boleh menggunakan 2.3 hingga 5.5v untuk DS3231, yang agak lebih rendah daripada 4.5 hingga 5.5v untuk DS1307, jadi ia lebih menjimatkan tenaga dan menjadikan bateri tahan lebih lama.

Anda juga harus tahu bahawa modul ini biasanya mempunyai EEPROM tambahan AT24C32 untuk menyimpan beberapa rekod dan ukuran sebelumnya, yang cukup praktikal.

aplikasi

Untuk aplikasi, saya telah menyebutkan beberapa, seperti menerapkan jam dengan Arduino, untuk membuat sistem yang bertindak berdasarkan Masa Apa pun, untuk menjaga masa pada peralatan seperti PC dan banyak alat elektronik dan peralatan lain yang mempunyai masa, dll.

Boleh juga digunakan di projek-projek untuk membuat pemasa untuk pencahayaan, sistem pengairan, datalogger, dll. Aplikasi boleh menjadi yang paling banyak ...

Beli RTC DS3231

Modul ini DS3131 murah, dan anda boleh menemuinya di beberapa kedai elektronik khusus atau di kedai besar seperti eBay, AliExpress, Amazon, dll. Sekiranya anda berminat untuk memilikinya, berikut adalah beberapa cadangan:

Integrasi DS3231 Arduino

Tangkapan skrin Arduino IDE

Jika anda mahu satukan DS3231 anda dengan papan Arduino anda dan mula membuat projek "masa", anda mesti membuat sambungan yang sesuai terlebih dahulu. Untuk dapat menghubungkannya, semudah:

  • Pin SLC papan DS3231 mesti disambungkan ke A5 anda Arduino UNO.
  • SDA DS3231 disambungkan ke A4 dari Arduino.
  • Vcc dari modul akan pergi ke 5V dari Arduino.
  • GND hingga GND.
Ingatlah untuk memasang perpustakaan untuk menggunakan RTC DS3231 di Arduino IDE anda atau kod tidak akan berfungsi ...

Sekarang anda mempunyai sistem yang tersambung, perkara seterusnya adalah menulis kod sumber lakaran untuk memprogramkannya. Anda boleh mengubah kod dan menyesuaikannya dengan keperluan anda, tetapi anda boleh bermula dengan mendapatkan tarikh dari RTC DS3231 yang disambungkan 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 tarikh RTC hingga menjadualkan beberapa tugas, seperti untuk menyalakan atau mematikan lampu, untuk penyiraman automatik, atau agar penggera berbunyi, dll. Ingatlah bahawa untuk mengendalikan peranti voltan tinggi, anda boleh menggunakan transistor atau geganti:

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


Menjadi yang pertama untuk komen

Tinggalkan komen anda

Alamat email anda tidak akan disiarkan. Ruangan yang diperlukan ditanda dengan *

*

*

  1. Bertanggungjawab atas data: Miguel Ángel Gatón
  2. Tujuan data: Mengendalikan SPAM, pengurusan komen.
  3. Perundangan: Persetujuan anda
  4. Komunikasi data: Data tidak akan disampaikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Pangkalan data yang dihoskan oleh Occentus Networks (EU)
  6. Hak: Pada bila-bila masa anda boleh menghadkan, memulihkan dan menghapus maklumat anda.