Помощь в коде
- Войдите на сайт для отправки комментариев
1 |
Господа, всем привет!
В прошлом треде Вы мне очень помогли с подключением реле, большое спасибо!
Наковырял я небольшой код, который связывает часы реального времени, двухстрочный дисплей, арудино Уно и реле с моторчиком.
Затык у меня не критический, но неприятный. Пока в скетче прописано только взаимодействие часов с дисплеем время у меня обновляется каждую секунду, то есть секунду тикают, минуты, часы и т.д.
А вот когда я в скетч добавляют код взаимодействия с реле, то на дисплее врем уже обновляется не каждую секунду, а значительно дольше. При этом расписание включения/выклюяения реле работает, но чисто визуально приятно видеть обновление кажую секунду времени на дисплее. Чувствую, что вопрос легко решается, но я потыкал и ничего не получилось. Если не сложно - проконсультируйте, пожалуйста. Скетч прилагаю.
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 | |
13 | void 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 | } // |
24 | void 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 | { |
36 | digitalWrite(relay, HIGH); |
37 | } |
38 |
39 | if (RT == TimeOff) |
40 | { |
41 | digitalWrite(relay, LOW); |
42 | delay(1); |
43 | } |
44 | } |
Так на поверхности же! 17 строка
Вот к сожалению нет. Если из кода убрать код с 33 строки до конца и оставить 17 строку, то задержки уже нет. :)
Строки 15 и 16 местами поменяй. Это безотносительно к твоему воросу, это просто формально правильнее.
Попробуй разделить без остатка 1000 на 300.
Я и не советовал убрать 17 строку.
Точно 15 и 16? Просто на 16 строке сейчас только "//".
Не делится )))
ок, понял. Поправлю
Не делиться? Ну и не надо. Виноват. Как то недосмотрел, что 17 строка до loop.
Так что ... всвязи со схождением Благодатного огня - прошу меня простить.
А еще куда-нибудь можно капнуть, чтобы найти проблемку?)
Точно 15 и 16? Просто на 16 строке сейчас только "//".
14 и 15.
А что до проблемы, то избавьтесь от сравнения на равенство в строке 27, сделайте сравнение на >= как делают все нормальные люди (см. пример "блинк без делай") . И будет Вам счастье. Она же при таком сравнении у Вас запросо может проскочить событие. Есть там затесалась операция дольше миллисекунды, вот она может и пройти мимо целой тысячи. Строки 42 и 31 очень таким пропускам помогают, но Бог с ними, если сделаете нормальное сравнение, то они не будут особо мешать.
Что за часы? Для большинства из них вообще никакой миллис не нужен и правильнее делать по-другому.
Евгений,
все заработало! Спасибо Вам большое!
Часы на чипе DS3231
Сравнивать строковые переменные когда можно получить в виде цифр, это как минимум нелогично, текст из
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 за цикл
Часы на чипе DS3231
В таком случае, Вам вовсе не нужно отслеживать секунды через миллис. Это часы умеют выдавать сигнал на ногу SQW точно при переходе секунды (минуты) Нужно просто ловить этот сигнал и, как пришёл, обновлять время на экране.
Евгений, спасибо большое за информацию!
Дело в том, что я абсолютный нуб и собирал проект из видео на ютюбчике, поэтому код менял очень не сильно.
Честно говоря, на текущий момент даже не знаю как реализовать Ваш совет, но как скиллы подтяну, то поправлю проект.