#include <EEPROM.h>
#define EEPROM_SIZE 512
char myData[] = "Hello, EEPROM!";
int getFreeEEPROM(){
  int freeSpace;
  for (int i = 0; i <= EEPROM.length(); i++) {
    int content = (int) EEPROM.read(i);
    if(content == 255){
      freeSpace++;
    }
  }
  return freeSpace;
}
int getUsedEEPROM(){
  int usedSpace;
  for (int i = 0; i <= EEPROM.length(); i++) {
    int content = (int) EEPROM.read(i);
    if(content != 255){
      usedSpace++;
    }
  }
  return usedSpace;
}
String getUsedEEPROMAddresses() {
  String usedAddress = "";
  int usedAddresses[EEPROM.length()];
  int count = 0;  // Variabel untuk menghitung jumlah alamat yang terisi
  // Membaca seluruh EEPROM dan memeriksa apakah ada data yang terisi
  for (int i = 0; i < EEPROM.length(); i++) {
    int content = (int) EEPROM.read(i);  // Baca nilai di EEPROM
    if (content != 255) {  // 255 berarti belum ada data yang ditulis
      usedAddresses[count] = i;  // Menyimpan alamat EEPROM yang terisi
      count++;  // Increment count untuk menyimpan alamat selanjutnya
    }
  }
  // Membuat string untuk menampilkan alamat-alamat yang terpakai
  usedAddress += "[";
  // Menggabungkan semua alamat yang terpakai dalam satu string
  for (int i = 0; i < count; i++) {
    usedAddress += String(usedAddresses[i]);
    if (i < count - 1) {
      usedAddress += ", ";  // Menambahkan koma hanya jika bukan elemen terakhir
    }
  }
  
  usedAddress += "]";
  return usedAddress;
}
void setup() {
  Serial.begin(115200);
  EEPROM.begin(EEPROM_SIZE);
  // Menulis data ke EEPROM
  for (int i = 0; i < sizeof(myData); i++) {
    EEPROM.write(i, myData[i]);
  }
  EEPROM.commit();
  Serial.println("Data written to EEPROM.");
  // Membaca kapasitas EEPROM
  int eepromSize = EEPROM.length();
  int usedSpace = sizeof(myData);
  int remainingSpace = eepromSize - usedSpace;
  // Menampilkan informasi kapasitas
  Serial.print("Total EEPROM Size: ");
  Serial.println(eepromSize);
  Serial.print("Used Space: ");
  Serial.println(usedSpace);
  Serial.print("Remaining Space: ");
  Serial.println(remainingSpace);
  Serial.println((char) EEPROM.read(0));
  Serial.println((char) EEPROM.read(1));
  Serial.println((char) EEPROM.read(2));
  Serial.println((char) EEPROM.read(3));
  Serial.println((char) EEPROM.read(4));
  Serial.println((char) EEPROM.read(5));
  Serial.println((char) EEPROM.read(6));
  Serial.println((char) EEPROM.read(7));
  Serial.println((char) EEPROM.read(8));
  Serial.println((char) EEPROM.read(9));
  Serial.println((char) EEPROM.read(10));
  Serial.println((char) EEPROM.read(11));
  Serial.println((char) EEPROM.read(12));
  Serial.println((char) EEPROM.read(13));
  Serial.println((char) EEPROM.read(14));
  Serial.println(EEPROM.read(15));
  Serial.println((int) EEPROM.read(16));
  Serial.println((long) EEPROM.read(17));
  Serial.println((bool) EEPROM.read(18));
  // Membaca data ke EEPROM
  String data = "";
  for (int i = 0; i < sizeof(myData); i++) {
    data += (char) EEPROM.read(i);
  }
  Serial.println(data);
  // Mencetak kapasitas total EEPROM
  Serial.println("Total EEPROM: "+String(EEPROM.length()));
  //  Mencetak jumlah EEPROM yang bisa dipakai
  int free_space = getFreeEEPROM();
  Serial.println("Free EEPROM: "+String(free_space));
  //  Mencetak jumlah EEPROM yang sudah terpakai
  int used_space = getUsedEEPROM();
  Serial.println("Used EEPROM: "+String(used_space));
  // Mencetak alamat EEPROM yang sudah terpakai
  String usedAddres =  getUsedEEPROMAddresses();
  Serial.println("Used EEPROM Address: "+usedAddres);
  
  
}
void loop() {
  // Tidak ada yang perlu dilakukan dalam loop
}