Siyah zemin üzerinde beyaz çizgileri takip etmesini sağlayan bir çizgi izleyen robot yaptım, kullandığım malzemeler, arduino nano, buzzer, led, mz80 sensör, kızılötesi alıcı, iki tane motor, başlatma butonu. Bu aşağıda yazacak olduğum kodun satır satır ne işe yaradığını tükçe olarak bana açıklar mısın?

#include <QTRSensors.h>
#define sagmotor1 9
#define sagmotor2 10
#define solmotor1 3
#define solmotor2 11
#define MZ80 5
#define IRALICI 12
#define startbuton 2
#define LED1 4
#define LED2 8
#define Buzzer 13
QTRSensorsAnalog qtra((unsigned char[]) {
  A0, A1, A2, A3, A4 , A5, A6, A7
} , 8);
unsigned int sensors[8];
int tabanhiz = 255;
int maxhiz = 255;
int sonhata = 0;
float Kp = 0.16;
float Kd = 1.6;
float Ki = 0.001;
int ekhiz = 0;
int sagmotorpwm = 0;
int solmotorpwm = 0;
int integral = 0;
int hata = 0;
int zemin = 1;
int sonmotor1yon = 0;
int sonmotor2yon = 0;
char veri;

void setup()
{
  pinMode(sagmotor1, OUTPUT);
  pinMode(sagmotor2, OUTPUT);
  pinMode(solmotor1, OUTPUT);
  pinMode(solmotor2, OUTPUT);
  pinMode(Buzzer, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(MZ80, INPUT_PULLUP);
  pinMode(startbuton, INPUT_PULLUP);

  delay(1000);

  int i;
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  // Otomatik Kalibrasyon.
  for (int i = 0; i < 150; i++)
  {
    //    if ( 0 <= i && i < 5   )  hafifsagadon();
    //    if ( 5 <= i && i  < 15   )  hafifsoladon();
    //    if ( 15 <= i && i < 25   )  hafifsagadon();
    //    if ( 25 <= i && i < 35   )  hafifsoladon();
    //    if ( 35 <= i && i < 40   )  hafifsagadon();
    //    if ( 45 <= i && i < 55   )  hafifsoladon();
    //    if ( 55 <= i && i < 65   )  hafifsagadon();
    //    if ( 65 <= i && i < 75   )  hafifsoladon();
    //    if ( 75 <= i && i < 80   )  hafifsagadon();

    if ( i >= 80  )  {
      frenle();
      delay(3);
    }

    qtra.calibrate();
    delay(1);
  }
  flashyap();
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  dur(); // MZ80 Durma Fonksiyonu.

}
void loop() {

  unsigned int sensors[8];
  unsigned int position = qtra.readLine(sensors, 1, zemin);
  hata = position - 3500;


  integral += hata;

  // Motorlara Uygulanacak Hız Hesapamaları.
  int duzeltmehizi = Kp * hata + Kd * (hata - sonhata) + Ki * integral;
  sonhata = hata;

  dur(); // MZ80 Durma Fonksiyonu.

  //  if (sensors[0]<100 && sensors[7]<100 ) { zemin=0;  }//beyaz zemin siyah çizgiyi tespit eder
  //  if (sensors[0]>750 && sensors[7]>750 ) { zemin=1;  }//siyah zemin beyaz çizgiyi tespit eder

  sagmotorpwm = tabanhiz + duzeltmehizi + ekhiz  ;
  solmotorpwm = tabanhiz - duzeltmehizi + ekhiz ;

  sagmotorpwm = constrain(sagmotorpwm, -255, maxhiz);
  solmotorpwm = constrain(solmotorpwm, -255, maxhiz);
  motorkontrol(solmotorpwm, sagmotorpwm);


}
void motorkontrol(int solmotorpwm, int sagmotorpwm) {

  if (sagmotorpwm < 0) {
  }
  else {
    analogWrite(sagmotor1, sagmotorpwm);
    digitalWrite(sagmotor2, LOW);
  }
  if (solmotorpwm < 0) {
  }
  else {
    digitalWrite(solmotor1, LOW);
    analogWrite(solmotor2, solmotorpwm);
  }
}

void dur() {
  if (digitalRead(MZ80) == LOW) {  // Pist Bitişi Engel Durumunda Yapılacak İşlem.
    do {
      frenle();
      delay(1);
    }  while (digitalRead(MZ80) == LOW);
  }
}
void frenle() {
  motorkontrol(0, 0);
}
void hafifsagadon() {
  motorkontrol(35, -35);
}
void hafifsoladon() {
  motorkontrol(-35, 35);
}

void sensoroku() {
  // Çizgi Sensörleri Pozisyon Hesaplaması.
  unsigned int sensors[8];
  unsigned int position = qtra.readLine(sensors, 1, zemin);
  hata = position - 3500;
}
void flashyap() {
  digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); delay(250);
  digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); delay(250);
  digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); delay(250);
  digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); delay(250);
  digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); delay(250);
  digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); delay(250);
  digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); delay(250);
  digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); delay(250);
  digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); delay(250);

}
