Statistik nilai mean, median dan modus menggunakan arduino

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

11 thoughts on “Statistik nilai mean, median dan modus menggunakan arduino

  1. Gan mau nanya..
    Gmna pmbcaan sensor ketika sudah pada pmbcaan 100 pertama.. maka sensor otomatis berhenti lalu utk mereset pakai bttn ?

    1. 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));

  2. 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 ??

  3. 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

    1. 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

  4. 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

Leave a Reply

Your email address will not be published. Required fields are marked *