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 :
#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(F("https://www.project.semesin.com")); 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); }