Весовой дозатор на HX711. Низкая скорость обработки данных.

Gexogyan
Offline
Зарегистрирован: 13.01.2020

Всем привет! 

Пытаюсь сделать простой весовой дозатор для воды: нажал кнопку, через реле включается водяная помпа, в небольшую емкость наливается определенное кол-во воды, помпа отключается.

Все бы ничего, но:

1. приходится долго держать кнопку запуска (до 2 сек), чтобы запустить процесс - (хотя это не так страшно, как следующая проблема)

2. когда вес достигает необходимого предела, прерывание реле происходит со значительной задержкой, и вес процентов на 5-10 превышает необходимый.

Что делать?

Скетч далее. Скомпановал сам.

 

Опыт с Ардуино у меня всего неделя, поэтому прошу отнестись с пониманием.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Во-первых, вставьте код правильно. Во-вторых - кучу ошибок в коде у вас, например, на 10 делят не так. И дурацкий неправильный пример из библиотеки для тензомоста - кочует из скетча в скетч, вот что значит - стабильность.

Gexogyan
Offline
Зарегистрирован: 13.01.2020

Опишите, пожалуйста, детальней. 

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Gexogyan пишет:

Опишите, пожалуйста, детальней. 

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

Для начала прочтите: http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

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

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

Gexogyan
Offline
Зарегистрирован: 13.01.2020

Понял. Спасибо за ссылку.

#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);  // выключается диод и помпа
  }
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ошибки в строках 25 и 26. В строке 25 - вы не накапливаете полученные с весов значения. В строке 26 - не делите на 10. По поводу задержек при срабатывании кнопки - так у вас delay в коде. Чтобы не было задержек - надо избавляться от delay, переход на расчёт интервалов при помощи millis.

В вашем случае - delay вообще не нужен. И хорошим тоном программирования считается, когда на дисплей посылают информацию только тогда, когда она изменилась. Ибо нет смысла с сумасшедшей частотой при каждом вызове loop рисовать на дисплее одно и то же значение, если оно не меняется. 

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

Кроме абсолютно лишнего delay() в коде, о котором сказал DIYMan - тормоза в работе связаны с чтением с весов десяти значений. Библиотека "HX711.h" написана так, что одно чтение веса в ней занимает 70мс, соответвенно чтение десяти значений занимает порядка 0.7 сек - а это в масштабах любого управления чрезвычайно большая задержка.

Gexogyan
Offline
Зарегистрирован: 13.01.2020

DIYMan пишет:

Ошибки в строках 25 и 26. В строке 25 - вы не накапливаете полученные с весов значения. В строке 26 - не делите на 10. По поводу задержек при срабатывании кнопки - так у вас delay в коде. Чтобы не было задержек - надо избавляться от delay, переход на расчёт интервалов при помощи millis.

В вашем случае - delay вообще не нужен. И хорошим тоном программирования считается, когда на дисплей посылают информацию только тогда, когда она изменилась. Ибо нет смысла с сумасшедшей частотой при каждом вызове loop рисовать на дисплее одно и то же значение, если оно не меняется. 

Спасибо большое за качественный ответ!

По поводу использования millis вместо delay информации полно, изучу.

С правильной отправкой информации на дисплей тоже разберусь.

А вот замечаний в 25 и 26 строке - вообще не понимаю. Я даже не знаю какой запрос в гугле сделать... Подскажите, как надо правильно делать или какую нужно тему изучить?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Операторы = и +=

Gexogyan
Offline
Зарегистрирован: 13.01.2020

b707 пишет:

Кроме абсолютно лишнего delay() в коде, о котором сказал DIYMan - тормоза в работе связаны с чтением с весов десяти значений. Библиотека "HX711.h" написана так, что одно чтение веса в ней занимает 70мс, соответвенно чтение десяти значений занимает порядка 0.7 сек - а это в масштабах любого управления чрезвычайно большая задержка.

Да, это огромное количество времени. Но не понимаю как с этим бороться?

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

Gexogyan пишет:

Да, это огромное количество времени. Но не понимаю как с этим бороться?

ну, самое очевидное - не усреднять. Быстрая реакция на изменения и усреднение показаний - вещи по своей природе противоположные, а у вас к тому же даже одно измерение немало времени занимает.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Gexogyan пишет:

А вот замечаний в 25 и 26 строке - вообще не понимаю. Я даже не знаю какой запрос в гугле сделать... Подскажите, как надо правильно делать или какую нужно тему изучить?

В 25 строке - просто идёт присваивание, а не сложение. Более того - там лишняя запись ", 10" - уберите. А сложение с присвоением результата переменной - это не запись вида " = +", а оператор "+=".

В строке 26 - не деление переменной на 10 с присвоением результата этой переменной. Чтобы поправить, надо вместо "/" написать "/=".

А вообще - вам прямая дорога в учебник по С++, начиная с операторов языка. Почитайте, станет сильно понятнее.

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

Gexogyan пишет:

А вот замечаний в 25 и 26 строке - вообще не понимаю. Я даже не знаю какой запрос в гугле сделать... Подскажите, как надо правильно делать или какую нужно тему изучить?

какую тему изучать по 26 строке. о чем вы? - посмотрите на нее внимательно. Вот вы units делите на десять - и что? Результат деления куда девается?

Gexogyan
Offline
Зарегистрирован: 13.01.2020

b707 пишет:

ну, самое очевидное - не усреднять. Быстрая реакция на изменения и усреднение показаний - вещи по своей природе противоположные, а у вас к тому же даже одно измерение немало времени занимает.

Спасибо! Все гениальное просто!

Получается, мне код из 25 и 26 строки вообще не нужен? Удаляю его нафиг, получаю данные без всяких устреднений и бед не знаю, правильно?

Ну только, разве, надо правильный вывод на дисплей осуществить и избавиться от всяких delay-ев...?

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

Gexogyan пишет:

Получается, мне код из 25 и 26 строки вообще не нужен?

стоп-стоп, все удалять не надо, вы данные с весов как раз в строке 25 читаете. Уберите там цикл чтения 10 раз, но одно чтение придется оставить :)

Gexogyan
Offline
Зарегистрирован: 13.01.2020

b707 пишет:

стоп-стоп, все удалять не надо, вы данные с весов как раз в строке 25 читаете. Уберите там цикл чтения 10 раз, но одно чтение придется оставить :)

Понял, понял :) 

Я это и имел ввиду, когда писал "получаю данные без всяких устреднений"

Ну, буду копать, потом пришлю :)

Gexogyan
Offline
Зарегистрирован: 13.01.2020

В общем, понимаю что коряво, но как то так у меня теперь 25 строка выглядит. Зато все идеально работает!

Спасибо вам огромное!

    units = scale.get_units();
  {                                   
    ounces = units * 0.035274;