//21100011074 Aykut ÖRS

//OLED ekran icin gerekli kutuphaneler
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//MPU6050 sensoru icin kutuphaneler
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

//OLED ekran icin tanimlamalar
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//MPU6050 sensoru icin tanimlamalar
Adafruit_MPU6050 mpu;

//SD Card kütüphanesi ve tanimlamalar
#include "SdFat.h"
#define SPI_SPEED SD_SCK_MHZ(4)
#define CS_PIN 53
SdFat sd;

//servo motor kütüphanesi ve tanimlamalar
#include <Servo.h>
Servo servoMotor1;
int servoMin1 = 0;   
int servoMax1 = 180;
Servo servoMotor2;
int servoMin2 = 0;   
int servoMax2 = 180;


void setup() {
  Serial.begin(9600);

  //OLED baslamazsa durumun yazdirilmasi
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }


  //MPU6050 sensorunun baslamamasi durumunda, baslayana kadar uyari yazdirilmasi
   while (!mpu.begin()) {
     OLEDEkranaYazdir("MPU6050 not connected!");
    delay(1000);
  }
  //MPU6050 sensorunun bağlanma bilgisinin yazdirilmasi  
   OLEDEkranaYazdir("MPU6050 ready!");
   
   //SD card ayarlari
    if (!sd.begin(CS_PIN, SPI_SPEED)) {
    if (sd.card()->errorCode()) {
      Serial.println("SD initialization failed.");
    } else if (sd.vol()->fatType() == 0) {
      Serial.println("Can't find a valid FAT16/FAT32 partition.");
    } else {
      Serial.println("Can't determine error type");
    }
    return;
  }

  //servo motor ayarlamalari
  servoMotor1.attach(8);
  servoMotor2.attach(9);
}

void loop() {

  //MPU6050 icin event tanimliyoruz
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);
  //servo motorların Gyroscope'un x ve y degerine gore hareket etmesi
  int servoPos1 = map(g.gyro.x, -4.3, +4.3, servoMin1, servoMax1);
  servoMotor1.write(servoPos1);
  int servoPos2 = map(g.gyro.y, -4.3, +4.3, servoMin2, servoMax2);
  servoMotor2.write(servoPos2);
  
  // MPU6050 sensorunun ölçümlerinin yazdırılması
  display.display();
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
  display.println("Accelerometer - m/s^2");
  display.print(a.acceleration.x);
  display.print(", ");
  display.print(a.acceleration.y);
  display.print(", ");
  display.println(a.acceleration.z);
  display.println("");
  display.println("Gyroscope - rps");
  display.print(g.gyro.x);  
  display.print(", ");
  display.print(g.gyro.y);
  display.print(", ");
  display.println(g.gyro.z);
  display.println("");
  display.println("Temperature");
  display.print(temp.temperature);
  display.println(" degC");
  display.display();  
  delay(500); 

  //SD Card İŞLEMLERİ
  // SD card da yer alan "mpu6050.txt" dosyasının yazma icin acilmasi
  File dataFile = sd.open("mpu6050.txt", FILE_WRITE); 
  
  if (dataFile) {
    // Bilgilerin dosyaya yazilmasi    
    dataFile.println("Accelerometer - m/s^2");
    dataFile.print(a.acceleration.x);
    dataFile.print(", ");
    dataFile.print(a.acceleration.y);
    dataFile.print(", ");
    dataFile.println(a.acceleration.z);
    dataFile.println("Gyroscope - rps");
    dataFile.print(g.gyro.x);
    dataFile.print(", ");
    dataFile.print(g.gyro.y);
    dataFile.print(", ");
    dataFile.println(g.gyro.z);
    dataFile.println("Temperature");
    dataFile.print(temp.temperature);
    dataFile.println(" degC");

    //dosyanin kapatilmasi
    dataFile.close();  
   
  }
  else {
    Serial.println("Dosyanin acilma hatasi.");
  }

  // Tekrar yazmadan önce 1 saniye bekleme
  delay(1000); 
  // SD card da yer alan "mpu6050.txt" dosyasının okuma icin acilmasi
  File dataFile2 = sd.open("mpu6050.txt", FILE_READ); 
   Serial.println("");
   Serial.println("SD karta yazılan ölçümler:"); 
   Serial.println("");
  if (dataFile2) {
    // Dosyadan bilgilerin okunmasi
    while (dataFile2.available()) {       
      Serial.write(dataFile2.read());
    }
    // dosyanin kapatilmasi
    dataFile2.close(); 
  }
  else {
    Serial.println("Dosyanin acilma hatasi.");
  }  

}

//OLED ekrana basit mesaj yazdiran fonksiyon
void OLEDEkranaYazdir(String mesaj){
//OLED'de ekrana yazdirma
  display.display();
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
  display.println(mesaj);
  display.display();
}

$abcdeabcde151015202530354045505560fghijfghij