#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Pin untuk sensor DS18B20
#define ONE_WIRE_BUS 2

// Inisialisasi OneWire dan DallasTemperature
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Pin untuk push button
#define BUTTON1_PIN 6
#define BUTTON2_PIN 7
#define BUTTON3_PIN 8
#define BUTTON4_PIN 9

// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Variabel global
float temperatureData[100]; // Array untuk menyimpan nilai pengukuran
int dataCount = 0; // Jumlah data yang tercatat
float averageTemp = 0.0; // Rata-rata suhu
float massaJenis = 0.0; // Nilai massa jenis
bool showMassaJenis = false; // Flag untuk menampilkan massa jenis
bool startMeasurement = false; // Flag untuk memulai pengukuran
int button1=0;
int button2=0;
int button3=0;
int button4=0;
void setup() {
  // Inisialisasi pin button
  pinMode(BUTTON1_PIN, INPUT_PULLUP);
  pinMode(BUTTON2_PIN, INPUT_PULLUP);
  pinMode(BUTTON3_PIN, INPUT_PULLUP);
  pinMode(BUTTON4_PIN, INPUT_PULLUP);

  // Inisialisasi Serial dan LCD
  Serial.begin(9600);
  lcd.begin(16, 2); // Menyediakan jumlah kolom dan baris LCD
  lcd.backlight();

  // Inisialisasi sensor suhu
  sensors.begin();

  // Pesan selamat datang
  lcd.setCursor(0, 0);
  lcd.print("Silahkan tekan");
  lcd.setCursor(0, 1);
  lcd.print("tombol 1");
}

void loop() {
  // Tunggu hingga tombol 1 ditekan untuk memulai pengukuran
  if (!startMeasurement) {
    if (digitalRead(BUTTON1_PIN) == LOW) {
      startMeasurement = true;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Pengukuran mulai");
      delay(1000);
      lcd.clear();
    }

  }

  // Tampilkan massa jenis jika flag showMassaJenis aktif
  if (showMassaJenis) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Massa Jenis: ");
    lcd.setCursor(0, 1); // Pindah ke baris kedua
    lcd.print(massaJenis, 2); // Menampilkan massa jenis dengan 2 digit di belakang koma
    delay(1000);
    showMassaJenis = false; // Reset flag setelah menampilkan massa jenis
    return; // Tidak kembali ke loop utama
  }

  // Baca suhu dari sensor DS18B20
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);

  // Periksa apakah Button 1 ditekan
  if (digitalRead(BUTTON1_PIN) == LOW) {
    button1=1;
    button2=0;
    button3=0;
    button4=0;
    dataCount = 0; // Reset jumlah data1
    showMassaJenis = false; // Reset flag
    startMeasurement = false; // Kembali ke mode awal
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Pengukuran reset");
    delay(1000); // Tunggu sebentar sebelum kembali ke loop utama
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Silahkan tekan");
    lcd.setCursor(0, 1);
    lcd.print("tombol 1");
  }

  // Periksa apakah Button 2 ditekan
  if (digitalRead(BUTTON2_PIN) == LOW) {
    button1=0;
    button2=1;
    button3=0;
    button4=0;
    if (dataCount < 100) {
      temperatureData[dataCount] = tempC;
      dataCount++;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Data disimpan");
      lcd.setCursor(0, 1);
      lcd.print("Total: ");
      lcd.print(dataCount);
      delay(1000); // Tunggu sebentar sebelum kembali ke loop utama
    } else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Data penuh");
      delay(1000); // Tunggu sebentar sebelum kembali ke loop utama
    }
  }

  // Periksa apakah Button 3 ditekan
  if (digitalRead(BUTTON3_PIN) == LOW) {
    button1=0;
    button2=0;
    button3=1;
    button4=0;
    if (dataCount > 0) {
      float sumTemp = 0.0;
      for (int i = 0; i < dataCount; i++) {
        sumTemp += temperatureData[i];
      }
      averageTemp = sumTemp / dataCount;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("rata-rata suhu: ");
      lcd.setCursor(0, 1);
      lcd.print(averageTemp, 2); // Menampilkan suhu rata-rata dengan 2 digit di belakang koma
      lcd.print((char)223);
      lcd.print("C");
      delay(1000); // Tunggu sebentar sebelum kembali ke loop utama
      return; // Tidak kembali ke loop utama
    } else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tidak ada data");
      delay(1000); // Tunggu sebentar sebelum kembali ke loop utama
    }
  }

  // Periksa apakah Button 4 ditekan
  if (digitalRead(BUTTON4_PIN) == LOW) {
    button1=0;
    button2=0;
    button3=0;
    button4=1;
    if (dataCount > 0) {
      // Hitung massa jenis menggunakan persamaan yang diberikan
      massaJenis = 999.8395639 +
                   (0.06798299989 * averageTemp) -
                   (0.009106025564 * pow(averageTemp, 2)) +
                   (0.0001005272999 * pow(averageTemp, 3)) -
                   (0.000001126713526 * pow(averageTemp, 4)) +
                   (0.000000006591795606 * pow(averageTemp, 5));
      showMassaJenis = true; // Set flag untuk menampilkan massa jenis
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Massa Jenis: ");
      lcd.setCursor(0, 1); // Pindah ke baris kedua
      lcd.print(massaJenis, 4); // Menampilkan massa jenis dengan 4 digit di belakang koma
      lcd.print(" kg/m^3");
      delay(100000); // Tunggu sebentar sebelum kembali ke loop utama
      return; // Tidak kembali ke loop utama
    } else {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Tidak ada data");
      delay(1000); // Tunggu sebentar sebelum kembali ke loop utama
    }
  }
  if (button3==0 || button4==0) {
    if(button1==1){
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Suhu: ");
      lcd.print(tempC, 2); // Menampilkan suhu saat ini dengan 2 digit di belakang koma
      lcd.print((char)223);
      lcd.print("C");
      delay(500); // Pembaruan setiap setengah detik
    }
    else if (button2==1){
    lcd.setCursor(0, 0);
    lcd.print("Suhu: ");
    lcd.print(tempC, 2); // Menampilkan suhu saat ini dengan 2 digit di belakang koma
    lcd.print((char)223);
    lcd.print("C");
    delay(500); // Pembaruan setiap setengah detik
    }
    // Tampilkan suhu saat ini di LCD
    return;
  }
}
$abcdeabcde151015202530fghijfghij