Sistem Pengukuran Muatan Truk di Pabrik Kelapa Sawit

Anggota Kelompok:
Dasi Edimas Akbar (13214068)
Mukhtar Amin (13214123)

Abstrak-Telah dilakukan perancangan model sistem pengukuran muatan truk untuk pabrik kelapa sawit menggunakan Load Cell sebagai sensor berat, modul HX711 untuk amplifikasi keluaran sensor, LCD 16×2 untuk menampilkan hasil, pushbutton untuk merekam data dan Arduino UNO sebagai mikrokontroller. Pengujian telah dilakukan dan memberikan hasil yang sama dengan hasil referensi.

Spesifikasi

Sistem pengukuran muatan yang kami buat mengambil spesifikasi yang dijelaskan di bawah.

  • Antar muka sistem berupa pushbutton dan sensor Load Cell sebagai input dan tampilan ke LCD 16×2 sebagai output.
  • Muatan yang digunakan untuk model di bawah 5kg.
  • Mikroprosesor menggunakan Arduino UNO dengan prosesor ATMega328p.
  • Pemrograman sistem menggunakan bahasa C memakai WinAVR.

Diagram Blok

Gambar 1.1.1 di bawah adalah diagram blok secara umum dari Sistem Pengukur Berat Muatan Kelapa Sawit. Terdapat enam blok utama yang menyusun sistem yaitu (1) mikrokontroller, (2) sensor load cell, (3) modul amplifier, (4) power supply, (5) display LCD 16×2 dan (6) input pushbutton. Interaksi dan penjabaran keenam blok tersebut dapat diamati di Gambar 1.1.2 yang memperlihatkan diagram blok sistem yang lebih detail.

Gambar 1.1.1 Diagram Blok Sistem Secara UmumGambar 1.1.2 Diagram Blok Sistem Secara Detail

Tidak digambarkan pada kedua gambar diagram blok adalah blok ”timbangan”. Timbangan merupakan blok yang tersusun atas sensor berat berupa load cell dan amplifier HX711. Timbangan terdiri atas platform atau alas untuk menaruh beban yang dibawahnya terhubung ke load cell. Load cell dihubungkan ke mikrokontroller melalui amplifier HX711.

State Chart

Sistem Pengukur Berat Muatan kami dapat dibagi menjadi lima atau enam state. Lima state bila menggabungkan state kalibrasi dengan state awal dan enam state bila memisah kedua state tersebut. Gambar 1.2.1 di bawah memperlihatkan state chart sistem lima state termasuk state awal.

Pertama masuk ke sistem akan dilakukan inisiasi dan kalibrasi, selanjutnya sistem masuk ke state yang terus menerus membaca dan menampilkan berat beban yang ada di timbangan (state 1).

Selanjutnya sistem masuk ke state 2, state 3 atau state 4 sesuai tombol pushbutton yang dipencet. Pada state 2, state 3 dan state 4 sistem membaca atau menghitung berat truk dengan muatan, berat truk tanpa muatan dan berat muatan lalu menampilkannya pada LCD 16×2.

Gambar 1.2.1 State Chart Sistem

Implementasi Hardware

Komponen

Implementasi hardware dilakukan menggunakan komponen-komponen berikut:

No. Komponen Jumlah  
1. Breadboard 1
2. Arduino UNO 1
3. Potensiomenter 10kOhm 1
4. Load Cell 3kg 1
5. Modul HX711 1
6 LCD 16×2 1
7. Pushbutton 4
8. Resistor 630Ohm 1
9. Wire

Platform timbangan menggukan bahan tripleks tipis (tebal 0.3mm) dengan dimensi 10cm×10cm sedangkan base alat yang menopang timbangan dan rangkaian dibuat dari tripleks tebal (tebal 0.9mm) dengan dimensi 30cm×30cm. Digunakan pula sejumlah baut, mur dan paku untuk menyusun tripleks dan load cell. Truk dan jalur truk dibuat menggunakan dupleks. Hasil implementasi hardware dapat dilihat di Gambar 2.1.1 di bawah.

Gambar 2.1.1 Implementasi Hardware

Skematik

Skematik rangkaian dapat diamati pada Gambar 2.2.1 di bawah. Power supply arduino diperoleh dari sambungan USB ke PC. Rangkaian memanfaatkan 15 pin arduino yaitu pin 5V dan GND, dua pin C, kedelapan pin D dan tiga pin B. Seluruh Vcc dan GND tiap-tiap komponen disupply dan dihubungkan ke 5V dan GND arduino.

Kedua pin C terhubung ke modul penguat HX711 yaitu PC0 ke DT dan PC1 ke SCK.

LCD 16×2 menggunakan tujuh pin selain Vcc dan GND yaitu PD4..7 dan PD0..2.

PD0..3 digunakan untuk input pushbutton sw1..4.

Gambar 2.2.1 Skematik

Implementasi Software

Flowchart

Gambar 3.1.1 (kiri) Flowchart Sistem (kanan) Ekspansi Flowchart bagian loop

Kedua gambar di atas menampilkan alur program dari awal secara ringkas. Terdapat beberapa bagian yang perlu dijelaskan lebih lanjut yaitu inisialisasi dan tampilan awal, fungsi calibrate(), pembacaan dan penampilan beban, dan pembacaan/penghitungan beban truk dan muatan.

Secara umum dapat diketahui pada awalnya program melakukan inisialisasi dan kalibrasi. Selanjutnya masuk ke bagian loop, program membaca dan menampilkan beban di timbangan lalu bertindak sesuai pushbutton yang dipencet seperti yang telah dijelaskan di subbab mengenai state chart.

Penjelasan Kode

Source Code
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

#define DOUT_PORT    PORTC    // Serial Data Output Port
#define DOUT_DDR    DDRC    // Serial Data Output DDR
#define DOUT_INPUT    PINC    // Serial Data Output Input
#define DOUT_PIN    PC0        // Serial Data Output Pin
#define DOUT_READ    (DOUT_INPUT & (1<<DOUT_PIN))    // Serial Data Output Read Pin

#define PD_SCK_PORT    PORTC    // Power Down and Serial Clock Input Port
#define PD_SCK_DDR    DDRC    // Power Down and Serial Clock DDR
#define PD_SCK_PIN    PC1        // Power Down and Serial Clock Pin

#define SW_PORT        PORTD
#define SW_DDR        DDRD
#define SW_INPUT    PIND
#define SW1_PIN        PD0
#define SW2_PIN        PD1
#define SW3_PIN        PD2
#define SW4_PIN        PD3
#define SW1_READ    (SW_INPUT & (1<<SW1_PIN))
#define SW2_READ    (SW_INPUT & (1<<SW2_PIN))
#define SW3_READ    (SW_INPUT & (1<<SW3_PIN))
#define SW4_READ    (SW_INPUT & (1<<SW4_PIN))

long count = 0;
long sample = 0;
float val = 0;

int tr_mt = 0;
int tr = 0;
int mt = 0;

char buffer[10];

unsigned long readCount(void)
{
    unsigned long Count;
    unsigned char i;
    
    PD_SCK_PORT &= ~(1<<PD_SCK_PIN);
    _delay_us(1);
    
    Count = 0;
    while(DOUT_READ);//(digitalRead(DT));
    for (i=0;i<24;i++){
        PD_SCK_PORT |= (1<<PD_SCK_PIN);
        _delay_us(1);
        Count = Count<<1;
        PD_SCK_PORT &= ~(1<<PD_SCK_PIN);
        _delay_us(1);
        if(DOUT_READ)//(digitalRead(DT));
            Count++;
    }
    PD_SCK_PORT |= (1<<PD_SCK_PIN);
    _delay_us(1);
    PD_SCK_PORT &= ~(1<<PD_SCK_PIN);
    _delay_us(1);
    Count = Count^0x800000;
    return(Count);
}

void calibrate()
{
    int j = 0;
    lcd_clrscr();
    lcd_puts("Masuk Kalibrasi");
    for(int i=0;i<100;i++){
        count = readCount();
        sample += count;
        lcd_gotoxy(0,1);
        if((i+1)%6 == 0){
            lcd_gotoxy(j,1);
            lcd_putc('=');
            j++;
        }
    }
    sample /= 100;
    lcd_clrscr();
    lcd_puts("Taruh beban");
    lcd_gotoxy(0,1);
    lcd_puts("acuan");
    count = 0;
    while(count<1000){
        count = readCount();
        count = sample-count;
    }
    _delay_ms(2000);
    lcd_clrscr();
    lcd_puts("Kalibrasi Tunggu");
    j = 0;
    for(int i=0;i<100;i++){
        count = readCount();
        val += sample-count;
        lcd_gotoxy(0,1);
        if((i+1)%6 == 0){
            lcd_gotoxy(j,1);
            lcd_putc('#');
            j++;
        }
    }
    val = val/100.0;
    val = val/199.5; // massa untuk kalibrasi (dalam gram)
    lcd_clrscr();
}

int main()
{
    int berat;
    PD_SCK_DDR |= (1<<PD_SCK_PIN);
    PD_SCK_PORT &= ~(1<<PD_SCK_PIN);
    DOUT_DDR &= ~(1<<DOUT_PIN);
    DOUT_PORT |= (1<<DOUT_PIN);
    
    SW_DDR &= ~(1<<SW1_PIN);
    SW_PORT |= (1<<SW1_PIN);
    SW_DDR &= ~(1<<SW2_PIN);
    SW_PORT |= (1<<SW2_PIN);
    SW_DDR &= ~(1<<SW3_PIN);
    SW_PORT |= (1<<SW3_PIN);
    SW_DDR &= ~(1<<SW4_PIN);
    SW_PORT |= (1<<SW4_PIN);
    
    lcd_init(LCD_DISP_ON);
    lcd_clrscr();
    lcd_home();
    lcd_puts("Sistem Pengukur");
    lcd_gotoxy(0,1);
    lcd_puts("Berat Muatan");
    _delay_ms(5000);
    calibrate();
    while(1)
    {
        count = readCount();
        berat = (sample-count)/val;
        lcd_clrscr();
        lcd_home();
        lcd_puts("Berat:");
        lcd_gotoxy(0,1);
        sprintf(buffer, "%i", berat);
        lcd_puts(buffer);
        lcd_puts(" g");
        _delay_ms(1000);
        if(!SW1_READ){
            tr_mt = berat;
            lcd_clrscr();
            lcd_home();
            lcd_puts("Truk + Muatan:");
            lcd_gotoxy(0,1);
            sprintf(buffer, "%i", tr_mt);
            lcd_puts(buffer);
            lcd_puts(" g");
            _delay_ms(2000);
        }
        if(!SW2_READ){
            tr = berat;
            lcd_clrscr();
            lcd_home();
            lcd_puts("Truk:");
            lcd_gotoxy(0,1);
            sprintf(buffer, "%i", tr);
            lcd_puts(buffer);
            lcd_puts(" g");
            _delay_ms(2000);
        }
        if(!SW3_READ){
            mt = tr_mt - tr;
            lcd_clrscr();
            lcd_home();
            lcd_puts("Muatan:");
            lcd_gotoxy(0,1);
            sprintf(buffer, "%i", mt);
            lcd_puts(buffer);
            lcd_puts(" g");
            _delay_ms(5000);
        }
        if(!SW4_READ) //untukk kalibrasi
        {
            count = 0;
            sample = 0;
            val = 0;
            berat = 0;
            calibrate();
        }
    }
    return(0);
}
  1. Inisialisasi dan Tampilan Awal

Inisialisasi dan tampilan awal terdiri atas inisialisasi pin modul HX711, inisialisasi keempat pushbutton (sw1..4), inisialisasi LCD dan tampilan awal masuk sistem. Mode pin diset dengan mengatur nilai DDR menjadi 1 untuk output dan 0 untuk input. Resistor pullup diaktifkan untuk setiap pin input.

Inisialisasi pin modul HX711 mencakup pengesetan pin untuk SCK sebagai output dan pin untuk DT sebagai input. Mikrokontroller akan mengirimkan sinyal clock melalui pin SCK ke HX711. Sinyal clock ini menentukan bit data dan gain yang diberikan oleh HX711 melalui pin DT.

Setelah inisiasi pushbutton, inisiasi LCD dilakukan dengan fungsi lcd_init(LCD_DISP_ON). Kami menggunakan library LCD HD44780U oleh Peter Fleury. Tulisan untuk tampilan awal adalah ”Sistem Pengukur” ”Berat Muatan” yang tampil selama lima detik.

Selanjutnya sistem masuk ke fungsi calibrate().

  1. Fungsi calibrate()

Fungsi calibrate() adalah fungsi yang melakukan kalibrasi dengan memproses variabel sample dan val.

Masuk ke fungsi ini, sistem membaca keluaran HX711 seratus kali saat timbangan tidak diberi beban dan menyimpan nilai rata-ratanya di variabel sample. Kemudian sistem membaca keluaran HX711 saat diberi beban acuan kemudian menguranginya dengan variabel sample lalu menyimpannya di variabel val. Variabel val selanjutnya dibagi 100 dan dibagi lagi dengan nilai berat acuan dalam gram untuk kemudian digunakan menkonversi keluaran HX711 ke gram.

Variabel sample dapat dikatakan merupakan keluaran HX711 tanpa beban atau beban platform timbangan. Variabel val merupakan faktor konversi keluaran HX711 ke gram. Kedua variabel ini berguna untuk membaca dan menampilkan nilai beban.

Fungsi ini dapat dipanggil ketika sistem sedang berjalan dengan memencet tombol sw4 sehingga kalibrasi ulang dapat dilakukan tanpa perlu mereset mikrokontroller. Hal ini dilakukan dengan oleh conditional statement keempat dalam bagian loop program utama. Masuk ke rekalibrasi seluruh variabel count, sample, val dan berat direset menjadi nol untuk dihitung kembali.

  1. Membaca dan Menampilkan Beban

Pembacaan beban dilakukan dengan mengeksekusi fungsi readCount() dan menyimpan nilai keluarannya ke variabel count. Nilai beban kemudian dihitung dengan memperoleh selisih variabel count (nilai beban keluaran HX711) dengan sample (nilai platform timbangan keluaran HX711) lalu membaginya dengan faktor konversi val sehingga diperoleh nilai beban dalam gram.

Fungsi readCount() bekerja sesuai referensi pada datasheet HX711. Pertama dikirimkan sinyal digital LOW ke SCK HX711. Selanjutnya sistem menunggu keluaran DT HIGH yang artinya modul siap menerima data. Kemudian selama duapuluh empat kali sistem mengirimkan sinyal HIGH lalu LOW ke pin SCK dan menggeser nilai variabel Count sebanyak satu bit ke kiri lalu menambahkannya dengan 1 untuk tiap nilai DT HIGH. Lalu sinyal HIGH dan LOW yang ke-25 dikirimkan ke pin SCK dan Variabel Count di-XOR-kan dengan 0x800000 untuk memperoleh hasil akhir Count.

Nilai beban ditampilkan dengan terlebih dulu mengubah nilai integer ke char dengan fungsi sprintf(buffer, “%i”, berat). Buffer adalah matriks char berlebar 10. Setelah diubah, nilai ditampilkan dengan fungsi lcd_puts(buffer) seperti halnya char atau string biasa. Konversi dari integer ke char perlu dilakukan karena library LCD 16×2 yang kami gunakan tidak memiliki fungsi yang langsung menampilkan integer.

  1. Beban Truk dan Muatan

Untuk memperoleh beban muatan pertama dilakukan pembacaan dan penyimpanan nilai beban truk dengan muatan dan beban truk tanpa muatan. Tiga proses yang terpisah: untuk membaca beban truk dengan muatan, untuk membaca beban truk tanpa muatan dan untuk menghitung beban muatan ditulis dalam tiga conditional statement yang berbeda. Masing-masing conditional statement dikaitkan ke pembacaan switch 1, switch 2 dan switch 3.

Pembacaan beban dilakukan seperti biasa dengan beban disimpan ke variabel tr_mt untuk beban truk dan muatan, variabel tr untuk beban truk dan variabel mt untuk beban muatan. Beban muatan dihitung dengan mengurangi variabel tr_mt dengan variabel mt.

Pengujian

Pengujian dilakukan dengan menimbang secara berturut-turut berat truk atau kontainer (sebuah kotak tanpa atap), beban acuan untuk kalibrasi, beban truk dengan muatan dan beban muatan. Hasil pengukuran menggunakan sistem yang telah dibuat dibandingkan dengan hasil pengukuran menggunakan timbangan referensi di laboratorium fisika dasar.

Tabel 4.1.1 Perbandingan Hasil Pengukuran Berat Beban

No. Nama Beban Berat (g)
Referensi
Berat (g)
Sistem
1 Truk dengan muatan 425 425
2 Truk 27 27
3 Muatan 398 398
4 Beban Acuan 199.5 199

Nilai beban muatan betul merupakan selisih dari beban “truk dengan muatan” dan beban truk (398 = 425 – 27). Sistem hanya mampu menampilkan keluaran dalam gram

Foto-Foto Hasil Pengujian


Truk dengan muatan


Truk tanpa muatan


Muatan


Beban Acuan

Kesimpulan

Implementasi sistem model pengukur berat muatan berhasil dilakukan menggunakan load cell 3kg.

Sistem tersusun atas empat blok utama yaitu display, input pushbutton, timbangan dan mikrokontroller.

Display menggunakan LCD 16×2, terdapat empat buah pushbutton untuk mengubah state sistem, mikrokontroller menggunakan Arduino UNO dengan power supply dari bus USB, dan timbangan tersusun atas load cell 3kg dan modul HX711.

Terdapat enam state sistem: state awal (inisiasi dan kalibrasi), state masuk ke loop (mengukur dan menampilkan berat beban di timbangan), state mengukur dan menampilkan berat truk dengan muatan, state mengukur dan menampilkan berat truk tanpa muatan, state menghitung dan menampilkan berat muatan, dan state kalibrasi ulang.

Pengujian memberikan hasil pengukuran berat oleh sistem sama seperti hasil pengukuran berat menggunakan timbangan referensi laboratorium fisika dasar.

Video

Daftar Pustaka

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.