HX711
- Войдите на сайт для отправки комментариев
Здравствуйте. Поставил себе задачу раз в N мсек записывать в переменную значение, полученное с тензодатчика и услленное HX711, параллельно выполняя код (суть кода в данном случае не важна).
В общем случае (без форс-мажора) программа работает нормально с подключённой библиотекой hx711.h, но при обрыве связи, выходе из строя микросхемы и прочих неблагоприятных обстоятельствах программа зависнет. Причина тому - выполнение простого
scale.get_value()
длится 100 мсек (долго, но по даташиту без танцев с бубном в виде перемычки модуль "посылает" 10 семплов).
Если "заглянуть внутрь" функции get_value(), то неискушённому зрителю видится такой алгоритм - посыл высокого, а затем низкого сигнала, а затем в цикле white - ожидание данных.
Проблема наступает тогда, когда данные не возвращаются (как писал выше - форс-мажор в виде обрыва провода): в случае с другими датчиками, например, с терморезистором, мы просто получим неадекватно высокое (1023) или низкое(0) значение на аналоговом пине, которое и будет сигнализировать о неисправности. В случае же с HX711 и родной библиотекой скетч "зависнет", ожидая данных, которые могут уже никогда и не поступить.
Вопрос - что делать при превышении времени? Хотелось бы просто прерывать цикл while не влезая в код чужой библиотеки. Свои библиотеки я не писал, поэтому и задаю вопрос в соответствующем разделе.
Хотелось бы просто прерывать цикл while не влезая в код чужой библиотеки.
не влезая в код не выйдет, библиотека написана в блокирующем стиле. При обрыве связи виснет навсегда.
Я об этом года 4 назад писал тут на форуме, даже патч выкладывал. Только, по-моему, я убирал блокировку при начальном подключении, а не при чтении данных...
Буду знать, как это называется.
Я об этом года 4 назад писал тут на форуме, даже патч выкладывал. Только, по-моему, я убирал блокировку при начальном подключении, а не при чтении данных...
Нашёл. https://arduino.ru/forum/programmirovanie/glyuki-biblioteki-hx711h
В коде метода HX711::read() меня ждала следующая бомба :
Сразу стало понятно, почему автор библиотеки не стал использовать встроенную подтяжку для пина DOUT - да потому что тогда библиотека безнадежно виснет при отключенных датчиках. Выхода-то из цикла проверки не предусмотрено!
Что интерсно, об этом баге автору неоднократно писали- но код остается прежним. У этой библиотеки масса "улучшенных" модификаций на Гитхабе - но бесконечный цикл while (!is_ready()) присутсвует во всех вариантах без изменений.
но без решения.
но без решения.
я пытался это как-то решать и мне казалось, даже выкладывал - но искать нет смысла, вариант был половинчатый и всех проблем не снимал. Я тогда в итоге забросил эту проблему, потому что проект, куда это все планировалось - отменился.
Вот где нашлась блокировка:
в то время, как
всего лишь опрашивает пин.
Думаю, цикл
заменить на
, чтоб он не выполнялся бесконечное количество раз, а максимум 200. Либо вообще избавиться от while: если
возвращает 0, то пусть и read() возвращает ошибку. Такие мысли.