Глюки библиотеки HX711.h

Нет ответов
b707
Онлайн
Зарегистрирован: 26.05.2017

Библиотека HX711 для получения данных с ЦАП электронных весов является классикой Ардуино и входит в официальный пакет ИДЕ. Тем удивительнее было найти в ней ляпы, скорее приличествующие самым зеленым новичкам.

При написании скетча с использованием либы HX711 в первую очередь я столкнулся с тем, что библиотека не умеет определять физическое отключение датчика. Точнее, метод-то вроде есть -  HX711::is_ready() - но только он исправно выдавал true даже когда весы были отключены.  Второе - как и стандартная библиотека OneWire, HX711 содержит скрытые задержки, не позволяющие ее использовать в многопоточных программах. Чтение одного значения веса в среднем занимает 70 мс, которые библиотека честно ждет, тормозя программу. Если вы заказали чтение веса с усреднением по N значениям - ваша программа подвиснет на N * 70 мс, что уже совсем неприлично.

Чтение исходников подкинуло забавные открытия. Метод  HX711::is_ready() до смешного прост:

bool HX711::is_ready() {
	return digitalRead(DOUT) == LOW;
}

он лишь проверяет, есть ли на DOUT низкий уровень. Естесственно, что при отсутсвии подключения пин ловит наводки, становясь иногда HIGH. иногда LOW - код же написан так, что проверка готовности выполняется ДО ПЕРВОГО УСПЕШНОГО ОТВЕТА - то есть первая же наводка низкого уровня трактуется как готовность весов к работе.

Я наивно решил, что проблему можно решить подтяжкой DOUT к питанию. Почему-то автор библиотеки этого не сделал... Я добавил строчку pinMode(DOUT, IMPUT_PULLUP) - и скетч тут же завис :)

В коде метода 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()) присутсвует во всех вариантах без изменений.