Advertisement
bal_gennady

rtc_ds1307

Jan 14th, 2022 (edited)
1,190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //*
  2.   * Скетч для чтения времени с часов DS3231
  3.   *
  4.   * Обратите внимание, что каждую итерацию цикла loop() мы записываем адрес регистра 0x00.
  5.   * Если этого не делать, то мы будем каждый раз сдвигаться по карте регистров на 7 позиций,
  6.   * и возвращаемые данные будут совсем не те, что мы ожидаем.
  7.   **//
  8.  
  9. #include <Wire.h>
  10. const byte DS3231 = 0x68;           // I2C адрес таймера DS3231
  11.  
  12. void setup() {
  13.   Wire.begin();
  14.   Serial.begin(9600);
  15. }
  16.  
  17. void loop() {
  18.   Wire.beginTransmission(DS3231);       // начинаем обмен с DS3231
  19.   Wire.write(byte(0x00));               // записываем адрес регистра, с которого начинаем чтение!!!
  20.   Wire.endTransmission();               // завершаем передачу
  21.  
  22.   byte t[7];                            // массив для хранения даты и времени
  23.   int i = 0;                            // индекс текущего элемента массива
  24.   Wire.beginTransmission(DS3231);       // начинаем обмен с DS3231
  25.   Wire.requestFrom(DS3231, 7);          // запрашиваем 7 байтов у DS3231
  26.   while(Wire.available()) {             // пока есть данные от DS3231
  27.     t[i] = Wire.read();                 // читаем 1 байт и сохраняем в массив t
  28.     i++;                                // инкрементируем индекс элемента массива
  29.   }
  30.   Wire.endTransmission();               // завершаем обмен
  31.  
  32.   printDateTime(t);                     // выводим дату и время
  33.   delay(1000);                          // пауза 1 секунда
  34. }
  35.  
  36. // разбирает считанный массив и выводит дату и время
  37. void printDateTime(byte *arr) {
  38.   if (arr[4]<10) Serial.print("0");     // дополнение нулями слева для выравнивания
  39.   Serial.print(arr[4], HEX);            // выводим дату
  40.   Serial.print(".");
  41.   if (arr[5]<10) Serial.print("0");
  42.   Serial.print(arr[5], HEX);            // выводим месяц
  43.   Serial.print(".20");                  // 2000-ые годы подразумеваются
  44.   Serial.print(arr[6], HEX);            // выводим год
  45.   Serial.print(" ");
  46.   if (arr[2]<10) Serial.print("0");
  47.   Serial.print(arr[2], HEX);            // выводим час
  48.   Serial.print(":");
  49.   if (arr[1]<10) Serial.print("0");
  50.   Serial.print(arr[1], HEX);            // выводим минуты
  51.   Serial.print(":");
  52.   if (arr[0]<10) Serial.print("0");
  53.   Serial.println(arr[0], HEX);          // выводим секунды  
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement