HX711

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Здравствуйте. Поставил себе задачу раз в N мсек записывать в переменную значение, полученное с тензодатчика и услленное HX711, параллельно выполняя код (суть кода в данном случае не важна).

В общем случае (без форс-мажора) программа работает нормально с подключённой библиотекой hx711.h, но при обрыве связи, выходе из строя микросхемы и прочих неблагоприятных обстоятельствах программа зависнет. Причина тому - выполнение простого

scale.get_value()

длится 100 мсек (долго, но по даташиту без танцев с бубном в виде перемычки модуль "посылает" 10 семплов).

Если "заглянуть внутрь" функции get_value(), то неискушённому зрителю видится такой алгоритм - посыл высокого, а затем низкого сигнала, а затем в цикле white - ожидание данных.

Проблема наступает тогда, когда данные не возвращаются (как писал выше - форс-мажор в виде обрыва провода): в случае с другими датчиками, например, с терморезистором, мы просто получим неадекватно высокое (1023) или низкое(0) значение на аналоговом пине, которое и будет сигнализировать о неисправности. В случае же с HX711 и родной библиотекой скетч "зависнет", ожидая данных, которые могут уже никогда и не поступить.

Вопрос - что делать при превышении времени? Хотелось бы просто прерывать цикл while не влезая в код чужой библиотеки. Свои библиотеки я не писал, поэтому и задаю вопрос в соответствующем разделе.

b707
Offline
Зарегистрирован: 26.05.2017

andreykrasnodar пишет:

Хотелось бы просто прерывать цикл while не влезая в код чужой библиотеки.

не влезая в код не выйдет, библиотека написана в блокирующем стиле. При обрыве связи виснет навсегда.

Я об этом года 4 назад писал тут на форуме, даже патч выкладывал. Только, по-моему, я убирал блокировку при начальном подключении, а не при чтении данных...

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

b707 пишет:
библиотека написана в блокирующем стиле

Буду знать, как это называется.

b707 пишет:

Я об этом года 4 назад писал тут на форуме, даже патч выкладывал. Только, по-моему, я убирал блокировку при начальном подключении, а не при чтении данных...

Нашёл. https://arduino.ru/forum/programmirovanie/glyuki-biblioteki-hx711h

b707 пишет:

В коде метода HX711::read() меня ждала следующая бомба :

long HX711::read() {
	// wait for the chip to become ready
	while (!is_ready()) {
		// Will do nothing on Arduino but prevent resets of ESP8266 (Watchdog Issue)
		yield();
}

 

Сразу стало понятно, почему автор библиотеки не стал использовать встроенную подтяжку для пина DOUT - да потому что тогда библиотека безнадежно виснет при отключенных датчиках. Выхода-то из цикла проверки не предусмотрено!

Что интерсно, об этом баге автору неоднократно писали- но код остается прежним. У этой библиотеки масса "улучшенных" модификаций на Гитхабе - но бесконечный цикл  while (!is_ready()) присутсвует во всех вариантах без изменений.

но без решения.

b707
Offline
Зарегистрирован: 26.05.2017

andreykrasnodar пишет:

но без решения.

я пытался это как-то решать и мне казалось, даже выкладывал - но искать нет смысла, вариант был половинчатый и всех проблем не снимал. Я тогда в итоге забросил эту проблему, потому что проект, куда это все планировалось - отменился.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Вот где нашлась блокировка:

void HX711::wait_ready(unsigned long delay_ms) {
	while (!is_ready()) {
		delay(delay_ms);
	}
}

в то время, как

is_ready()

всего лишь опрашивает пин.

Думаю, цикл

while (!is_ready())

заменить на 

while ((i <= 200) && (!is_ready()))

, чтоб он не выполнялся бесконечное количество раз, а максимум 200. Либо вообще избавиться от while: если 

is_ready()

возвращает 0, то пусть и read() возвращает ошибку. Такие мысли.