// Standard bahasa pemrograman di Mikrokontroler C/C++

// apa itu tipe data?
// apa itu variabel?
// apa itu konstanta?
// apa itu function?

#include <Wire.h> //ini adalah contoh pemanggilan library untuk mengaktifkan komunikasi i2c
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> //ini adalah contoh pemanggilan library

#define LEBAR_LAYAR 128 //ini adalah contoh lain penggunaan konstanta menggunakan MACRO
#define TINGGI_LAYAR 64 

#define GND 0
#define VCC 1

#define MAX_LED 10

Adafruit_SSD1306 oled(LEBAR_LAYAR, TINGGI_LAYAR, &Wire, -1); //ini contoh pemanggilan class yang ada di library

const int8_t pinLED1 = 32; //ini adalah contoh penggunaan konstanta
const int8_t pinLED2 = 33;
const int8_t pinLED3 = 25;
const int8_t pinLED4 = 26;
const int8_t pinLED5 = 27;
const int8_t pinLED6 = 14;
const int8_t pinLED7 = 12;
const int8_t pinLED8 = 13;
const int8_t pinLED9 = 2;
const int8_t pinLED10 = 3;

const int8_t pinLED[MAX_LED] = {pinLED1, pinLED2, pinLED3, pinLED4, pinLED5, pinLED6, pinLED7, pinLED8, pinLED9, pinLED10}; //ini contoh penggunaan array
 
const int8_t pinPotensio = 34; //ini adalah contoh penggunaan konstanta

uint16_t dataPotensio = 0; //ini adalah contoh penggunaan variabel dengan tipe data integer 16 bit

void setup() { 
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");

  if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("failed to start SSD1306 OLED"));
    while (1);
  }

  for(int x = 0; x < MAX_LED; x++){
    pinMode(pinLED[0], OUTPUT); 
  }
 
  // pinMode(pinLED1, OUTPUT); 
  // pinMode(pinLED2, OUTPUT); 
  // pinMode(pinLED3, OUTPUT); 
  // pinMode(pinLED4, OUTPUT); 
  // pinMode(pinLED5, OUTPUT); 
  // pinMode(pinLED6, OUTPUT); 
  // pinMode(pinLED7, OUTPUT); 
  // pinMode(pinLED8, OUTPUT); 
  // pinMode(pinLED9, OUTPUT); 
  // pinMode(pinLED10, OUTPUT); 
  
  oled.setTextSize(1);         // Atur ukuran text
  oled.setTextColor(WHITE);    // Atur warna text
 
}

void loop() {  
  // digitalWrite(pinLED, HIGH);
  // delay(200);
  // digitalWrite(pinLED, LOW);
  // delay(200);  

  dataPotensio = analogRead(pinPotensio);

  int8_t volume = map(dataPotensio, 0, 4095, 0, 100);

  oled.clearDisplay(); // clear display 
  oled.setCursor(0, 0);       // Atur posisi text pada display
  oled.println("Kuliah Mikro"); // Text yang dicetak
  oled.setCursor(0, 30);       // Atur posisi text pada display
  oled.print(dataPotensio);
  
  oled.setCursor(0, 40);       // Atur posisi text pada display
  oled.print("Volume : "); // Text yang dicetak 
  oled.print(volume);

  oled.display();              // menampilkan display OLED

  kendaliLED(VCC);
  tampilanOLED();
}


void kendaliLED(){  
  
  if(dataPotensio > 2900){
    digitalWrite(pinLED1, HIGH);
  } else{
    digitalWrite(pinLED1, LOW);
  }

  // tambahkan jadi 10LED atau boleh pakai LED Bar Graph

  Serial.print(dataPotensio);
  Serial.print(" ");
  Serial.println(analogRead(pinPotensio));
  delay(100);
}

void kendaliLED(bool pilihSumber){
  if(pilihSumber == 0){
    digitalWrite(pinLED1, HIGH);
  } else{
    if(dataPotensio > 2000){
      digitalWrite(pinLED1, LOW); 
    } else{
      digitalWrite(pinLED1, HIGH); 
    }
  } 
}

void tampilanOLED(){
  // buat tampilan status Potensio seolah olah adalah data volume(suara) satuan % (persen)

  // buat tampilan tulisan tugas mikro di baris atas
  // buat tulisan Nama Mahasiswa di baris selanjutnya
  // buat tulisan "Data Pot:(Nilai Datanya)"
  // buat tulisan Status Volume(suara)
 
}