Помощь в коде

SamFer
Offline
Зарегистрирован: 22.04.2019

Господа, всем привет!

В прошлом треде Вы мне очень помогли с подключением реле, большое спасибо!

Наковырял я небольшой код, который связывает часы реального времени, двухстрочный дисплей, арудино Уно и реле с моторчиком.

Затык у меня не критический, но неприятный. Пока в скетче прописано только взаимодействие часов с дисплеем время у меня обновляется каждую секунду, то есть секунду тикают, минуты, часы и т.д.

А вот когда я в скетч добавляют код взаимодействия с реле, то на дисплее врем уже обновляется не каждую секунду, а значительно дольше. При этом расписание включения/выклюяения реле работает, но чисто визуально приятно видеть обновление кажую секунду времени на дисплее. Чувствую, что вопрос легко решается, но я потыкал и ничего не получилось. Если не сложно - проконсультируйте, пожалуйста. Скетч прилагаю.

01#include <iarduino_RTC.h>                                   // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
02//  iarduino_RTC time(RTC_DS1302, 1, 2, 3);                 // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
03//  iarduino_RTC time(RTC_DS1307);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C
04    iarduino_RTC time(RTC_DS3231);                          // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C
05    #include <LiquidCrystal.h>                                                           //
06    #define DIODE_DROP  0.7
07    LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
08    int relay = 5;
09    String RT = "50";
10    String TimeOn = "12:15";
11    String TimeOff = "12:16";
12                                                      
13void setup(){     
14    digitalWrite(relay, LOW);
15    pinMode(relay, OUTPUT);
16                                                            //
17    delay(300);                                             // Ждем готовности модуля отвечать на запросы
18    Serial.begin(9600);                                     // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод.
19    time.begin();                                           // Инициируем работу с модулем.
20    lcd.begin(16, 2);
21    lcd.print("Current time:");
22 
23}                                                           //
24void loop()
25{                                                //
26     
27    if(millis()%1000==0)
28    {                                                      // Если прошла 1 секунда.
29      lcd.setCursor(0, 1);
30      lcd.print(time.gettime("d-m H:i:sA"));                 // Выводим время.
31      delay(1);                                             // Приостанавливаем скетч на 1 мс, чтоб не выводить время несколько раз за 1мс.
32    
33  RT = time.gettime("H:i");
34  if (RT == TimeOn)
35{
36digitalWrite(relay, HIGH);
37}
38 
39if (RT == TimeOff)
40{
41  digitalWrite(relay, LOW);
42  delay(1);
43
44}

 

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Так на поверхности же! 17 строка 

SamFer
Offline
Зарегистрирован: 22.04.2019

Вот к сожалению нет. Если из кода убрать код с 33 строки до конца и оставить 17 строку, то задержки уже нет. :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Строки 15 и 16 местами поменяй. Это безотносительно к твоему воросу, это просто формально правильнее.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Попробуй разделить без остатка 1000 на 300.

Я и не советовал убрать 17 строку. 

SamFer
Offline
Зарегистрирован: 22.04.2019

Точно 15 и 16? Просто на 16 строке сейчас только "//".

SamFer
Offline
Зарегистрирован: 22.04.2019

Не делится )))

SamFer
Offline
Зарегистрирован: 22.04.2019

ок, понял. Поправлю

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Не делиться? Ну и не надо. Виноват. Как то недосмотрел, что 17 строка до       loop.

Так что ... всвязи со схождением Благодатного огня - прошу меня простить.

SamFer
Offline
Зарегистрирован: 22.04.2019

А еще куда-нибудь можно капнуть, чтобы найти проблемку?)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SamFer пишет:

Точно 15 и 16? Просто на 16 строке сейчас только "//".

14 и 15.

А что до проблемы, то избавьтесь от сравнения на равенство в строке 27, сделайте сравнение на >= как делают все нормальные люди (см. пример "блинк без делай") .  И будет Вам счастье. Она же при таком сравнении у Вас запросо может проскочить событие. Есть там затесалась операция дольше миллисекунды, вот она может и пройти мимо целой тысячи. Строки 42 и 31 очень таким пропускам помогают, но Бог с ними, если сделаете нормальное сравнение, то они не будут особо мешать.

Что за часы? Для большинства из них вообще никакой миллис не нужен и правильнее делать по-другому.

SamFer
Offline
Зарегистрирован: 22.04.2019

Евгений,

все заработало! Спасибо Вам большое!

Часы на чипе DS3231

walt88
Offline
Зарегистрирован: 14.04.2019

Сравнивать строковые переменные когда можно получить в виде цифр, это как минимум нелогично, текст из

examples\gettime

01//  если требуется получить время в виде цифр, то можно вызвать функцию gettime() без параметра, после чего получить время из переменных
02//      пример:  time.gettime();
03//               Serial.print(time.Hours);   Serial.print(":");  // Вывод часов
04//               Serial.print(time.minutes); Serial.print(":");  // Вывод минут
05//               Serial.print(time.seconds); Serial.println(""); // Вывод секунд
06//      seconds  секунды     0-59
07//      minutes  минуты      0-59
08//      hours    часы        1-12
09//      Hours    часы        0-23
10//      midday   полдень     0-1 (0-am, 1-pm)
11//      day      день месяца 1-31
12//      weekday  день недели 0-6 (0-воскресенье, 6-суббота)
13//      month    месяц       1-12
14//      year     год         0-99

и второе, у вас в "лупе" 2 обращение к rtc за цикл

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SamFer пишет:

Часы на чипе DS3231

В таком случае, Вам вовсе не нужно отслеживать секунды через миллис. Это часы умеют выдавать сигнал на ногу SQW точно при переходе секунды (минуты)  Нужно просто ловить этот сигнал и, как пришёл, обновлять время на экране.

SamFer
Offline
Зарегистрирован: 22.04.2019

Евгений, спасибо большое за информацию! 

Дело в том, что я абсолютный нуб и собирал проект из видео на ютюбчике, поэтому код менял очень не сильно.

Честно говоря, на текущий момент даже не знаю как реализовать Ваш совет, но как скиллы подтяну, то поправлю проект.