Друзья, опять нужна ваша помощь.
Датчик должен передавать температуру на приемник (не ардуино, заводское устройство) с периодичность максимально близкой к постоянной, у родных передатчиков разница между двумя отправками в пределах 10 миллисекунд.
Хотелось бы добиться примерно такой же точности для корректного приема.
Подводит датчик температуры у которого очень разнится время чтения данных - от 60 до 120 миллисекунд из-за чего не получается “выровнять” время.
Пытался реализовать с помощью миллис, рассчитывая что отсчет время чтения датчика начнется одновременно с миллис и оно окажется как-бы “внутри” времени таймера миллис, но выводя данные в порт понял, что миллис работает не так. Перепробовал много разных схем с миллис, тут лишь один из “нерабочих” вариантов.
После отправки плата (lgt8f328p) уходит в сон на точно заданное время, с этим проблем нет.
Подскажите как реализовать точную задержку на чтение датчика и как следствие - точное время работы loop. Ох, надеюсь вы меня поняли.
А зачем? Себе же отправка по времени нужна (как я понял), ну и отправляй раз в нужно время (например раз в 2 секунды) ранее считанное значение. И даде если оно не успело обновиться или обновилось 500 раз - какая разница?))
С какой периодичностью-то?
Главное, чтобы эта периодичность была заведомо больше времени испольнения loop(). Если это условие выполняется - то остальное абсолютно без проблем, точность легко получить не только 10мс, но и 1-2 мс
Так он по интерфейсу i2c. Надо делать примерно так:
Включили, ждём >40мс(калибровка и инициализация)
Отправили команду чтения и вышли в луп.
Через >80мс по миллису читаем и снова даём команду на чтение и выходим в луп.
То есть мы не зависаем, ожидая пока датчик измерит. Я такой алгоритм применял с датчиком HC-SR04. Итоговое время общения с ним было порядка 10-20мкс, то есть почти ничто.
Главное ручками свою неблокирующую библиотечку написать.
Простите, может я что то не понимаю, но есть такая величина температурная постоянная - время за которое при максимальном потоке тепла температура объекта изменяется на единицу разряда измерения. Измерять быстрее не имеет никакого инженерного смысла. Кроме того есть такая же постоянная времени датчика. А ещё есть время оцифровки. Это как желание измерить до сотых температуры воды в кастрюле на огне, в которой разница температур в разных точках больше нескольких градусов. Такое желание говорит о невежественности желавшего непонятного.
Хм, сколько ответов и все про разное, значит не прозрачно разъяснил…
Неважно сколько времени периодичность (48 сек если хотите), с эти проблем нет, чтения ант в приложеном примере тоже нет, но это к делу не относится (вместо чтения тут просто стоит константа 20.0 для тестов), проблема в том как написать программу.
Установив задержку миллис в 1 сек я расчитывал, по неопытности, что чтение АНТ и отправка данных стартуют сразу с миллис и к окончанию этой секунды данные прочитаются и отправятся. В таком случае мне останется только уйти в сон на 47 секунд и ключик наш!
Но на деле чтение/отправка стартуют после отсчета миллис, итого получается: 1 сек + 60÷120мс + 47 сек, т.е. не точно 48 секунд.
бред какой-то
Код покажите
Чтение будет стартовать там, где вы его поместите в коде. Хотите до миллис, хотите после.
Но чтобы у вас были постоянные интервалы - чтение датчика нужно помещать ВНУТРЬ ИНТЕРВАЛА миллис
Поправлю чуть чуть. Не чтение. Запуск оцифровки температуры. А уж чтение по готовности после запуска оцифровки. Иначе можно прочитать данные равномерно, но при этом получить температуру давно лежащую в регистре датчика.
Вот другой вариант кода. В лупе через 1 сек начинается чтение-отправка, потом сон на 8 сек. Итого имеем 1 сек + 60÷120мс + 8 сек, т.е. время не постоянное а меняется в пределах 9.060- 9.120 сек, мне нужно чтобы не менялось и было постоянным!
Длительность цикла миллис должна быть больше, чем сумма всех событий в нем.
То есть сон 8 сек + чтение дачика и отправка 1.5 сек - то есть цикл не менее 9.5. А лучше 10, чтоб с запасом
Повторю ещё раз. Я не знаю есть ли в этой библиотеке методы работы отдельно команды измерения и отдельно получения данных. Если нет, то надо их самому написать.
Что происходит: дали команду и тупо ждём в цикле while пока датчик соизволит измерить. Это глубо.
Что надо: быстро получили данные предидущего измерения, отправили команду, занимаемся своими делами, по прошествии T быстро читаем, снова даём команду и выходим из миллиса. T должно быть больше 40 или 80 мс(в ДШ смотреть надо)
Дмитрий, посмотрите пожалуйста, добавил как понял. “Сон” у меня отрубает чип полностью, в последних двух строках думаю толку нет. По процессу кажется ничего не изменилось, время всего цикла гуляет прилично: