Penggunaan timbangan secara umum membutuhkan akurasi dan presisi. Dalam skala lebih luas sebaiknya unit timbangan juga informatif sehingga dapat diketahui hasilnya secara luas. Untuk keperluan ini, unit timbangan harus memiliki sarana display yang memadai seperti menggunakan display dot mattrix, seven segment dan sebagainya.
Fitur timbangan
Fitur/fasilitas timbangan bisa bermacam sesuai kebutuhan. Dalam perancangan timbangan 7-segment ini memasukkan fitur-fitur penting diantaranya :
-
- Kalibrasi
Kalibrasi adalah kegiatan untuk memastikan timbangan memiliki akurasi dan presisi yang baik. dalam perancangan ini prosedur kalibrasinya sebagai berikut:
-
- Posisi perangkat timbangan dalam keadaan mati
- Letakkan beban tera 1Kg
- Tekan dan tahan tombol [hold]
- Hidupkan perangkat timbangan (akan muncul tulisan ‘load 1’ di tampilan seven segment)
- lepas tombol [hold]
- Tunggu hingga muncul tulisan ‘load 2’ di 7-segment
- Letakkan beban tera 2.5 Kg
- Tekan dan lepas tombol [hold]
- Tunggu hingga muncul tulisan ‘siap’ didisplay 7-segment
- Kalibrasi selesai
- tombol tare
- tombol hold
- Tampilan seven segment
Seven Segmen
Seven segment memiliki kelebihan dari display lainnya, diantaranya :
- Intensitas cahaya lebih terang (akan berkurang jika menggunakan sistem scanning)
- Mudah terbaca dari jarak jauh (lebih jelas)
- Jika menggunakan mikrokontroler, lebih sedikit menggunakan resources (memory dan waktu proses)
- Menggunakan komponen lebih sedikit (non module)
- Perbandingan cahaya vs daya terpakai lebih sedikit sehingga lebih hemat.
Dalam proyek timbangan informatif dengan display 7-segment berbasis arduino ini menggunakan komponen sebagai berikut:
Komponen yang digunakan dalam perancangan timbangan sevent segment menggunakan arduino:
- Arduino uno
- modul hx711 dan loadcell 5Kg
- IC uln2003
- 5x 7-Segment CC
- 2x Tombol
Skema timbangan tampilan seven segmen:
source code/program arduino timbangan seven segment:
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 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 | #include "HX711.h" #include <TimerOne.h> #include <EEPROM.h> #define CCorCA 1//0 = CC, 1 = CA (rangkaian dengan resistor) #define tareSaatMulai 1 #define beratKalibrasi1Tera 1.0f //Kg #define beratKalibrasi2Tera 1.00f //Kg #define beratMaksimal 2.50 //Kg #define jumlahSampling 5 //kali #define frekuensiUpdateData 20 //kali per detik //pin HX711 scale(3, 2); // (DT, SCK) #define pin1 A0 #define pin2 A1 #define pin3 A2 #define pin4 A3 #define pin5 A4 #define pinA 4 #define pinB 5 #define pinC 6 #define pinD 7 #define pinE 8 #define pinF 9 #define pinG 10 #define pinDot 11 #define pinTare 12 #define pinHold 13 #define dotBlank 6 #define dotAll 5 byte pin7Segment[] = {pinA, pinB, pinC, pinD, pinE, pinF, pinG}; byte pin7SegmentCommon[] = {pin1, pin2, pin3, pin4, pin5}; byte posisiTitik = dotBlank; const char angka[] = { 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111100, 0b00000111, 0b01111111, 0b01100111, 0b00000000, //blank 0b01000000, //strip 0b00111000, //L 0b01011100, //o 0b01011111, //a 0b01011110, //d 0b01101101, //S 0b00000100, //i 0b01110011, //p }; #define Seg_blank 10 #define Seg_stip 11 #define Seg_L 12 #define Seg_o 13 #define Seg_a 14 #define Seg_d 15 #define Seg_S 16 #define Seg_i 17 #define Seg_p 18 //volatile uint32_t beratBCD = 0; volatile uint8_t beratBCD[5]; volatile byte lastScanIndex = 0; volatile byte index7Segment = 0; long lastMillis; long kirimDataMillis; byte modeKalibrasi = 0; long beratKalibrasi1; long beratKalibrasi2; float beratTerukur; bool tahanNilai = false ; byte timbangBeratCounter = 0; #define alamatKalibrasiM 0 #define alamatKalibrasiC 4 void setup() { Serial.begin(9600); Serial.println(F( "Timbangan tampilan seven segment menggunakan arduino" )); pinMode(pin1, OUTPUT); pinMode(pin2, OUTPUT); pinMode(pin3, OUTPUT); pinMode(pin4, OUTPUT); pinMode(pin5, OUTPUT); pinMode(pinA, OUTPUT); pinMode(pinB, OUTPUT); pinMode(pinC, OUTPUT); pinMode(pinD, OUTPUT); pinMode(pinE, OUTPUT); pinMode(pinF, OUTPUT); pinMode(pinG, OUTPUT); pinMode(pinDot, OUTPUT); pinMode(pinTare, INPUT_PULLUP); pinMode(pinHold, INPUT_PULLUP); Timer1.initialize(2000); Timer1.attachInterrupt( timerIsr ); float m,c; scale.power_up(); //Mode kalibrasi if (!digitalRead(pinHold)) { delay(50); if (!digitalRead(pinHold)) { beratBCD[4] = Seg_L; beratBCD[3] = Seg_o; beratBCD[2] = Seg_a; beratBCD[1] = Seg_d; beratBCD[0] = 1; while (!digitalRead(pinHold)) //lepas { while (!digitalRead(pinHold)) { delay(50); } } delay(1000); beratKalibrasi1 = scale.read_average(10); beratBCD[0] = 2; while (digitalRead(pinHold)) //tekan { while (digitalRead(pinHold)) { delay(50); } } delay(1000); beratKalibrasi2 = scale.read_average(10); m = 1.0 * (beratKalibrasi2 - beratKalibrasi1) / ( beratKalibrasi2Tera - beratKalibrasi1Tera); c = beratKalibrasi2 - (1.0 * m * beratKalibrasi2Tera); EEPROM.put(alamatKalibrasiM, m); EEPROM.put(alamatKalibrasiC, c); beratBCD[4] = Seg_S; beratBCD[3] = Seg_i; beratBCD[2] = Seg_a; beratBCD[1] = Seg_p; beratBCD[0] = Seg_blank; delay(500); } } EEPROM.get(alamatKalibrasiM, m); EEPROM.get(alamatKalibrasiC, c); scale.set_scale(m); scale.set_offset(c); #if tareSaatMulai scale.tare(); #endif scale.power_down(); lastMillis = millis(); kirimDataMillis = millis(); } void loop() { if (!tahanNilai) { if (millis() - lastMillis > 10) { scale.power_up(); delay(10); beratTerukur += scale.get_units(1); if (timbangBeratCounter++ == jumlahSampling) { beratTerukur = beratTerukur * 100 / jumlahSampling; if (beratTerukur < 0) { beratBCD[0] = 0; beratBCD[1] = 0; beratBCD[2] = 0; beratBCD[3] = Seg_stip; beratBCD[4] = Seg_blank; posisiTitik = 2; } else if (beratTerukur <= (beratMaksimal*100)) { uint32_t BCD = Convert_IntToBCD32(beratTerukur); if ((BCD & 0x0F) <= 5) { beratBCD[0] = 0; } else { beratBCD[0] = 5; } beratBCD[1] = (BCD >> 4) & 0x0F; beratBCD[2] = (BCD >> 8) & 0x0F; beratBCD[3] = (BCD >> 12) & 0x0F; beratBCD[4] = (BCD >> 16) & 0x0F; posisiTitik = 2; } beratTerukur = 0; timbangBeratCounter = 0; } scale.power_down(); lastMillis = millis(); } } //Kirim data setiap 100ms if (millis() - kirimDataMillis > (1000/frekuensiUpdateData)) { if (beratTerukur <= 0) { Serial.println( "0.00" ); } else { Serial.println( floor (beratTerukur)/100, 2); } kirimDataMillis = millis(); } if (!digitalRead(pinTare)) { delay(50); if (!digitalRead(pinTare)) { beratBCD[0] = Seg_blank; beratBCD[1] = Seg_blank; beratBCD[2] = Seg_blank; beratBCD[3] = Seg_blank; beratBCD[4] = Seg_blank; posisiTitik = dotAll; scale.power_up(); delay(10); scale.tare(); scale.power_down(); while (!digitalRead(pinTare)); } } if (!digitalRead(pinHold)) { delay(50); if (!digitalRead(pinHold)) { tahanNilai = !tahanNilai; while (!digitalRead(pinHold)); } } } void timerIsr() { digitalWrite(pin7SegmentCommon[lastScanIndex], CCorCA?LOW:HIGH); drive7Segment(beratBCD[index7Segment]); if (posisiTitik == dotAll) { digitalWrite(pinDot, CCorCA?LOW:HIGH); } else if (posisiTitik == dotBlank) { digitalWrite(pinDot, CCorCA?HIGH:LOW); } else { digitalWrite(pinDot, (index7Segment == posisiTitik)?CCorCA?LOW:HIGH:CCorCA?HIGH:LOW); } digitalWrite(pin7SegmentCommon[index7Segment], CCorCA?HIGH:LOW); lastScanIndex = index7Segment++; if (index7Segment > 4)index7Segment = 0; } void drive7Segment(byte nilai) { byte nilai7Segment = CCorCA?~angka[nilai]:angka[nilai]; for (byte i=0;i< sizeof (pin7Segment);i++) { digitalWrite(pin7Segment[i], nilai7Segment & 0x01); nilai7Segment >>= 1; } } uint32_t Convert_IntToBCD32( uint32_t DecimalValue) { uint32_t returnValue = 0; //uint32_t LSB_L = DecimalValue; while (DecimalValue >= 10000000L) { DecimalValue -= 10000000L; returnValue += 0x10000000; } while (DecimalValue >= 1000000L) { DecimalValue -= 1000000L; returnValue += 0x01000000; } while (DecimalValue >= 100000L) { DecimalValue -= 100000L; returnValue += 0x00100000; } while (DecimalValue >= 10000) { DecimalValue -= 10000; returnValue += 0x00010000; } while (DecimalValue >= 1000L) { DecimalValue -= 1000L; returnValue += 0x00001000; } while (DecimalValue >= 100) { DecimalValue -= 100; returnValue += 0x00000100; } while (DecimalValue >= 10) { DecimalValue -= 10; returnValue += 0x00000010; } return returnValue + DecimalValue; } |
Library yang digunakan dalam perakitan timbangan arduino: