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);
}