Sensor-sensor analog dibaca oleh arduino melalui pin analog menggunakan adc. Agar pembacaan adc oleh arduino memiliki presisi yang baik diperlukan perlakuan (treatment) sisi hardware diantaranya:
- Jika impedansi keluaran (output) sensor besar (>10 kΩ) maka perbesar sampling and hold time (s/h) dengan cara mengganti nilai ADCSRA,
- Gunakan tegangan referensi yang sesuai dengan tegangan maksimal keluaran sensor menggunakan perintah analogReference(),
- Gunakan kabel sependek mungkin antara pin output sensor dan pin adc arduino dan terselubung ground,
- Jauhkan kabel dan sensor dari komponen yang bisa menimbulkan interferensi elektromagnetik,
- Jika menggunakan tegangan referensi luar, tambakan dengan filter LC,
- Pin-pin analog yang tidak digunakan sebaiknya tidak dioperasikan saat proses pembacaan sensor.
- Tegangan power supply yang stabil dan terproteksi dari gangguan luar.
Pada sisi software bisa dilakukan peningkatan presisi diataranya menggunakan metode rata-rata seperti Mean, Trimmed Mean, Truncated mean, Winsorizing, Interquartile mean dan sebagainya.
Berikut contoh penggunaan metode Trimmed Mean untuk meningkatkan presisi pembacaan sensor analog :
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 | #define faktorTrim 0.2 //20% #define jumlahSampel 10 #define pinSensor A0 int buffer[jumlahSampel], temp, rataRata; void setup() { Serial.begin(9600); Serial.println(F( "Meningkatkan presisi pembacaan sensor analog dengan metode Trimmed Mean" )); Serial.println(); } void loop() { for ( int i = 0; i < jumlahSampel; i++) { buffer[i] = analogRead(pinSensor); delay(10); } //proses pengurutan (sorting) for ( int i = 0; i < jumlahSampel - 1; i++) { for ( int j = i + 1; j < jumlahSampel; j++) { if (buffer[i] > buffer[j]) { temp = buffer[i]; buffer[i] = buffer[j]; buffer[j] = temp; } } } //rata-rata (trimmed mean) rataRata = 0; for ( int i = jumlahSampel * faktorTrim; i < jumlahSampel * (1 - faktorTrim); i++) { rataRata += buffer[i]; } rataRata /= jumlahSampel * (1- (faktorTrim*2)); Serial.print( "sensor = " ); Serial.println(rataRata); delay(500); } |