/*
Program     : Percobaan Delta Rule W menggunakan Arduino Mega
DiBuat Oleh : EruP-RMK
Keluaran    : v1.00 / v3.00
Tanggal     : 13 Agustus 2020 - 5 Agustus 2023
Untuk       : Praktikum Kontrol Cerdas 2 POLITEKNIK ELEKTRONIKA NEGERI SURABAYA (PENS)

Perangkat   : Arduino Mega, Plant Emulasi, Koneksi ADC Emulasi dan Pin Port I/O
              (sebagai PWM) Emulasi
*/

float Error;                // perbedaan antara Y dan D
float Y=0, D=0;             // Output Y dan yang diingninkan D
float X=1, W=0;             // Input X, Bobot W

#define PeriodeSampling 20  // waktu sampling 20ms

unsigned long t_lalu;       // waktu sampling sebelumnya

void setup()                // Bagian yang pertama dikerjakan oleh Arduino,
{                           // hanya satu kali
  Serial.begin(115200);     // sesuaikan dengan serial pada program Monitor
  Serial.println(" ");      // Cetak Label (Legenda) Kosong
  t_lalu=millis();          // catat waktu mulai,
                            // untuk perhitungan Periode Sampling
}

void Adaptive_W()       // Proses utama dari sistem,
{                       // hanya input output untuk observasi Plant
  Y=X*W;                // Output Y = Input X * Bobot W
  Error=D-Y;            // Error = Selisih Yang diinginkan (D) dengan Y
  W=W+0.018*Error*X;    // Hitung Update Bobot W
}

void Tampilkan()            // Untuk mengirimkan data-data sistem ke PC
{  
  Serial.print("X=");       // Tampilkan Label Input X
  Serial.print(X);
  Serial.print(" W=");      // Tampilkan Label Bobot W
  Serial.print(W);
  Serial.print(" Y=");      // Tampilkan Label Output Y
  Serial.print(Y);
  Serial.print(" D=");      // Tampilkan Label yang diinginkan D
  Serial.print(D);
  Serial.print(" Error=");  // Tampilkan Label Error
  Serial.println(Error);

  Serial.print(X);          // Tampilkan Sinyal Input X
  Serial.write(' ');        // tiap data dipisah dengan spasi " "
  Serial.print(W);          // Tampilkan Sinyal Bobot W
  Serial.write(' ');
  Serial.print(Y);          // Tampilkan Sinyal Output Y
  Serial.write(' ');                            
  Serial.print(D);          // Tampilkan Sinyal Yang diinginkan D
  Serial.write(' ');                            
  Serial.print(Error);      // Tampilkan Sinyal Error
  Serial.println(" -5 5");  // Batas plot min max
}

void BacaSerial()               // Menerima data perintah dari PC
{                               // melalui komunikasi serial
  if(Serial.available())        // Apakah ada penerimaan data serial dari PC ?
  {
    switch(Serial.read())       // akhiri setiap perintah dengan ";" atau "<CR>"
    {                           // contoh "d2.5;" atau "d2.5<cr>"
      case 'd':                 // Jika Ya, apakah dimulai huruf depan 'd' ?
        D=Serial.parseFloat();  // Jika Ya, baca data float berikutnya
                                // dan simpan sebagai Setting Point
        break;
      case 'x':                 // 'x1.23' Nilai input X
        X=Serial.parseFloat();
        break;
    }                           // Misal data yang diterima, "x12.34<CR>"
  }                             // Set Carriage Return pada terminal,
}                               // agar saat enter, lansung dikirimkan CR    

void loop()                     // Bagian yang dikerjakan secara
{                               // terus-menerus oleh Arduino
  BacaSerial();                 // Baca perintah serial dari PC
  unsigned long t=millis();     // Baca waktu saat ini, dalam ms
  if(t-t_lalu>=PeriodeSampling) // Apakah dengan waktu sebelumnya
  {                             // sudah terpaut 1 periode sampling ?
    Adaptive_W();               // Jika ya, lakukan operasi sampling
                                // untuk menjalankan kontrol
    Tampilkan();                // Tampilkan data-data sistem ke PC
                                // melalui komunikasi serial
    t_lalu=t;                   // dan catat waktu sekarang sebagai waktu lalu,
                                // untuk perhitungan 1 sampling berikutnya
  }
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15