Millis() не возвращается к нулю после пробуждения из режима глубокого сна
Я собираюсь сделать проект, для которого нужны четыре платы Arduino, синхронизация которых во времени необходима. Проект заключается в захвате метки времени (в разрешении ms) всякий раз, когда что-то пересекает ультразвуковой датчик приближения. Ниже приведены модули, которые я собираюсь использовать:
- Arduino Uno R3 4 единицы
- Ультразвуковой датчик приближения 4 единицы
- DS1302 RTC модули 4 единицы
- Модули карт Micro SD 4 единицы
Платы будут размещены в 4 разных местах, которые находятся довольно далеко друг от друга, что затрудняет проводное соединение. Обнаруживающий объект будет двигаться вперед и назад в течение определенного промежутка времени, поэтому необходима синхронизация времени.
Моя идея состоит в том, что, используя метку времени из модулей RTC, я перевожу все платы вместе в режим глубокого сна в то время, которое я установил в коде, и пробуждаю их вместе через 10 секунд. У меня нет никаких проблем с модулями RTC, но моя проблема заключается в функции millis(), которая не вернулась к нулю после пробуждения из режима глубокого сна. Мне нужна эта функция, так как DS1302 RTC не обеспечивает разрешение ms, но я не могу добиться синхронизации, если функция millis() не возвращается к нулю.
Я попробовал код (отредактированный с добавлением millis () в цикл) отсюда: https://www.youtube.com/watch?v=8fiYvnBDsDE
Есть ли у вас какие-то решения? Или другой модуль RTC, который вместо этого обеспечивает разрешение ms. Спасибо
@jendiiw, 👍2
Обсуждение2 ответа
Сохраните millis() при загрузке, и если (resetCause == "Deep-Sleep Wake") обнулит сохраненную копию millis() .
Я не понимаю, как вы заставите их синхронизироваться друг с другом. Модули RTC отлично работают, но нет никакой связи, чтобы установить или обновить их, и они дрейфуют. С помощью RTC будет легко сгенерировать метку времени, используя время Unix. Существует много информации о том, как это сделать. синхронизация (делающая все часы одинаковыми) - вот в чем, я думаю, ваша проблема. Подумайте о добавлении Wi-Fi к каждому и используйте NTP для синхронизации всего, это будет автоматически.
- Как отслеживать миллисекунды в спящем режиме
- Как справиться с rollover millis()?
- Использование millis() и micros() внутри процедуры прерывания
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- ардуино - миллисекунды ()
- Как перевести ATtiny/ATmega в режим глубокого сна (чтобы годами работать от батарей), но при этом обнаруживать нажатие кнопки?
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Использовать timer0, не влияя на millis() и micros().
почему вы не можете обрабатывать значение millis() во время пробуждения как нулевую контрольную точку?, @jsotola
На самом деле я не думаю, что
millis ()
должен быть сброшен при пробуждении..., @Sim SonЭто выглядит как [проблема XY] (http://xyproblem.info /). X: вам нужно синхронизировать время, Y: вы хотите сбросить
millis ()
., @Edgar BonetЯ не могу добиться синхронизации, если функция millis() не возвращается к нулю
... измените свой код так, чтобы он не требовал сброса millis(), @jsotolaВы должны прочитать ссылку Эдгара на проблему XY. Хотя, похоже, это может быть связано с отслеживанием объекта в двух измерениях. На самом деле это говорит о чем-то другом., @GMc
Вам также следует еще раз прочитать комментарий jsotola. Вот еще одна подсказка...
zeroTime = millis();
время идет, что-то происходит,SampleTime = millis();
иelapsedTime = SampleTime - zeroTime
. В этой подсказке действительно ли имеет значение, каково значение времени начала? Убедитесь, что вы используете неподписанные значения для вашего. Переменные., @GMc