// Ben Alp Mete Şenel Robotumun adı "Meraklı"
// Bu programı 14 Ağustos 2014 tarihinde yazmaya başladım.
// Programı tamamen bana ait olup. Istediğiniz şekilde kullanabilir 
// İstediğiniz şekilde değiştirebilirsiniz.

int IN1=3;  // Motor Sürücüsü IN1 
int IN2=5;  // Motor Sürücüsü IN2
int IN3=6;  // Motor Sürücüsü IN3
int IN4=9;  // Motor Sürücüsü IN4

int cizgirenk = HIGH;

int solarka=10;    // Arka Sensör Sol
int merkezarka=11; // Arka Sensör Merkez
int sagarka=12;    // Arka Sensör Sağ
int solon=4;       // Ön Sensör Sol
int merkezon=7;    // Ön Sensör Merkez
int sagon=8;       // Ön Sensör Sağ
int pilp=A0;       // Pil seviyesi için Analog 0
float pild=0;      // Pil Seviyesi değeri
int tekrar=1;
#define debug 0    // Arıza görüntüleme

int engel = 2;    // Ön Engel Sensörü

// voltage 6,5 V için 90-95-8-8
// voltage 7 V için 80-85-6-6
// voltage 6,5V için 70-75-6-6-10-10
// voltage 7,4V için 60-65-6-6-10-10

int minhizL = 95; // Sol Motor ilk değeri
int minhizR = 100; // Sağ Motor ilk değeri
int Rcarpan = 1;
int Lcarpan = 1;
int ledpin = 13;  // Zemin Rengi ayıraç led 
int cizgisay = 2;  // Boşluk sayısı
int Lsensor = 0;
int Rsensor = 1;
int stat = 0;

void setup()
{
  if (debug) Serial.begin(9600);
  pinMode(IN1, OUTPUT); //motor sürücüsü çıkış
  pinMode(IN2, OUTPUT); //motor sürücüsü çıkış
  pinMode(IN3, OUTPUT); //motor sürücüsü çıkış
  pinMode(IN4, OUTPUT); //motor sürücüsü çıkış
  pinMode(ledpin, OUTPUT); // zemin rengi için led çıkış 

  // Ön ve Arka sensör giriş tanımı
  pinMode(solarka, INPUT);
  pinMode(sagarka, INPUT);
  pinMode(merkezarka, INPUT);
  pinMode(solon, INPUT);
  pinMode(sagon, INPUT);
  pinMode(merkezon, INPUT);
  pinMode(engel, INPUT);
  
  // motorları durduralım
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

void loop() {
  // Sensör çarpanları sıfırla
  Rsensor = 0;
  Lsensor = 0;
  int L = 0, R = 0;

  // Ön Arka sensörleri oku
  int vsagarka = digitalRead(sagarka);
  int vmerkezarka = digitalRead(merkezarka);
  int vsolarka = digitalRead(solarka);
  int vsagon = digitalRead(sagon);
  int vmerkezon = digitalRead(merkezon);
  int vsolon = digitalRead(solon);
  int vengel = digitalRead(engel);

  // Çizgi Rengini belirle
  if (vsagon == LOW && vmerkezon == HIGH && vsolon == LOW && vsagarka == LOW && vmerkezarka == LOW && vsolarka == LOW)
  {
  // Siyah yol üzerine Beyaz Çizgi
    cizgirenk = HIGH;
  }
  // Çizgi Rengini belirle  
  if (vsagon == HIGH && vmerkezon == LOW && vsolon == HIGH && vsagarka == HIGH && vmerkezarka == HIGH && vsolarka == HIGH)
  {
  // Beyaz yol üzerine siyah çizgi
    cizgirenk = LOW;
  }  
  // Çizgi renğini Led e gönder
  digitalWrite(13,cizgirenk);

//çizgi Hangi sensörde de bul ve motor çarpan katsayılarını belirle
//Sol Sensörler
  if (vmerkezarka == cizgirenk)
  {
    Lsensor = 1;
  }

  if (vsolon == cizgirenk)
  {
    Lsensor = 2;
  }

  if (vsolarka == cizgirenk)
  {
    Lsensor = 3;
  }

//çizgi Hangi sensörde de bul ve motor çarpan katsayılarını belirle
//Sağ Sensörler
  if (vmerkezon == cizgirenk)
  {
    Rsensor = 1;
  }

  if (vsagarka == cizgirenk)
  {
    Rsensor = 2;
  }

  if (vsagon == cizgirenk)

  {
    Rsensor = 3;
  }

  if (vsagon == LOW & vmerkezon == LOW & vsolon == LOW & stat == 0)
  {
    cizgisay = cizgisay + 1;
    if (debug) {
      Serial.print("cizgi:");
      Serial.println(cizgisay);
      cizgi(cizgisay);
    }
    stat = 1;
  }
  if (vsagon == HIGH & vmerkezon == HIGH & vsolon == HIGH & stat == 1)
  {
    stat = 0;
  }

  //Çizgi Sol taraftamı
  if (Rsensor < Lsensor)
  {
  // Engel Yoksa sağ motoru çalıştır
    if (vengel == HIGH) sag(Rsensor);
  }

  //Çizgi Sağ taraftamı
  if (Rsensor > Lsensor)
  {
  // Engel Yoksa sol motoru çalıştır
    if (vengel == HIGH) sol(Lsensor);
  }

  // Çizgi ortadamı
  if (Rsensor == Lsensor)
  {
  // Engel yoksa Düz devam et
    if (vengel == HIGH) duz(Lsensor, Rsensor);
  }
  
  if (debug)
  {
  //pil seviyesini belirle
    pil();
  }

  // Engel var mı
  if (vengel == LOW)
  {
  //motorları durdur
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    if (debug) Serial.println("motor dur");
  }
}

void cizgi(int cizgi)
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  for (int cizgisayi = 0; cizgisayi < cizgi; cizgisayi++)
  {
    Serial.println("led: on");
    digitalWrite(ledpin, HIGH);
    delay(100);
    digitalWrite(ledpin, LOW);
    Serial.println("led: off");
    delay(100);
  }
}

//sol motor değerleri ile çalıştır
void sol(int Lsensor)
{
  int L = minhizL + (Lsensor * (Lcarpan));
  if (digitalRead(IN1) == LOW)
  {
    L = L + 10;
  }
  analogWrite(IN1, L);
  analogWrite(IN3, 13);
  Serial.print(L);
  Serial.println(",13");
}

//Sağ motor değerleri ile çalıştır
void sag(int Rsensor)
{
  int R = minhizR + (Rsensor * (Rcarpan));
  if (digitalRead(IN3) == LOW)
  {
    R = R + 10;
  }
  analogWrite(IN3, R);
  analogWrite(IN1, 13);
  Serial.print("13,");
  Serial.println(R);
}

//iki motoruda çalıştır
void duz(int Lsensor, int Rsensor)
{

  int L = minhizL + (Lsensor * (Lcarpan));
  int R = minhizR + (Rsensor * (Rcarpan));
  if (digitalRead(IN3) == LOW)
  {
    R = R + 10;
  }
  if (digitalRead(IN1) == LOW)
  {
    L = L + 10;
  }
  analogWrite(IN1, L);
  analogWrite(IN3, R);
  Serial.print(L);
  Serial.println(R);
}

//pil seviyesini ölç
void pil()
{
  pild = analogRead(pilp);
  //Analog portan okunan değeri voltaja dönüştür
  float voltage = pild * 7.36 / 678;
  float deger = 7.5 / voltage * 50;
  Serial.print(pild);
  Serial.print("-");
  Serial.println(voltage);
}