Часы на DS1307 и дисплей 5110

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

Давно валялся дисплей 5110, оставшийся от другого проекта, на днях получил плату RTC (DS1307 + EEPROM) и решил сваять из этого часы.

Скетч в основном собран из кусков примеров, немного добавлено от себя. 


#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

//Подключение выводов дисплея 5110 - 5(CLK),4(DIN),3(DC),2(CE),1(RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 rtc;

unsigned long previousMillis = 0;
const long interval = 1000;
int xin_date = 34;         //Позиция(высота) отображения даты
int xin_day = 25;          //Позиция(высота) отображения дня недели
int xin_week = 43;         //Позиция(Высота) отображения линейки дней недели
char daysOfTheWeek[7][12] = {"Sunday",  "Monday",  "Tuesday",  "Wednesday",  "Thursday",  "Friday",  "Saturday"};

void setup()   {
  rtc.begin();
  display.begin();
  display.setContrast(60);
  display.clearDisplay();
  /* Ну и самая веселая часть нашего шоу)))
   * Чтоб установить дату и время - 
   * нужно раскомментировать одну из строк. 
   * НО!!!!
   * После заливки нужно её закомментировать
   * и снова залить скетч! Часы будут немного
   * отставать, но при этом не будут сбрасываться
   * при каждой перезагрузке ардуины. 
   * Дело в том, что в строку  */
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));   // Установка даты\времени с ПК при заливке скетча
  /* прописывается время заливки скетча,
   * а так как она находится в функции void setup() - 
   * это время будет записываться при каждой перезагрузке  */
  //rtc.adjust(DateTime(2014, 1, 17, 3, 0, 0));     // Установка даты\времени вручную (год, месяц, число, часы, минуты, секунды)
}


void loop() {
  display.clearDisplay();
  DateTime now = rtc.now();
  display.setTextSize(2);   //Размер шрифта 2
  if (now.hour() <= 9)
  {
    display.print("0");
    display.print(now.hour(), DEC);
  }
  else
  {
    display.print(now.hour(), DEC);
  }

  display.drawRect(25, 4, 2, 2, BLACK);
  display.drawRect(25, 9, 2, 2, BLACK);
  display.setCursor(30, 0);

  if (now.minute() <= 9)
  {
    display.print("0");
    display.print(now.minute(), DEC);
  }
  else
  {
    display.print(now.minute(), DEC);
  }

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    display.drawRect(55, 4, 2, 2, BLACK);
    display.drawRect(55, 9, 2, 2, BLACK);
  }
  display.setCursor(60, 0);

  if (now.second() <= 9)
  {
    display.print("0");
    display.print(now.second(), DEC);
  }
  else
  {
    display.print(now.second(), DEC);
  }
  display.setTextSize(1);
  display.setCursor(12, xin_date);
  if (now.day() <= 9)
  {
    display.print("0");
    display.print(now.day(), DEC);
  }
  else
  {
    display.print(now.day(), DEC);
  }
  display.print("/");

  if (now.month() <= 9)
  {
    display.print("0");
    display.print(now.month(), DEC);
  }
  else
  {
    display.print(now.month(), DEC);
  }
  display.print("/");
  display.print(now.year(), DEC);

  display.drawRect(0, xin_week, 12, 5, BLACK);
  display.drawRect(12, xin_week, 12, 5, BLACK);
  display.drawRect(24, xin_week, 12, 5, BLACK);
  display.drawRect(36, xin_week, 12, 5, BLACK);
  display.drawRect(48, xin_week, 12, 5, BLACK);
  display.drawRect(60, xin_week, 12, 5, BLACK);
  display.drawRect(72, xin_week, 12, 5, BLACK);

//Линейка и день недели
  switch (now.dayOfTheWeek()) {
    case 0:
      display.setCursor(24, xin_day);
      display.print(daysOfTheWeek[0]);
      display.fillRect(72, xin_week, 12, 5, BLACK);
      break;
    case 1:
      display.setCursor(24, xin_day);
      display.print(daysOfTheWeek[1]);
      display.fillRect(0, xin_week, 12, 5, BLACK);
      break;
    case 2:
      display.setCursor(21, xin_day);
      display.print(daysOfTheWeek[2]);
      display.fillRect(12, xin_week, 12, 5, BLACK);
      break;
    case 3:
      display.setCursor(16, xin_day);
      display.print(daysOfTheWeek[3]);
      display.fillRect(24, xin_week, 12, 5, BLACK);
      break;
    case 4:
      display.setCursor(19, xin_day);
      display.print(daysOfTheWeek[4]);
      display.fillRect(36, xin_week, 12, 5, BLACK);
      break;
    case 5:
      display.setCursor(24, xin_day);
      display.print(daysOfTheWeek[5]);
      display.fillRect(48, xin_week, 12, 5, BLACK);
      break;
    case 6:
      display.setCursor(19, xin_day);
      display.print(daysOfTheWeek[6]);
      display.fillRect(60, xin_week, 12, 5, BLACK);
      break;
  }

  display.display();
  delay(500);
}

Столкнулся с тем что часы сбрасывались при каждой перезагрузке. Сперва кинулся копать аппаратную часть, благо микросхем RTC и кварцев к ним на работе полно, из счетчиков электроэнергии. Перепробовал несколько вариантов микросхем и кварцев, а так же несколько вариантов схем подключения, проблема оставалась. После начал копать программную часть и причина оказалась до смешного простой)))

Дело в том что в строку

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

прописывается текущее время компа, с которого происходит заливка скетча. И оно остается там навсегда))) А так как эта строка находится в setup() - это время будет заливаться при каждой перезагрузке ардуины.

b707
Offline
Зарегистрирован: 26.05.2017

CheS_66 пишет:

После начал копать программную часть и причина оказалась до смешного простой)))

... замечаю странную закономерность. Если у человека "на работе куча микрух и кварцев"  - он при любой ошибке сначала тянется к паяльнику, а думать начинает только после десятка бес толку перепаянных схем.

извините что оффтоп - но вы сами написали это в "Общий" форум. Программирование обсуждают в другом месте.

CheS_66
CheS_66 аватар
Offline
Зарегистрирован: 08.02.2017

Микросхемы начал паять по той простой причине, что на запрос "RTC1307 сбрасывается счет" и тому подобные запросы в поисковиках вылазит куча инфы о том как попадались бракованые кварцы, контуженые микросхемы и т.п. - все ссылаются на аппаратную часть. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Так Вы неверно составили запрос: не "сбрасывается", а "программа принудительно переустанавливает".

И, кстати, если "сбрасывается", то куда-нибудь в районе 1 января 1900 года, а если дата совсем недавно, то это уже явно не "сбрасывается".