#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#include <RTClib.h>
RTC_DS1307 rtc;
DateTime waktu;
char buffer[20],buffer2[8];
const float BETA = 3950; 

#define pin_trig 7
#define pin_echo 6

#include <SD.h>
#define pin_cs 4
File fileku,root;
String NamaFile = "dataku.txt";
String Data;
int sekarang,tadi,tadi2;

void setup() {
  Serial.begin(9600);
rtc.begin();
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Data Logger");
  delay(1000);
  lcd.clear();
  sdcard_ini();

  pinMode(pin_trig, OUTPUT);
  pinMode(pin_echo, INPUT);
   
  buat_file(NamaFile, ambil_waktu( rtc.now()), "Tanggal,Suhu,Jarak");
  //cekIsiCard();


}

void loop() {
 waktu = rtc.now(); 
 sekarang = waktu.second();
 lcd.setCursor(0,0);
 lcd.print(ambil_waktu(waktu));

 dtostrf(ambil_suhu(analogRead(A0)),6,2,buffer2);
 sprintf(buffer,"Suhu : %s C", buffer2);
 lcd.setCursor(0,1);
 lcd.print(buffer);

 dtostrf(ambil_jarak(),6,2,buffer2);
 sprintf(buffer,"Jarak : %s cm", buffer2);
 lcd.setCursor(0,2);
 lcd.print(buffer);


 if(sekarang % 5 == 0 && sekarang !=tadi){
   tadi = sekarang;
 Data = ambil_waktu(waktu) +"," + ambil_suhu(analogRead(A0)) +"," + ambil_jarak();
 isiFile(NamaFile, Data);
 }



}

void isiFile(String NamaFile, String Data)
{
  fileku = SD.open(NamaFile,FILE_WRITE);
  if(fileku)
  {
   fileku.println(Data);
   fileku.close();
  } 
  else 
  {
    lcd.setCursor(0,3);
    lcd.print("Card Error");
      while(1);
  }
}

void bacaFile(String NamaFile)
{
  fileku = SD.open(NamaFile);
  if(fileku)
  {
    while(fileku.available())
    {
    Serial.write(fileku.read());
    }
    fileku.close();
  }
  else
  {
    lcd.setCursor(0,3);
    lcd.print("Card Error");
      while(1);
  }
}

void cekIsiCard()
{
  root = SD.open("/");
  while(true){
  
  File cekfile = root.openNextFile();
  if(!cekfile)
  {
    break;
  }
  Serial.print(cekfile.name());
  Serial.print(" ");
  Serial.println(cekfile.size());
  cekfile.close();
  
  }
}


void buat_file(String NamaFile, String waktu, String header)
{
  
  fileku = SD.open(NamaFile,FILE_WRITE);
  if(fileku)
  {
    fileku.println("ini adalah isi " + NamaFile);
    fileku.println("Mulai direkam pada " + waktu);
    fileku.println(header);

    fileku.close();
  }
  else 
  {
    lcd.setCursor(0,3);
    lcd.print("Card Error");
      while(1);
  }

}


void sdcard_ini()
{
    if(!SD.begin(pin_cs))
  { lcd.setCursor(0,3);
    lcd.print("Card Error");
    while(1);
   
  }
}


String ambil_waktu(DateTime waktu)
{
  sprintf(buffer,"%2d/%2d/%2d %2d:%2d:%2d",waktu.day(),waktu.month(),waktu.year(),waktu.hour(),waktu.minute(),waktu.second());
  return buffer;
}

float ambil_suhu(int analogValue)
{
  float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  return celsius;
}

float ambil_jarak()
{
   //set the TRIG pin to high for 10uS
digitalWrite(pin_trig, HIGH);
delayMicroseconds(10);
digitalWrite(pin_trig, LOW);
//menghitung waktu yang dibutuhkan untuk pantulan
int durasi = pulseIn(pin_echo,HIGH);
float cm=(float) durasi / 58.0;
return cm;
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
sd1:CD
sd1:DO
sd1:GND
sd1:SCK
sd1:VCC
sd1:DI
sd1:CS
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
ntc1:GND
ntc1:VCC
ntc1:OUT