KRITSADA icon

DS3231 RTC Example Code

KRITSADA | PRO | 02/14/22 12:26:46 PM UTC | 0 ⭐ | 1643 👁️ | Never ⏰ | []
Arduino |

2.64 KB

|

None

|

0 👍

/

0 👎

//*
  * Скетч для чтения времени с часов DS3231
  *
  * Обратите внимание, что каждую итерацию цикла loop() мы записываем адрес регистра 0x00.
  * Если этого не делать, то мы будем каждый раз сдвигаться по карте регистров на 7 позиций,
  * и возвращаемые данные будут совсем не те, что мы ожидаем.
  **//
 
#include <Wire.h>
const byte DS3231 = 0x68;           // I2C адрес таймера DS3231
 
void setup() {
  Wire.begin(); 
  Serial.begin(9600);
}
 
void loop() {
  Wire.beginTransmission(DS3231);       // начинаем обмен с DS3231
  Wire.write(byte(0x00));               // записываем адрес регистра, с которого начинаем чтение!!!
  Wire.endTransmission();               // завершаем передачу
 
  byte t[7];                            // массив для хранения даты и времени
  int i = 0;                            // индекс текущего элемента массива
  Wire.beginTransmission(DS3231);       // начинаем обмен с DS3231
  Wire.requestFrom(DS3231, 7);          // запрашиваем 7 байтов у DS3231
  while(Wire.available()) {             // пока есть данные от DS3231
    t[i] = Wire.read();                 // читаем 1 байт и сохраняем в массив t
    i++;                                // инкрементируем индекс элемента массива
  }
  Wire.endTransmission();               // завершаем обмен
  
  printDateTime(t);                     // выводим дату и время
  delay(1000);                          // пауза 1 секунда
}
 
// разбирает считанный массив и выводит дату и время 
void printDateTime(byte *arr) {
  if (arr[4]<10) Serial.print("0");     // дополнение нулями слева для выравнивания
  Serial.print(arr[4], HEX);            // выводим дату
  Serial.print(".");
  if (arr[5]<10) Serial.print("0"); 
  Serial.print(arr[5], HEX);            // выводим месяц
  Serial.print(".20");                  // 2000-ые годы подразумеваются
  Serial.print(arr[6], HEX);            // выводим год
  Serial.print(" ");
  if (arr[2]<10) Serial.print("0"); 
  Serial.print(arr[2], HEX);            // выводим час
  Serial.print(":");
  if (arr[1]<10) Serial.print("0"); 
  Serial.print(arr[1], HEX);            // выводим минуты
  Serial.print(":");
  if (arr[0]<10) Serial.print("0"); 
  Serial.println(arr[0], HEX);          // выводим секунды  
}

Comments