Весовой дозатор на HX711. Низкая скорость обработки данных.
- Войдите на сайт для отправки комментариев
Пнд, 13/01/2020 - 19:05
Всем привет!
Пытаюсь сделать простой весовой дозатор для воды: нажал кнопку, через реле включается водяная помпа, в небольшую емкость наливается определенное кол-во воды, помпа отключается.
Все бы ничего, но:
1. приходится долго держать кнопку запуска (до 2 сек), чтобы запустить процесс - (хотя это не так страшно, как следующая проблема)
2. когда вес достигает необходимого предела, прерывание реле происходит со значительной задержкой, и вес процентов на 5-10 превышает необходимый.
Что делать?
Скетч далее. Скомпановал сам.
Опыт с Ардуино у меня всего неделя, поэтому прошу отнестись с пониманием.
Во-первых, вставьте код правильно. Во-вторых - кучу ошибок в коде у вас, например, на 10 делят не так. И дурацкий неправильный пример из библиотеки для тензомоста - кочует из скетча в скетч, вот что значит - стабильность.
Опишите, пожалуйста, детальней.
У меня не хватает опыта понять что значит правильно вставить код. И ошибок, естественно, я тоже не вижу, по той же самой причине. Поэтому и обратился на форум.
Опишите, пожалуйста, детальней.
У меня не хватает опыта понять что значит правильно вставить код. И ошибок, естественно, я тоже не вижу, по той же самой причине. Поэтому и обратился на форум.
Для начала прочтите: http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
ошибки можно будет обсуждать после правильной вставки кода. сейчас на них и указать толком нельзя - номеров строк нет
Понял. Спасибо за ссылку.
#include "HX711.h" // библиотека весов #include <LiquidCrystal.h> // библ. дислпея LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // пины подключение дисплея. HX711 scale(A1, A0); // подключение АЦП float calibration_factor = -337; // калибровка! float units; float ounces; int blue = 7; // пин светодиода и помпы для воды (реле) int button = 8; //пин кнопки включения светодиода и помпы для воды void setup() { Serial.begin(9600); scale.set_scale(); scale.tare(); //Сбрасываем на 0 scale.set_scale(calibration_factor); //Применяем калибровку lcd.begin(16, 2); // весы pinMode (blue, OUTPUT); //назначение пина для диода } void loop() { Serial.print("Reading: "); for (int i = 0; i < 10; i ++) units = + scale.get_units(), 10; // усредняем показания считав 10 раз units / 10; { // делим на 10 ounces = units * 0.035274; // переводим унции в граммы Serial.print(ounces); // отправляем в монитор порта Serial.print(" grams"); Serial.println(); } lcd.setCursor (0, 0); lcd.print("Ves: "); lcd.print(ounces); lcd.print(" gr "); delay (500); if (digitalRead(button) == HIGH) // если кнопка нажата { digitalWrite(blue, HIGH); // включается диод и помпа } if ((ounces) >= 5.00) // если вес больше этого значения { digitalWrite(blue, LOW); // выключается диод и помпа } }Ошибки в строках 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 строка выглядит. Зато все идеально работает!
Спасибо вам огромное!
units = scale.get_units(); { ounces = units * 0.035274;