Kalkulator online persamaan garis lurus antara dua titik

Menghitung persamaan garis linear dengan rumus :

masukkan nilai (x1, y1), (x2, y2) dan nilai x jika ingin mencari nilai y pada titik x tersebut pada kotak berikut :

x1 =
y1 =
x2 =
y2 =
Persamaan garis lurus
Gradien m =
.
Konstanta c =
cari nilai y dengan x =
hasil
y =

 

Persamaan garis lurus adalah garis dalam bentuk matematis berpangkat satu. Persamaan umumnya adalah :

y = mx + c

dimana m = gradien dan c = konstanta.

Gradien adalah kemiringan dari suatu garis dan konstanta adalah ketinggian garis pada x = 0.

Konversi sistem bilangan biner ke BCD

Bilangan biner adalah angka berbasis 2 yang hanya memiliki numerik ‘0’ dan ‘1’. Dalam ilmu komputer satu numerik bilangan biner disebut “bit”, apabila bilangan ini dikelompokkan kedalam 8 bit disebut dengan byte, Satu byte bisa menyimpan kombinasi hingga 2^8 atau 256 kombinasi.

Dalam ilmu komputer juga dikenal bilangan hex (hexadesimal) yaitu angka berbasis 16 dengan numerik 0-9 dan A-F, bilangan ini merepresentasikan 4-bit bilangan biner (binary number).

Bilangan biner atau bilangan hex juga bilangan byte umum digunakan dalam perhitungan digital dan komputer, namun bilangan ini sulit dicerna oleh manusia yang menggunakan bilangan desimal (basis 10),

Bilangan BCD (binary coded decimal) adalah bilangan hex dalam bentuk desimal yang lebih familier dan bisa terbaca oleh manusia dalam bentuk desimal.

byte 8-bit binary ke BCD

//max hex 0x63 / bcd 0x99
uint8_t Convert_IntToBCD(uint8_t DecimalValue)
{
	return DecimalValue + 6 * (DecimalValue / 10);
}

atau

//max hex 0x63 / bcd 0x99
uint8_t Convert_IntToBCD(uint8_t DecimalValue)
{
	uint8_t MSB = 0;
	uint8_t LSB = DecimalValue;

	while (LSB >= 10)
	{
		LSB -= 10;
		MSB += 0x10;
	}
	return MSB + LSB;
}

word 16-bit binary ke BCD

//max hex 0x270F / bcd 0x9999
uint16_t Convert_IntToBCD16(uint16_t DecimalValue)
{
	uint16_t returnValue = 0;
	//uint16_t LSB_L = DecimalValue;

	while (DecimalValue >= 1000)
	{
		DecimalValue -= 1000;
		returnValue += 0x1000;
	}
	while (DecimalValue >= 100)
	{
		DecimalValue -= 100;
		returnValue += 0x0100;
	}
	while (DecimalValue >= 10)
	{
		DecimalValue -= 10;
		returnValue += 0x0010;
	}
	return returnValue + DecimalValue;
}

integer 32-bit binary ke BCD

//max hex 0x5F5E0FF / bcd 0x99999999
uint32_t Convert_IntToBCD32(uint32_t DecimalValue)
{
	uint32_t returnValue = 0;
	//uint32_t LSB_L = DecimalValue;

	while (DecimalValue >= 10000000L)
	{
		DecimalValue -= 10000000L;
		returnValue += 0x10000000;
	}
	while (DecimalValue >= 1000000L)
	{
		DecimalValue -= 1000000L;
		returnValue += 0x01000000;
	}
	while (DecimalValue >= 100000L)
	{
		DecimalValue -= 100000L;
		returnValue += 0x00100000;
	}
	while (DecimalValue >= 10000)
	{
		DecimalValue -= 10000;
		returnValue += 0x00010000;
	}
	while (DecimalValue >= 1000L)
	{
		DecimalValue -= 1000L;
		returnValue += 0x00001000;
	}
	while (DecimalValue >= 100)
	{
		DecimalValue -= 100;
		returnValue += 0x00000100;
	}
	while (DecimalValue >= 10)
	{
		DecimalValue -= 10;
		returnValue += 0x00000010;
	}
	return returnValue + DecimalValue;
}

Perhitungan regresi linear menggunakan arduino

Statistik regresi linear berfungsi mencari nilai trend suatu variabel terhadap pengaruh variabel lainnya. Fungsi regresi linear berupa persamaan grafis yang menyatakan perbedaan nilai dalam rentang/interval tertentu sehingga bisa dianalisis sebagai akibat dari perbedaan variabel input (variabel masukan/ variabel bebas/independen).

Jika diketahui variabel X1..Xn yang mempengaruhi variabel Y1..Yn maka persamaan regresi linear umum/sederhana adalah:

dimana m adalah gradien (kemiringan) dan b adalah konstanta.

source code regresi linear arduino:

struct sample
{
  byte waktu;
  float data;
};

void setup() {
  Serial.begin(9600);
  Serial.println("Statistik regresi linear dengan Arduino");
  Serial.println("https://www.semesin.com/project/");
  Serial.println();
}

void loop() {
  sample Pengukuran[] = {
    {1, 21.2},
    {2, 28.5},
    {3, 42.3},
    {4, 53.9},
    {5, 57.1},
    {6, 70.2},
    {7, 79.9},
    {8, 89.2},
    {9, 101.6},
    {10, 112.4},
  };

  float m;
  float b;

  regresiLinear(Pengukuran, 10, &m, &b);

  Serial.print("m = ");
  Serial.println(m);
  Serial.print("b = ");
  Serial.println(b);
  Serial.print("Prediksi waktu ke-11 = ");
  Serial.println(m * 11 + b);

  while (1);
}

void regresiLinear(sample *sampling, byte jumlahSampling, float *m, float *b)
{
  byte jumlahWaktu = 0;
  float jumlahData = 0.0;
  uint32_t jumlahDataWaktu = 0;
  uint32_t jumlahWaktu2 = 0;
  float jumlahData2 = 0.0;
  for (byte i = 0; i < jumlahSampling; i++)
  {
    jumlahWaktu += sampling[i].waktu;
    jumlahData += sampling[i].data;
    jumlahDataWaktu += (sampling[i].waktu * sampling[i].data);
    jumlahWaktu2 +=  (sampling[i].waktu *  sampling[i].waktu);
    jumlahData2 +=  (sampling[i].data *  sampling[i].data);
  }
  *m = (jumlahSampling * jumlahDataWaktu) - (jumlahWaktu * jumlahData);
  *m /= (jumlahSampling * jumlahWaktu2) - (jumlahWaktu * jumlahWaktu);

  *b = (jumlahWaktu2 * jumlahData) - (jumlahWaktu * jumlahDataWaktu);
  *b /= (jumlahSampling * jumlahWaktu2) - (jumlahWaktu * jumlahWaktu);
}

contoh keluaran serial monitor:

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.semesin.com/project/");
  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;
}

Prediksi Extrapolation dengan Arduino

Ekstrapolasi (Extrapolation) adalah proses matematis untuk memprediksi nilai yang akan datang berdasarkan keterkaitan matematis dari nilai-nilai sebelumnya.

Dalam contoh ini akan diprediksi nilai sinus 60° dari deret sinusional sin-0, 10, 20, 30, 40, 50. Pendekatan yang digunakan adalah linear dan polynomial (quadratic, cubic, quartic dan quintic), menggunakan operasi matrik. Formula matematis ini dikerjakan dengan bantuan arduino Uno.

dan hasilnya adalah:

  • Seharusnya (sinus(60) * 1000) = 866.02
  • Linear Extrapolation = 889.34
  • Polynomial Extrapolation (quadratic)= 869.84
  • Polynomial Extrapolation (cubic) = 865.54
  • Polynomial Extrapolation (quartic) = 904.61
  • Polynomial Extrapolation (quintic) = 866.39

Berikut sketch/koding ekstra polasi arduino:

Link download library MatrixMath

#include <MatrixMath.h>

float dataSinus[] = {0.0, 173.64, 342.02, 500.00, 642.78, 766.06};// -- 866.02

void setup() {
  Serial.begin(9600);
  Serial.println("Prediksi Extrapolation dengan Arduino");
  Serial.println("https://www.semesin.com/project/");
  Serial.println();

  byte indexTerakhir = sizeof(dataSinus) / sizeof(float) - 1;

  Serial.print("Seharusnya (sinus(60) * 1000) = ");
  Serial.println(866.02);

  float prediksi;
  prediksi = linearExtrapolation(dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1]);
  Serial.print("Linear Extrapolation = ");
  Serial.println(prediksi);
  
  prediksi = polynomialExtrapolationQuadratic(dataSinus[indexTerakhir], dataSinus[indexTerakhir - 1], dataSinus[indexTerakhir - 2]);
  Serial.print("Polynomial Extrapolation (quadratic)= ");
  Serial.println(prediksi);

  prediksi = polynomialExtrapolationCubic(
    dataSinus[indexTerakhir], 
    dataSinus[indexTerakhir - 1], 
    dataSinus[indexTerakhir - 2], 
    dataSinus[indexTerakhir - 3]);
  Serial.print("Polynomial Extrapolation (cubic) = ");
  Serial.println(prediksi);

  prediksi = polynomialExtrapolationQuartic(
    dataSinus[indexTerakhir], 
    dataSinus[indexTerakhir - 1], 
    dataSinus[indexTerakhir - 2], 
    dataSinus[indexTerakhir - 3], 
    dataSinus[indexTerakhir - 4]);
  Serial.print("Polynomial Extrapolation (quartic) = ");
  Serial.println(prediksi);

  prediksi = polynomialExtrapolationQuintic(
    dataSinus[indexTerakhir], 
    dataSinus[indexTerakhir - 1], 
    dataSinus[indexTerakhir - 2], 
    dataSinus[indexTerakhir - 3], 
    dataSinus[indexTerakhir - 4], 
    dataSinus[indexTerakhir - 5]);
  Serial.print("Polynomial Extrapolation (quintic) = ");
  Serial.println(prediksi);

  while (1);
}

void loop() {

}

float linearExtrapolation(float dataN, float dataNminus1)
{
  return dataNminus1 + (2 * (dataN - dataNminus1));
}
float polynomialExtrapolationQuadratic(float dataN, float dataNminus1, float dataNminus2)
{
  float A[3][3] = {{1.0, 0.0, 0.0},
    {1.0, 1.0, 1.0},
    {1.0, 2.0, 4.0}
  };
  float B[3] = {dataNminus2, dataNminus1, dataN};
  float C[3];

  Matrix.Invert((float*)A, 3);
  Matrix.Multiply((float*)A, (float*)B, 3, 3, 1, (float*)C);

  return(C[0] + (C[1] * 3.0) + (C[2] * 9.0));
}

float polynomialExtrapolationCubic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3)
{
  float A[4][4] = {
    {1.0, 0.0, 0.0, 0.0},
    {1.0, 1.0, 1.0, 1.0},
    {1.0, 2.0, 4.0, 8.0},
    {1.0, 3.0, 9.0, 27.0}
  };
  float B[4] = {dataNminus3, dataNminus2, dataNminus1, dataN};
  float C[4];

  Matrix.Invert((float*)A, 4);
  Matrix.Multiply((float*)A, (float*)B, 4, 4, 1, (float*)C);

  return(C[0] + (C[1] * 4.0) + (C[2] * 16.0) + (C[3] * 64.0));
}

float polynomialExtrapolationQuartic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3, float dataNminus4)
{
  float A[5][5] = {
    {1.0, 0.0, 0.0, 0.0, 0.0},
    {1.0, 1.0, 1.0, 1.0, 1.0},
    {1.0, 2.0, 4.0, 8.0, 16.0},
    {1.0, 3.0, 9.0, 27.0, 81.0},
    {1.0, 4.0, 8.0, 64.0, 256.0}
  };
  float B[5] = {dataNminus4, dataNminus3, dataNminus2, dataNminus1, dataN};
  float C[5];

  Matrix.Invert((float*)A, 5);
  Matrix.Multiply((float*)A, (float*)B, 5, 5, 1, (float*)C);

  return(C[0] + (C[1] * 5.0) + (C[2] * 25.0) + (C[3] * 125.0) + (C[4] * 625.0));
}

float polynomialExtrapolationQuintic(float dataN, float dataNminus1, float dataNminus2, float dataNminus3, float dataNminus4, float dataNminus5)
{
  float A[6][6] = {
    {1.0, 0.0, 0.0, 0.0, 0.0, 0.0},
    {1.0, 1.0, 1.0, 1.0, 1.0, 1.0},
    {1.0, 2.0, 4.0, 8.0, 16.0, 32.0},
    {1.0, 3.0, 9.0, 27.0, 81.0, 243.0},
    {1.0, 4.0, 8.0, 64.0, 256.0, 1024.0},
    {1.0, 5.0, 25.0, 125.0, 625.0, 3125.0}
  };
  float B[6] = {dataNminus5, dataNminus4, dataNminus3, dataNminus2, dataNminus1, dataN};
  float C[6];

  Matrix.Invert((float*)A, 6);
  Matrix.Multiply((float*)A, (float*)B, 6, 6, 1, (float*)C);

  return(C[0] + (C[1] * 6.0) + (C[2] * 36.0) + (C[3] * 216.0) + (C[4] * 1296.0) + (C[5] * 7776.0));
}

hasil Serial monitor:

Linear-feedback shift register (LFSR) dengan arduino

LFSR (linear-feedback shift register) adalah metode matematis untuk menghasilkan sebuah bilangan yang linear dengan bilangan sebelumnya.

Fungsi matematis ini digunakan sebagai:

  1. menghasilkan bilangan acak (random generator)
  2. Menghasilkan bilangan tersusun yang berulang sehingga bisa dimanfaatkan sebagai pembangkit suara gangguan (noise) seperti di tv/radio dengan siaran acak ketika tidak siaran.

sketch/program arduino LFSR:

metode Fibonacci

uint16_t LFSRBuffer;

void setup() {
  Serial.begin(9600);
  Serial.println("LFSR metode Fibonacci");
  Serial.println("https://www.semesin.com/project");
  
  uint16_t nilaiAwal = analogRead(0);
  LFSRFibonacci(nilaiAwal);
  //LFSRFibonacci(100);
}

void loop() {
  uint16_t bilanganLFSR = LFSRFibonacci();
  Serial.println(bilanganLFSR);

  delay(1000);
}

void LFSRFibonacci(uint16_t nilaiAwal)
{
  LFSRBuffer = nilaiAwal;
}

uint16_t LFSRFibonacci()
{
    uint16_t bit;
    
    bit  = ((LFSRBuffer >> 0) ^ (LFSRBuffer >> 2) ^ (LFSRBuffer >> 3) ^ (LFSRBuffer >> 5)) & 1;
    LFSRBuffer =  (LFSRBuffer >> 1) | (bit << 15);
    return LFSRBuffer;
}

metode Galois

uint16_t LFSRBuffer;

void setup() {
  Serial.begin(9600);
  Serial.println("LFSR metode Galois");
  Serial.println("https://www.semesin.com/project");
  
  uint16_t nilaiAwal = analogRead(0);
  LFSRGalois(nilaiAwal);
  //LFSRGalois(100);
}

void loop() {
  uint16_t bilanganLFSR = LFSRGalois();
  Serial.println(bilanganLFSR);

  delay(1000);
}

void LFSRGalois(uint16_t nilaiAwal)
{
  LFSRBuffer = nilaiAwal;
}

uint16_t LFSRGalois()
{
    unsigned lsb = LFSRBuffer & 1;
    LFSRBuffer >>= 1;
    if (lsb)
    {
        LFSRBuffer ^= 0xB400;
    }
    return LFSRBuffer;
}