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:
- Arduino Uno
- Loadcell
- HX711
- 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | #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" ); 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:
- Memiliki 2 block differential ADC sehingga bisa dengan gain yang berbeda disesuaikan dengan tingkat presisi yang diinginkan , yang tersedia 32, 64 dan 128.
- Memiliki regulator tegangan sendiri untuk loadcell dan ADC.
- Interface serial yang disederhanakan.
- Frekuensi keluaran dapat diatur 10SPS dan 80sps
- Penyaring/filter riak 50Hz dan 60Hz.
Dengan spesifikasi:
- Tegangan operasional dc 2.6 ~ 5.5v.
- ADC 24 bit yang presisi.
- frekuensi Internal clock 11.0592 MHz.
- Konsumsi arus, 1500uA (normal), 0,5uA (power down).
dokumentasi Galeri timbangan digital presisi
Library : HX711.zip