Циклический счетчик на RTC
- Войдите на сайт для отправки комментариев
Здравствуйте.
Помогите решить проблему скорее всего относящуюся к математическим вычислениям на ардуино.
Что имеем: RTC + Arduino
Что требуется: выполнение кода каждые 10 секунд.
Как реализовано: получаем данные времени с RTC и каждые 10 (секунд или минут) выполняем требуемую операцию
// подключаем RTC3231 #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS3231); // подключаем RTC модуль на базе чипа DS3231, используется аппаратная шина I2C // Задаем интервал записи данных на карту SD (см в коде) byte interval = 10; // интервал записи данных на карту SD byte currentTime = 0; int previousTime = 0; byte hourGlobalClock = 0; // часы byte minuteGlobalClock = 0; // минуты byte secondGlobalClock = 0; // секунды void setup() { // put your setup code here, to run once: time.begin(); // функция инициирует модуль: проверяет регистры модуля, запускает генератор модуля и т.д. } void loop() { time.gettime(); // см документацию к библиотеке модуля #include <iarduino_RTC.h> hourGlobalClock = time.Hours; // часы minuteGlobalClock = time.minutes; // минуты secondGlobalClock = time.seconds; // секунды // задаем интервал записи на карту каждые 10 секунд currentTime = secondGlobalClock; // выбираем, что считаем (секунды) if (currentTime == 0) { // previousTime = (60 - previousTime) * -1; } if ((currentTime - previousTime) >= interval) { previousTime = currentTime; // здесь выполняем запись на SD } }
Проблема в следующем: в момент перехода времени 59 -> 00 происходит многократная запись данных на SD
Данной строкой пытаюсь решить проблему, когда после перехода времени 59 -> 00 последнее значение previousTime > currentTime и вычисление (currentTime - previousTime) >= interval загоняет программу в ступор.
if (currentTime == 0) { // previousTime = (60 - previousTime) * -1; }
для этого перевожу его в отрицательное число, чтобы потом подставить сюда
if ((currentTime - previousTime) >= interval) { previousTime = currentTime; // здесь выполняем запись на SD }
Но в момент достижения переменной currentTime значения 0, отрицательное число previousTime принимает значение 0, вместо того, чтобы быть заданным согласно
previousTime = (60 - previousTime) * -1;
rcew,ну здесь могу сказать одно. Попробуйте входить в дом через дверь, а не лезть через форточку. Конечно некоторым это удается, но очень не удобно.
а на самом деле в этом коде не нужен RTC вовсе
Завести флажок needToSave, контролировать интервалами с помощью счетчика, например по N сек. Через N/2 сек поднять флажок, через N сек. счётчик сбросить на 0 и считать с начала. Записать данные, если флажок поднят и счётчик секунд < N/2. Флажок сбросить после записи. Повторять процесс до износа контроллера.
Вы можете словами, по-русски объяснить что именно делается в строках №№ 27-32? Подробно, но именно словами, а не "переменными".
Это же и есть они, математические вычисления, с которыми проблема.
qwone,
оно понятно , что так удобнее, только где дверь - понятия не имею.
Я могу это сделать на millis(), но захотелось на RTC
Главный вопрос в том, почему объявленное значение previousTime в 29 строке в 31 строке становится равным 0
qwone,
оно понятно , что так удобнее, только где дверь - понятия не имею.
Я могу это сделать на millis(), но захотелось на RTC
Главный вопрос в том, почему объявленное значение previousTime в 29 строке в 31 строке становится равным 0
27 строка
получаю текущее значение времени из RTC
31 - 32 строки
считаю разницу во времени между текущим и временем последней записи и сравниваю с заданным интервалом, при выполнении условия, пишу данные на карту
28-29 строки
устраняю косяк, возникающий в 31 - 32 , когда при вычислении (currentTime - previousTime) >= interval
currentTime < previousTime, а это возникает в момент перехода значения currentTime 59 -> 0. Тк значение это минут(секунд) и идет по кругу. И в какой-то момент времени становится вот так (currentTime - previousTime) >= interval = (2 - 56) >= 10
Для этого в момент, когда currentTime == 0 в строке 29 получаю разницу 60-previousTime, которую нужно сложить с тем, что насчитается с момента, когда currentTime счановится 0 и идет далее.
С тем, чтобы в какой-то момент получить значениее (2 - (-8)) >= 10
Так вот через монитор порта видно, что previousTime принимает отрицательное значение пока currentTime не стал равен 0, те 59 и менее. В момент, когда currentTime = 0, значение previousTime сбрасывается на 0
Пс я гуманитарий и ковыряю ардуино для интереса
Что имеем: RTC + Arduino
Что требуется: выполнение кода каждые 10 секунд.
Задам простой вопрос: нахрена козе RTC? Если по условиям задачи вполне достаточно обыкновенного millis?
И не надо лохматить бабушку ;)
Помогите решить проблему
Что имеем: RTC + Arduino
Что требуется: выполнение кода каждые 10 секунд.
Решаем. Тока, выкинем RTC, за ненадобностью
Функция tmr10Sec() будет вызываца строго 1 раз в 10 секунд.
Проблема решена.
а на самом деле в этом коде не нужен RTC вовсе
b707, Спасибо за подсказку. Данный вариант помог решить проблему. Мне не нужно было загонять вычитаемое в отрицательное значение, а просто увеличить уменьшаемое.
По поводу RTC
Просто хотелось решить данную задачу не используюя millis(), а применяя внешний счетчик. Но тут до меня дошло, что случись что с RTC(батарейка села, контакта нет и тд), данные на SD я писать не смогу. Поэтому решение найдено, спасибо b707, но надежнее делать на millis().
Спасибо всем за участие.