Millis() не возвращается к нулю после пробуждения из режима глубокого сна

Я собираюсь сделать проект, для которого нужны четыре платы Arduino, синхронизация которых во времени необходима. Проект заключается в захвате метки времени (в разрешении ms) всякий раз, когда что-то пересекает ультразвуковой датчик приближения. Ниже приведены модули, которые я собираюсь использовать:

  1. Arduino Uno R3 4 единицы
  2. Ультразвуковой датчик приближения 4 единицы
  3. DS1302 RTC модули 4 единицы
  4. Модули карт Micro SD 4 единицы

Платы будут размещены в 4 разных местах, которые находятся довольно далеко друг от друга, что затрудняет проводное соединение. Обнаруживающий объект будет двигаться вперед и назад в течение определенного промежутка времени, поэтому необходима синхронизация времени.

Моя идея состоит в том, что, используя метку времени из модулей RTC, я перевожу все платы вместе в режим глубокого сна в то время, которое я установил в коде, и пробуждаю их вместе через 10 секунд. У меня нет никаких проблем с модулями RTC, но моя проблема заключается в функции millis(), которая не вернулась к нулю после пробуждения из режима глубокого сна. Мне нужна эта функция, так как DS1302 RTC не обеспечивает разрешение ms, но я не могу добиться синхронизации, если функция millis() не возвращается к нулю.

Я попробовал код (отредактированный с добавлением millis () в цикл) отсюда: https://www.youtube.com/watch?v=8fiYvnBDsDE

Есть ли у вас какие-то решения? Или другой модуль RTC, который вместо этого обеспечивает разрешение ms. Спасибо

, 👍2

Обсуждение

почему вы не можете обрабатывать значение 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


2 ответа


2

Сохраните millis() при загрузке, и если (resetCause == "Deep-Sleep Wake") обнулит сохраненную копию millis() .

,

0

Я не понимаю, как вы заставите их синхронизироваться друг с другом. Модули RTC отлично работают, но нет никакой связи, чтобы установить или обновить их, и они дрейфуют. С помощью RTC будет легко сгенерировать метку времени, используя время Unix. Существует много информации о том, как это сделать. синхронизация (делающая все часы одинаковыми) - вот в чем, я думаю, ваша проблема. Подумайте о добавлении Wi-Fi к каждому и используйте NTP для синхронизации всего, это будет автоматически.

,