HX 711 плавает ноль

avgustdon
Offline
Зарегистрирован: 28.02.2016

Понимаю, что точность у меня до сотых грамма при максимальном весе 3 кг, но, тем не менее, пытаюсь добиться четкого нуля нажатии на ресет, ну или при загрузке. Удалось удерживать ноль отсечением любых показаний меньше 0,2 гр. Этот способ сейчас реализован в скетче. Но проблема, если снимаем с весов вес вместе с тарой, весы обнуляются, а должны уйти в минус. Получается, если снова ставишь этот же вес вместе с тарой на весы, то получаешь вес вместе с тарой. Нехорошо как-то. Думаю, надо задать диапазон данных, при которых показания будут обнуляться автоматически, скажем при показаниях от -0,2 до 0,2 гр., но как это сделать не могу понять. В общем, прошу помочь решить этот вопрос, или предложить другой способ борьбы с плавающим нулем. Зараннее спасибо.


[code]
#include <EEPROM.h>
#include <HX711.h>        // Подключаем библиотеку HX711 для работы с АЦП hx711
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//#define batton_mode   2          // кнопка mode
#define batton_up     4          // кнопка up
#define batton_down   3          // кнопка down
int OutLed    =    7;          // светодиод сигнала достижения веса
#define OutBuzzer     A3         // выход на звуковой сигнал
#define battonReset   6          // кнопка reset
HX711 scale1 ;          // Создаем   весы
float myScale1 ;        // Переменные веса
int desired_weight ;     // переменная заданного веса в граммах
//int count_dispenser ;         // переменная для подсчета нажатий на кнопку mode (вход в режим настроек)

void setup() {
    EEPROM.get (0, desired_weight );
//  pinMode(batton_mode,  INPUT_PULLUP);  
  pinMode(batton_up,    INPUT_PULLUP);
  pinMode(batton_down,  INPUT_PULLUP);
  pinMode(battonReset,  INPUT_PULLUP);
  pinMode(OutLed,         OUTPUT);
  pinMode(OutBuzzer,    OUTPUT);
  Serial.begin(9600);
  lcd.begin(16, 2);
  scale1.begin(/*DT(DOUT)*/A1,/*SCK*/A0);
  scale1.set_scale(994); //531                     // Устанавливаем калибровочный коэффициент весов.
  scale1.tare();                               // Сбрасываем весы 1 на 0
  }
void loop(){ 
  if (digitalRead (batton_up) == !HIGH)   // кнопка увеличения заданного веса
   {desired_weight = desired_weight + 100;
   if (desired_weight > 3000)
   desired_weight = 3000;
   delay(300);

   }
  if (digitalRead (batton_down) == !HIGH)    // кнопка уменьшения заданного веса
   {desired_weight = desired_weight - 100;
   if (desired_weight < 0)
   desired_weight = 0;
   delay(300);
   }
     EEPROM.put (0, desired_weight );
           
int tare = digitalRead (battonReset);         // читаем кнопку ресет
  myScale1 = scale1.get_units();              // Запоминаем среднее значение на весах 1 без груза, но с учетом тары.



// ---------- управляем установкой нуля -----------------  
  if (myScale1 < 0.2)//задаем значение при котором будет происходить обнуление
  {scale1.tare();
  myScale1 = 0;}
//  delay(50);

  
  
  
  // ------------------------ нажатие кнопки "калибровка" -----------------
if (tare == HIGH)
  {scale1.tare();}
// ------------------ сравниваем вес с заданным весом -------------------------
if (myScale1 >= desired_weight)
  {digitalWrite(OutLed,!HIGH);
      tone(A3, 5000);
      delay(100);
      noTone(A3);  }
if ((myScale1 >= -(desired_weight/10)) && (myScale1 <= (desired_weight/10)))
  {digitalWrite(OutLed,!LOW);}///
// ------------ выводим в сериал порт ----------------------------- 
  Serial.print(digitalRead (batton_up));
  Serial.print("     "); 
  Serial.print(digitalRead (batton_down));
  Serial.print("     ");  
  Serial.print (desired_weight);
  Serial.print("     ves1  ");
  Serial.println(myScale1,1);
  
   // -------------Подпрограмма вывода на дисплей -------------------------------
  lcd.clear();                    
lcd.setCursor(1,0);  
  lcd.print(myScale1,1);
lcd.setCursor(11,0);
  lcd.print(desired_weight);      
}   

[/code]
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Схему покажите, пожалуйста.

avgustdon
Offline
Зарегистрирован: 28.02.2016

ЕвгенийП пишет:

Схему покажите, пожалуйста.

Досадно, но в редакторах чертить не умею. От руки если только. Не думал даже что может понадобиться.  Но вроде все стандартно. Что куда подключается видно по скетчу.  HX711 на А1, А0. Свисток А3. Кнопки D3, D4 соответственно замыкают на 0. Тензодатчик к HX711, тоже стандартно. Его если перепутаешь, мерять не будет. Вроде все. Если что упустил, укажите, сообщу.

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

Метод tare() сбрасывает в ноль, и означает "на весах стоит тара". Если вы хотите, чтобы тара уже не учитывалась - надо вызывать метод set_offset с параметром 0 - тогда вес ранее запомненной тары учитываться не будет.

avgustdon
Offline
Зарегистрирован: 28.02.2016

Спасибо за подсказку. Буду думать как это реализовать.