Весовой дозатор на HX711. Низкая скорость обработки данных.
- Войдите на сайт для отправки комментариев
Пнд, 13/01/2020 - 19:05
Всем привет!
Пытаюсь сделать простой весовой дозатор для воды: нажал кнопку, через реле включается водяная помпа, в небольшую емкость наливается определенное кол-во воды, помпа отключается.
Все бы ничего, но:
1. приходится долго держать кнопку запуска (до 2 сек), чтобы запустить процесс - (хотя это не так страшно, как следующая проблема)
2. когда вес достигает необходимого предела, прерывание реле происходит со значительной задержкой, и вес процентов на 5-10 превышает необходимый.
Что делать?
Скетч далее. Скомпановал сам.
Опыт с Ардуино у меня всего неделя, поэтому прошу отнестись с пониманием.
Во-первых, вставьте код правильно. Во-вторых - кучу ошибок в коде у вас, например, на 10 делят не так. И дурацкий неправильный пример из библиотеки для тензомоста - кочует из скетча в скетч, вот что значит - стабильность.
Опишите, пожалуйста, детальней.
У меня не хватает опыта понять что значит правильно вставить код. И ошибок, естественно, я тоже не вижу, по той же самой причине. Поэтому и обратился на форум.
Опишите, пожалуйста, детальней.
У меня не хватает опыта понять что значит правильно вставить код. И ошибок, естественно, я тоже не вижу, по той же самой причине. Поэтому и обратился на форум.
Для начала прочтите: http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
ошибки можно будет обсуждать после правильной вставки кода. сейчас на них и указать толком нельзя - номеров строк нет
Понял. Спасибо за ссылку.
Ошибки в строках 25 и 26. В строке 25 - вы не накапливаете полученные с весов значения. В строке 26 - не делите на 10. По поводу задержек при срабатывании кнопки - так у вас delay в коде. Чтобы не было задержек - надо избавляться от delay, переход на расчёт интервалов при помощи millis.
В вашем случае - delay вообще не нужен. И хорошим тоном программирования считается, когда на дисплей посылают информацию только тогда, когда она изменилась. Ибо нет смысла с сумасшедшей частотой при каждом вызове loop рисовать на дисплее одно и то же значение, если оно не меняется.
Кроме абсолютно лишнего delay() в коде, о котором сказал DIYMan - тормоза в работе связаны с чтением с весов десяти значений. Библиотека "HX711.h" написана так, что одно чтение веса в ней занимает 70мс, соответвенно чтение десяти значений занимает порядка 0.7 сек - а это в масштабах любого управления чрезвычайно большая задержка.
Ошибки в строках 25 и 26. В строке 25 - вы не накапливаете полученные с весов значения. В строке 26 - не делите на 10. По поводу задержек при срабатывании кнопки - так у вас delay в коде. Чтобы не было задержек - надо избавляться от delay, переход на расчёт интервалов при помощи millis.
В вашем случае - delay вообще не нужен. И хорошим тоном программирования считается, когда на дисплей посылают информацию только тогда, когда она изменилась. Ибо нет смысла с сумасшедшей частотой при каждом вызове loop рисовать на дисплее одно и то же значение, если оно не меняется.
Спасибо большое за качественный ответ!
По поводу использования millis вместо delay информации полно, изучу.
С правильной отправкой информации на дисплей тоже разберусь.
А вот замечаний в 25 и 26 строке - вообще не понимаю. Я даже не знаю какой запрос в гугле сделать... Подскажите, как надо правильно делать или какую нужно тему изучить?
Операторы = и +=
Кроме абсолютно лишнего delay() в коде, о котором сказал DIYMan - тормоза в работе связаны с чтением с весов десяти значений. Библиотека "HX711.h" написана так, что одно чтение веса в ней занимает 70мс, соответвенно чтение десяти значений занимает порядка 0.7 сек - а это в масштабах любого управления чрезвычайно большая задержка.
Да, это огромное количество времени. Но не понимаю как с этим бороться?
Да, это огромное количество времени. Но не понимаю как с этим бороться?
ну, самое очевидное - не усреднять. Быстрая реакция на изменения и усреднение показаний - вещи по своей природе противоположные, а у вас к тому же даже одно измерение немало времени занимает.
А вот замечаний в 25 и 26 строке - вообще не понимаю. Я даже не знаю какой запрос в гугле сделать... Подскажите, как надо правильно делать или какую нужно тему изучить?
В 25 строке - просто идёт присваивание, а не сложение. Более того - там лишняя запись ", 10" - уберите. А сложение с присвоением результата переменной - это не запись вида " = +", а оператор "+=".
В строке 26 - не деление переменной на 10 с присвоением результата этой переменной. Чтобы поправить, надо вместо "/" написать "/=".
А вообще - вам прямая дорога в учебник по С++, начиная с операторов языка. Почитайте, станет сильно понятнее.
А вот замечаний в 25 и 26 строке - вообще не понимаю. Я даже не знаю какой запрос в гугле сделать... Подскажите, как надо правильно делать или какую нужно тему изучить?
какую тему изучать по 26 строке. о чем вы? - посмотрите на нее внимательно. Вот вы units делите на десять - и что? Результат деления куда девается?
ну, самое очевидное - не усреднять. Быстрая реакция на изменения и усреднение показаний - вещи по своей природе противоположные, а у вас к тому же даже одно измерение немало времени занимает.
Спасибо! Все гениальное просто!
Получается, мне код из 25 и 26 строки вообще не нужен? Удаляю его нафиг, получаю данные без всяких устреднений и бед не знаю, правильно?
Ну только, разве, надо правильный вывод на дисплей осуществить и избавиться от всяких delay-ев...?
Получается, мне код из 25 и 26 строки вообще не нужен?
стоп-стоп, все удалять не надо, вы данные с весов как раз в строке 25 читаете. Уберите там цикл чтения 10 раз, но одно чтение придется оставить :)
стоп-стоп, все удалять не надо, вы данные с весов как раз в строке 25 читаете. Уберите там цикл чтения 10 раз, но одно чтение придется оставить :)
Понял, понял :)
Я это и имел ввиду, когда писал "получаю данные без всяких устреднений"
Ну, буду копать, потом пришлю :)
В общем, понимаю что коряво, но как то так у меня теперь 25 строка выглядит. Зато все идеально работает!
Спасибо вам огромное!