Как откалибровать тензодатчик?
Я работаю с тензодатчиком и HX711. На датчике не было веса, но я продолжал получать странные значения, я думал, что он сломан или что-то в этом роде, поэтому я использовал свой второй тензодатчик, но то же самое произошло снова. Мне интересно, что в этом плохого? Если кто-то работал с этим или у вас есть идеи, как с этим работать, пожалуйста, не стесняйтесь высказывать свое мнение.
#include "HX711.h"
#include <Wire.h>
#define DOUT A0
#define CLK A1
#define DEC_POINT 2
#define STABLE 1
float offset=0;
float calibration_factor = 1;
//float real_weight = 1.560;//kg
float real_weight = 0.5;//kg
HX711 scale(DOUT, CLK);
unsigned char state=0;
long FindZeroFactor();
float get_units_kg();
void ReadWeight();
void FindCalibrationFactor();
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("Auto Calibrate Program");
Serial.println("Send 'a' to Find Zero Factor (Please Remove all weight from scale)");
Serial.println("Send 'b' to Find Calibration Factor (Please insert know the weight on the scales)");
Serial.println("Send 'c' Show weight on the scales");
}
void loop()
{
if(Serial.available())
{
char temp = Serial.read();
if(temp=='a')
state=1;
if(temp=='b')
state=2;
if(temp=='c')
state=3;
}
switch(state)
{
case 0:
break;
case 1:
FindZeroFactor();
// ReadWeight();
state=0;
break;
case 2:
FindCalibrationFactor();
state=0;
break;
case 3:
ReadWeight();
delay(200);
break;
case 4:
break;
}
}
long FindZeroFactor()
{
Serial.println("Find Zero Factor");
Serial.println("Please wait .....");
scale.set_scale();
scale.tare();
long zero_factor = scale.read_average(20);
Serial.print("Zero factor: ");
Serial.println(zero_factor);
return(zero_factor);
}
void FindCalibrationFactor()
{
unsigned char flag_stable=0;
unsigned int decpoint=1;
for(unsigned char i=0;i<DEC_POINT+1;i++ )
decpoint = decpoint*10;
while(1)
{
scale.set_scale(calibration_factor); //Adjust to this calibration factor
Serial.print("Reading: ");
float read_weight = get_units_kg();
String data = String(read_weight, DEC_POINT);
Serial.print(data);
Serial.print(" kg");
Serial.print(" calibration_factor: ");
Serial.print(calibration_factor);
Serial.println();
long r_weight = (real_weight*decpoint);
long int_read_weight = read_weight*decpoint;
Serial.print(r_weight);
Serial.print(" , ");
Serial.println(int_read_weight);
long x;
if(r_weight == int_read_weight)
{
flag_stable++;
if(flag_stable>=STABLE)
{
Serial.print("Calibration Factor is = ");
Serial.println(calibration_factor);
break;
}
}
if(r_weight > int_read_weight)
{
x = r_weight - int_read_weight;
if(x > 100)
calibration_factor -= 1000;
else if(x > 100)
calibration_factor -= 10;
else
calibration_factor -= 1;
flag_stable=0;
}
if(r_weight < int_read_weight)
{
x = int_read_weight-r_weight;
if(x > 100)
calibration_factor += 1000;
else if(x > 10)
calibration_factor += 10;
else
calibration_factor += 1;
flag_stable=0;
}
}
}
float get_units_kg()
{
return(scale.get_units()*0.453592);
}
void ReadWeight()
{
scale.set_scale(calibration_factor); //Adjust to this calibration factor
Serial.print("Reading: ");
String data = String(get_units_kg()+offset, DEC_POINT);
Serial.print(data);
Serial.println(" kg");
}
@geniusme, 👍1
Обсуждение2 ответа
scale.set_scale(calibration_factor);
необходимо изменить на:
scale.set_scale(calibration_factor/[the reference weight you have used]);
Привет, Реза, и добро пожаловать на Arduino.SE! Хотя твой ответ может быть правильным, он немного краток. Не мог бы ты расширить наш ответ и объяснить, почему требуется это изменение?, @Greenonline
Первое, что всегда приходит мне на ум в отношении тензодатчиков, это схема, которая усиливает сигнал тензодатчика. Обычно сигнал тензодатчика изменяется в диапазоне низких мВ, поэтому вам приходится размещать схему с высоким коэффициентом усиления на пути сигнала, которая усиливает сигнал и ШУМ. Для этой цели вам придется использовать инструментальный усилитель, иначе ваш сигнал станет очень шумным.
И попробуйте также реализовать цифровой фильтр нижних частот, он должен компенсировать колебания и даст вам более плавный сигнал.
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
- Как получить данные о весе с датчиков стеклянных электронных весов для ванной?
- Как подключить более 10 датчиков к Arduino uno r3
- Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?
- Чтение датчика давления от 4 до 20 мА с использованием uno
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
Может быть, это перепады напряжения или ненадежное заземление?, @Code Gorilla
Или это может быть ваш (неуказанный) контур?, @Majenko
Типичные примеры показывают обнуление при запуске. После обнуления калибровка может быть такой же простой, как известная масса или несколько для проверки линейности. Если у вас есть другие весы, найденные объекты подойдут, в противном случае вы можете получить грубый набор калибровочных грузов. Если у вас есть датчик луча, убедитесь, что он не перевернут. Будьте осторожны, всегда будет шум — вы, вероятно, захотите некоторую фильтрацию в том, что вы отображаете, снова см. типичные примеры., @Chris Stratton
@Matt, я в курсе и все проверил., @geniusme
@Majenko что ты имеешь в виду?, @geniusme
@ChrisStratton Я нашел несколько примеров кода и использую один, но теперь я получаю ноль, даже когда ставлю датчик на ожидание. PS: я использую датчик нагрузки на растяжение и сжатие, @geniusme
@geniusme Я говорю, что, возможно, что-то не так со схемой, которую вы используете для сопряжения вашего тензодатчика с Arduino - однако вы не показали нам эту схему, поэтому мы не можем сказать. Пожалуйста, покажите вашу схему, а также ваш код. Без этого мы не сможем вам помочь., @Majenko
@Majenko Я подключаю свою схему вот так [ссылка](http://www.naylampmechatronics.com/img/cms/Blog/Tutorial%20HX711/Conexiones.JPG), @geniusme
@geniusme Мне это ничего не говорит. Что это за соединения? Куда они идут? Что это за схема у вас там? Я предполагаю, что где-то там должна быть какая-то форма моста Уитстона, да?, @Majenko
@Majenko да, это так, @geniusme
@Majenko Я использую тензодатчик для взвешивания вещей, которые на другой плате представляют собой преобразователь A/N и усилитель (разница очень мала, поэтому нам нужно усилить ее, чтобы получить заметный результат), @geniusme
Не могли бы вы добавить пример вывода к вопросу? В вопросе вы сказали, что получаете странные значения, но в комментариях вы сказали, что получаете только
0
., @Gerbenпотому что я начал использовать библиотеку, теперь, когда у меня нет ничего на датчике, он показывает ноль, а когда я ставлю известный вес, он дает мне значение, но не вес. Я пытаюсь найти математическую формулу, чтобы получить правильный вес, @geniusme
Является ли значение постоянным? Если это так, и вы находитесь в линейном диапазоне, то математическая формула заключается в умножении на константу. Вы спрашиваете, как вычислить константу? Если да, то каков известный вес и каково отображаемое значение., @Dave X
@DaveX Я нашел математическое уравнение, спасибо! Мне было интересно, если у меня много тензодатчиков, придется ли мне калибровать каждый из них каждый раз?, @geniusme
@genuisme Чтобы получить очень высокий уровень точности, да. Тензодатчики и электроника подвержены механическим, производственным изменениям, ползучести и т. д., и использование общего калибровочного коэффициента сделает ваши системы восприимчивыми к этим факторам. Для достижения наивысшего уровня точности вам следует провести повторную калибровку с известными эталонами веса в интересующем диапазоне перед измерением, а затем повторно проверить дрейф., @Dave X