Часы на DS1307 и дисплей 5110
- Войдите на сайт для отправки комментариев
Давно валялся дисплей 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() - это время будет заливаться при каждой перезагрузке ардуины.
После начал копать программную часть и причина оказалась до смешного простой)))
... замечаю странную закономерность. Если у человека "на работе куча микрух и кварцев" - он при любой ошибке сначала тянется к паяльнику, а думать начинает только после десятка бес толку перепаянных схем.
извините что оффтоп - но вы сами написали это в "Общий" форум. Программирование обсуждают в другом месте.
Микросхемы начал паять по той простой причине, что на запрос "RTC1307 сбрасывается счет" и тому подобные запросы в поисковиках вылазит куча инфы о том как попадались бракованые кварцы, контуженые микросхемы и т.п. - все ссылаются на аппаратную часть.
Так Вы неверно составили запрос: не "сбрасывается", а "программа принудительно переустанавливает".
И, кстати, если "сбрасывается", то куда-нибудь в районе 1 января 1900 года, а если дата совсем недавно, то это уже явно не "сбрасывается".