Программа не простая, задержки есть, при расчете температуры с термистора в цикле снимаются 5 показаний с задержкой в 10 млсек. между снятием, чтоб расчитать среднее значение, вычислить логарифм, чтоб получить температуру.
Проверил я модуль, запустив скетч установки времени через настройки в ФЛПрог. Более часа поработал не отстал ни на секунду. Значит модуль в порядке.
Этот модуль подключается к I2C (пин 20 и 21), но они заняты дисплеем OLED I2C 0,96″. Можно было бы заморочиться и подключить параллельно. Но будет ли толк? Или тоже будет отставать из-за работы программы?
Столкнулся с той же проблемой в своей "звонилке" ставил 1302, отставали за 3 дня, пока я не на смене минуты на 3-4. Поменял на DS3231 за 2 месяца не отстали ни на минуту.
В моем случае отставание даже на 10-15 мин в сутки не критично. Я модуль использую как таймер обратного отсчета готовки. Например, поставил су-видницу, настроил Т на 68 грд и время готовки 4 часа. После запуска пошел обратный отсчет. Как время вышло, отключается готовка.
И для этого Ардуино Мега 2560?
Изначально я сделал на НАНО. Но выскочила проблемка. дисплей OLED I2C отгребает бльше половины памяти. В итоге компилятор пишет типа недостаточно памяти, программа может работать не корректно. Ну я урезал все свои хотелки из программы максимально, но проблема не исчезла. Но я собрал, испытал, и оказалось работает не стабильно.
https://wiki.iarduino.ru/page/OLED_trema/ бибка для txt
там просто адреса будут разные и все
А это одна из моих хотелок. Тем более у меня 2 таких дисплея
А вот это интересно. Спасибо. Нужно потестить как оно сработает
И я так думаю. Поэтому и вопрос появился. Повторюсь, как уже писал.
Думаю Вы не совсем поняли суть вопроса. Модуль часов работает безупречно, но только если без блока дисплея. Если задействую дисплей, отстает на 15 а то и 20 сек В МИНУТУ! Не за сутки, В МИНУТУ.
Код: Выделить всё
#include <SoftwareSerial.h>
#include <OLED_I2C.h> //Библиотека дисплея
#include <iarduino_RTC.h> //Библиотека часов
SoftwareSerial Serial100(15, 1);
iarduino_RTC _RTC1(RTC_DS1302, 4, 2, 3);
byte NumDisp; //Переменные строк дисплея
String Strk1E1;
String Strk2E1;
String Strk3E1;
String Strk4E1;
String Strk5E1;
OLED myOLED(SDA, SCL, 8); //подключение к пинам
extern uint8_t SmallFont[]; //Шрифты из библиотеки
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];
extern uint8_t MegaNumbers[];
extern uint8_t RusFont[];
extern uint8_t UkrFont[];
extern uint8_t TinyFont[];
String _RTC1_GetTime1_StrOut;
void setup()
{
_RTC1.begin();
_RTC1.period(1);
Serial100.begin(9600);
myOLED.begin();
myOLED.setFont(SmallFont);
myOLED.update();
}
void loop()
{
//Плата: МОДУЛЬ ЧАСОВ
_RTC1_GetTime1_StrOut = _RTC1.gettime("H:i:s");
if (1){Serial100.println(_RTC1_GetTime1_StrOut);}
//Плата:Дисплей
NumDisp = 0; // номер экрана
Strk1E1 = String("");
Strk2E1 = String(""); // вторая строка
Strk3E1 = String("");
Strk4E1 = String("");
Strk5E1 = String("");
//Первый экран.
if ( NumDisp == 1 ) { //номер экрана
myOLED.setFont(SmallFont);
myOLED.print ( Strk1E1 , CENTER, 2); // первая строка
myOLED.print ( Strk2E1 , CENTER, 14); //строка, по центру, отступ с верху
myOLED.print ( Strk3E1 , CENTER, 28); // третья строка
myOLED.print ( Strk4E1 , CENTER, 40); // четвертая
myOLED.print ( Strk5E1 , CENTER, 52); // // пятая
}
myOLED.update(); //обновление екрана
myOLED.clrScr(); // очистка экрана
}
Не совсем понятен вопрос. Глядя на код, там нет специальных указаний по обновлению экрана. Получается в каждом цикле.
Изначально было задумано не выводить секунды. Т.к. время готовки довольно большое 3 часа и более. Но при испытании в деле, я заметил, что таймер сильно отстал от реального времени. Т.е. на часах прошло 3 часа, а на таймере 2. Вот я и стал исследовать - почему. Вывел секунды и даже на глаз видно как медленно работает таймер
Переделал под эту библиотеку, таймер стал работать корректно. Отставания в часах нет. Может и будет на 1-2 сек в час, но это ваще не парит.
Выше я дал полный код проекта, где часы не просто отстают, а ОТСТАЮТ!
Я имел в виду то, что блок вывода на экран можно вынести на отдельную плату и вызывать один раз в секунду. Я давно уже практикую исполнение большинства плат по условию и тормоза были только при работе с Nextion, но это отдельная история.