Pembacaan nilai analog arduino sering memberikan hasil dengan simpangan dari nilai yang seharusnya. Untuk mengurangi kesalahan ini kita bisa mengambil nilai rata-rata dari beberapa sample. ada beberapa metode untuk mencari nilai pendekatan pembacaan sensor ini yaitu:
Mean (nilai rata-rata)
adalah nilai tengah dari kelompok data yaitu dengan menjumlahkan seluruh data individu dan kemudian membaginya dengan jumlah individu tersebut.
dalam sketch arduino nilai mean dituliskan:
float Sampel[] = {75.2, 82.0, 83.7, 74.4, 80.1, 85.5, 82.0, 80.1}; byte jumlahSampel = sizeof(Sampel) / sizeof(Sampel[0]); float jumlah = 0; for (int i = 0; i < jumlahSampel; i++) { jumlah += Sampel[i]; } float mean = jumlah / jumlahSampel; Serial.print("mean = "); Serial.println(mean);
Median (nilai tengah)
adalah nilai yang letaknya ditengah-tengah dari data yang telah diurutkan dari yang terkecil.
contoh penggunaan median pada arduino:
float Sampel[] = {75.2, 82.0, 83.7, 74.4, 80.1, 85.5, 82.0, 80.1}; byte jumlahSampel = sizeof(Sampel) / sizeof(Sampel[0]); urutkanSampel(Sampel, jumlahSampel); float median = Sampel[(byte)(jumlahSampel / 2)]; if (!(jumlahSampel % 2)) { median += Sampel[(byte)(jumlahSampel / 2) - 1]; median /= 2; } Serial.print("median = "); Serial.println(median);
Modus (Data paling sering)
Adalah data yang paling sering muncul (frekuensi tertinggi) dan tidak ada yang sama dengan frekuensi tersebut.
Contoh penggunaan mean, median dan modus pada arduino:
void setup() { Serial.begin(9600); Serial.println("Mean, media, modus dengan Arduino"); Serial.println("https://www.project.semesin.com/"); Serial.println(); } void loop() { float Sampel[] = {75.2, 82.0, 83.7, 74.4, 80.1, 85.5, 82.0, 80.1}; byte jumlahSampel = sizeof(Sampel) / sizeof(Sampel[0]); float jumlah = 0; for (int i = 0; i < jumlahSampel; i++) { jumlah += Sampel[i]; } float mean = jumlah / jumlahSampel; Serial.print("mean = "); Serial.println(mean); urutkanSampel(Sampel, jumlahSampel); float median = Sampel[(byte)(jumlahSampel / 2)]; if (!(jumlahSampel % 2)) { median += Sampel[(byte)(jumlahSampel / 2) - 1]; median /= 2; } Serial.print("median = "); Serial.println(median); float modus; Serial.print("modus = "); if(cariModus(Sampel, jumlahSampel, &modus)) { Serial.println(modus); } else { Serial.println("tidak ada"); } while (1); } void urutkanSampel(float *dataArray, byte jumlahData) { byte i = 0; for (byte i = 0; i < jumlahData; i++) { byte k; for (byte j = 1; j < jumlahData; j++) { if (dataArray[j - 1] > dataArray[j]) { float temp = dataArray[j - 1]; dataArray[j - 1] = dataArray[j]; dataArray[j] = temp; } } } } bool cariModus(float *dataArray, byte jumlahData, float *modus) { byte frekuensi; float frekuensiData; byte frekuensiMax = 0; byte frekuensiMaxCount = 0; *modus = 0; for (byte i = 0; i < jumlahData; ++i) { frekuensi = 0; for (byte j = 0; j < jumlahData; j++) { if (dataArray[i] == dataArray[j]) { frekuensi++; } } if(frekuensiMax < frekuensi) { frekuensiMax = frekuensi; frekuensiData = dataArray[i]; *modus = dataArray[i]; frekuensiMaxCount = 0; } else if((frekuensiMax == frekuensi) && (frekuensiData != dataArray[i])) { frekuensiMaxCount++; } } if(!frekuensiMaxCount) { return true; } return false; }
Hasilnya ketemu, tapi bingung juga jalannya
gan,, ginama cara menjumlahkan data nilai sensor Arus ACS712 tiap detik atau menit..
menjumlahkan secara otomatis,
Arus merupakan unit pembacaan sesaat dan tidak bisa di jumlahkan dalam satuan waktu
beda dengan energi listrik yang bisa dijumlahkan, satuannya watt-hour
Gan mau nanya..
Gmna pmbcaan sensor ketika sudah pada pmbcaan 100 pertama.. maka sensor otomatis berhenti lalu utk mereset pakai bttn ?
gunakan perintah perulangan ( for / while ) dengan perulangan hingga 100
setelah selesai, tunggu tombol ditekan
contoh :
pinMode(pinReset, INPUT_PULLUP);
for(int i=0;i<100;i++)
{
bacaSensor();
}
//tunggu button reset
while(digitalRead(pinReset));
kak mau tanya. kalau merata-ratakan nya dari data yang kita dapat dari sensor kemudian diserial monitor sudah tertampil hasil rata rata itu koding programnya gimana ??
masukkan data-data itu dalam variabel ‘Sampel’ contohnya
if(Serial.available())
{
Sampel[0] = Serial.parseFloat();
}
Bang gimana buat sampelnya pakek lm35. Jadi lm35 itu mengeluarkan suhu yang berubah ubah. Karna setiap detiknya suhu yang di hasilkan ber ubah ubah jadi akibatnya menghasilkan deret suhu. Jadi aku maunya mendapatkan modus dari 20 deret suhu. Gimana caranya ya bg?
Makasih
gunakan variabel array untuk menyimpan data-data suhu tiap detiknya, contoh:
int Sampel[jumlahSampel];
byte counter = 0;
...
Sampel[counter] = analogRead(pinSensor);
counter++;
counter %= 20;
variabel Sampel sudah bisa di proses lebih lanjut
Bang, mohon bantuannya.
Saya menggunakan 5 sensor dht 11 (A,B,C,D,E).
Pada hari 1-6 pembacaan sensor A (ini udah clear.
Pada hari 7-10 pembacaan sensor A dan B dibuat otomatis secara rata”, gimana ya bang ??
Saya menggunakan blynk.
Terima kasih
float A = dhtA.readTemperature();
float B = dhtB.readTemperature();
float rataRata = (A + B) / 2;
Blynk.virtualWrite(V0, rataRata);