Kalibrasi sensor loadcell interaktif dengan Serial USB TTL Arduino

Sebelum digunakan, timbangan wajib ditera atau di kalibrasi. Proses kalibrasi timbangan dilakukan dengan membandingkan hasil terukurnya dengan berat diketahui sebuah beban pengkalibrasinya.

Loadcell digunakan sebagai sensor berat digital. Proses kalibrasi loadcell dengan arduino menggunakan metode dua beban menggunakan formula :

cara mengkalibrasi loadcell dengan metode dua beban ini menghasilkan dua variabel yaitu skala dan ofset.

Timbangan digital dengan sensor loadcell memiliki karakteristik akurasi berikut :

  1. Skala
  2. Ofset
  3. Linearitas
  4. Diferensial linearitas
  5. Kuantisasi
  6. Transisi akurasi

Setiap loadcell memiliki karakteristik yang berbeda-beda. cara memperoleh nilai skala dan offset yang baik adalah dengan menetapkan nilai beban pengkalibrasi antara 25% – 75% dari kapasitas loadcell.

skema / rangkaian kalibrasi loadcell arduino:

Setting kalibrasi ini akan disimpan di EEPROM, dan akan diambil kembali saat perangkat mulai dihidupkan.

koding /program kalibrasi loadcell menggunakan arduino:

#include "HX711.h"
#include <EEPROM.h>

#define alamatKalibrasiM 0
#define alamatKalibrasiC 4

//pin
HX711 scale(A0, A1); // (DT, SCK)

byte modeKalibrasi = 0;
uint16_t beratKalibrasi1Tera;
uint16_t beratKalibrasi2Tera;
long beratKalibrasi1;
long beratKalibrasi2;

long lastMillis;

void setup() {
  Serial.begin(9600);
  Serial.println("Kalibrasi Loadcell");
  Serial.println("https://www.semesin.com/project/");
  Serial.println();
  
  float m,c;
  EEPROM.get(alamatKalibrasiM, m);
  EEPROM.get(alamatKalibrasiC, c);
  scale.power_up();
  scale.set_scale(m);
  scale.set_offset(c);
  scale.power_down();

  lastMillis = millis();
}

void loop() {
  if(Serial.available())
  {
    if(modeKalibrasi == 0)
    {
      if(toupper(Serial.read()) == 'K')
      {
        Serial.println("Masukkan beban kalibrasi pertama (gram) :");
        modeKalibrasi = 1;
      }
    }
    else if (modeKalibrasi == 1)
    {
      scale.power_up();
      delay(100);
      beratKalibrasi1Tera = Serial.parseInt();
      beratKalibrasi1 = scale.read_average(10);
      Serial.println("Beban = " + String(beratKalibrasi1Tera) + " gram, terukur = " + String(beratKalibrasi1) + " unit");
      Serial.println("Masukkan beban kalibrasi kedua yang lebih besar (gram) :");
      modeKalibrasi = 2;
      scale.power_down();
    }
    else if (modeKalibrasi == 2)
    {
      scale.power_up();
      delay(100);
      beratKalibrasi2Tera = Serial.parseInt();
      beratKalibrasi2 = scale.read_average(10);
      Serial.println("Beban = " + String(beratKalibrasi2Tera) + " gram, terukur = " + String(beratKalibrasi2) + " unit");
      
      float m = 1.0 * (beratKalibrasi2 - beratKalibrasi1) / ( beratKalibrasi2Tera - beratKalibrasi1Tera);
      float c = beratKalibrasi2 - (1.0 * m * beratKalibrasi2Tera);

      scale.set_scale(m);
      scale.set_offset(c);
      EEPROM.put(alamatKalibrasiM, m);
      EEPROM.put(alamatKalibrasiC, c);

      Serial.print("Skala = ");
      Serial.println(m);
      Serial.print("Ofset = ");
      Serial.println(c);

      scale.power_down();
      Serial.println("Kalibrasi berhasil.");
      
      modeKalibrasi = 0;
    }
  }

  if(!modeKalibrasi)
  {
    if(millis() - lastMillis > 100)
    {
      scale.power_up();
      delay(10);
      float berat = scale.get_units(10);
      scale.power_down();
      Serial.print("Berat : ");
      Serial.println(berat);
      lastMillis = millis();
    }
  }
}

Cara kalibrasi loadcell melalui serial monitor:

Prosedur kalibrasi loadcell dengan arduino melalui serial monitor:

  1. Input ‘K’ atau ‘k’ untuk masuk mode kalibrasi.
  2. Naikkan beban pengkalibrasi pertama
  3. Inputkan berat tera beban pengkalibrasi pertama – Enter
  4. Naikkan beban pengkalibrasi kedua
  5. Inputkan berat tera beban pengkalibrasi kedua – Enter
  6. Selesai

Library : HX711.zip

Timbangan digital presisi dan lcd pabrikan dengan arduino

dalam projek msin timbangan otomatis ini saya memanfatkan timbangan digital merk Quattro yang sudah tidak berfungsi normal. Fokus proyek ini adalah untuk memanfatkan Sensor berat/loadcell yang presisi dan linear serta LCD pabrikannya sehingga timbangan bisa dimanfatkan kembali.

komponen yang digunakan:

  1. Arduino Uno
  2. Loadcell
  3. HX711
  4. LCD pabrikan (driver HT1621)

Diagram:

Loadcell

Loadcell atau sensor berat pada perangkat quttro yang digunakan memiliki ukuran lebih besar dari loadcell yang ada dipasaran namun memiliki kesamaan cara kerja dan pengkabelan, kabel terdiri dari empat warna yaitu merah – E+, hitam – E-,  putih – A/B+ dan hijau – A/B-.

HX711

komponen (modul) ini berfungsi sebagai ADC – analog to digital converter 24 bit yang akan mengkonversi nilai resistansi dari jembatan Wheatstone menjadi nilai yang berbanding lurus dengan berat benda yang ditimbang

LCD pabrikan

LCD yang digunakan merupakan bawaan perangkat timbangan quattro yang khusus dipakai untuk jenis timbangan ini saja. karakter Terdiri dari 6 digit seven segmen, 3 digit character segmen (seperti seven segmen digabung dengan garis diagonal), 10 bar/garis penanda berat, dan tampilan penunjuk lainnya.

LCD ini dikontrol oleh driver HT1621 dengan 4 jalur input, saya hanya menggunakan 3 saja yaitu CS, WR dan Data. sedangkan  untuk tampilannya saya hanya menggunakan 6 seven segmen dan 2 character segment untk text “Gr”.

 

Skema:

program/sketch:

#include "HX711.h"

HX711 scale(8,9);

#define jumlahSegmen 15
 
//Command
#define  ComMode	0x52
#define  RCosc	  0x30
#define  LCD_on	 0x06
#define  LCD_off	0x04  
#define  Sys_en	 0x02
#define  CTRl_cmd   0x80  
#define  Data_cmd   0xa0  

//pin
int CS = A3;
int WR = A1;
int Data = A0;
int backLight = 7;
int buttonESC = 5;
int buttonPCS = 4;
int buttonUNIT = 3;
int buttonTARE = 6;
int buttonZERO = 2;

byte angka[] = {0xBE, 0x06, 0x7C, 0x5E, 0xC6, 0xDA, 0xF2, 0x0E, 0xFE, 0xCE};
byte byteArrayBerat[8];
byte strBerat[6];
 
void SendBit_1621(byte sdata,byte cnt)
{ 
  for(byte i=0;i<cnt;i++) 
  { 
	digitalWrite(WR, LOW);
	
	if(sdata&0x80) 
	  digitalWrite(Data, HIGH); 
	else 
	  digitalWrite(Data, LOW);
	  
	digitalWrite(WR, HIGH);
	sdata<<=1; 
  } 
}
 
void SendCmd_1621(byte command) 
{ 
  digitalWrite(CS, LOW); 
  SendBit_1621(0x80,4);  
  SendBit_1621(command,8); 
  digitalWrite(CS, HIGH);					 
}
 
void Write_1621(byte addr,byte sdata)
{ 
  addr<<=3; 
 digitalWrite(CS, LOW); 
 SendBit_1621(0xa0,3);	 
 SendBit_1621(addr,6);	 
 SendBit_1621(sdata,8);   
 digitalWrite(CS, HIGH); 
} 

void doubleToDecArray(double value, byte *byteArray)
{
  double divider = 1000.0;
  for(byte i=0;i<8;i++)
  {
	byte divValue = value / divider;
	byteArray[i] = divValue;
	value = value - (divValue * divider);
	divider /= 10;
  }
}

void setup() {
  pinMode(CS, OUTPUT);
  pinMode(WR, OUTPUT);
  pinMode(Data, OUTPUT);
  pinMode(backLight, OUTPUT);
  pinMode(buttonESC, INPUT_PULLUP);
  pinMode(buttonPCS, INPUT_PULLUP);
  pinMode(buttonUNIT, INPUT_PULLUP);
  pinMode(buttonTARE, INPUT_PULLUP);
  pinMode(buttonZERO, INPUT_PULLUP);

  digitalWrite(backLight,LOW);
  digitalWrite(CS, HIGH);
  digitalWrite(Data, HIGH);
  digitalWrite(WR, HIGH);

  Serial.begin(9600);
  Serial.println("Timbangan Arduino");
  Serial.println("https://www.semesin.com/project");
  
  delay(50);
  SendCmd_1621(Sys_en);
  SendCmd_1621(RCosc);	
  SendCmd_1621(ComMode);  
  SendCmd_1621(LCD_on);

  for(byte i=0;i<jumlahSegmen;i++) 
  {
	Write_1621(i,0xff); 
  } 
  delay(1000);
  for(byte i=0;i<jumlahSegmen;i++) 
  {
	Write_1621(i,0x00); 
  } 
  Write_1621(6,0x85);// huruf 'G'
  Write_1621(7,0xA6);
  Write_1621(10,0x02);//Huruf 'r'
  Write_1621(11,0x40);

  scale.set_scale(2280.f);
  scale.tare();
  }
 
void loop() {

  double Berat = scale.get_units(10);
  Serial.println(Berat);
  
  bool getNum = false;
  byte numPointer = 0;
  byte numCounter = 0;
  
  if(Berat < 0)
  {
	Berat = 0;
  }
  else
  {
	doubleToDecArray(Berat, byteArrayBerat);
	for(byte i=0;i<8;i++)
	{
	  if(byteArrayBerat[i] != 0)
	  {
		getNum = true;
	  }
	  if(getNum)
	  {
		numCounter++;
		strBerat[numPointer] = angka[byteArrayBerat[i]];
		if(i==3)
		{
		  strBerat[numPointer] |= 0x01;//Koma
		}
		if(numPointer++ == 6)
		{
			numCounter--;
			break; 
		}
	  }
	  else if(i==3)
	  {
		getNum = true;
		strBerat[numPointer++] = angka[0] | 0x01;
	  }
	}
	byte j=0;
	for(int8_t i=0;i<6-numCounter;i++)
	{
	  Write_1621(i,0x00); 
	}
	for(byte i=6-numCounter;i<6;i++)
	{
	  Write_1621(i,strBerat[j++]); 
	}
  }

  if(!digitalRead(buttonTARE))
  {
	delay(200);
	if(!digitalRead(buttonTARE))
	{
	  scale.tare();
	  while(!digitalRead(buttonTARE));
	}
  }
  delay(50);
}

Fitur-fitur modul HX711:

  1. Memiliki 2 block differential ADC sehingga bisa dengan gain yang berbeda disesuaikan dengan tingkat presisi yang diinginkan , yang tersedia 32, 64 dan 128.
  2. Memiliki regulator tegangan sendiri untuk loadcell dan ADC.
  3. Interface serial yang disederhanakan.
  4. Frekuensi keluaran dapat diatur 10SPS dan 80sps
  5. Penyaring/filter riak 50Hz dan 60Hz.

Dengan spesifikasi:

  1. Tegangan operasional dc 2.6 ~ 5.5v.
  2. ADC 24 bit yang presisi.
  3. frekuensi Internal clock 11.0592 MHz.
  4. Konsumsi arus, 1500uA (normal), 0,5uA (power down).

dokumentasi Galeri timbangan digital presisi