Официальный сайт компании Arduino по адресу arduino.cc
Часы на 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 года, а если дата совсем недавно, то это уже явно не "сбрасывается".