#include <SPI.h>
#include <Wire.h>
#define onikiv 16
#define yirmialtiv 20
#define otuzikiv 21
#define led 25
#define yukariBtn 11
#define asagiBtn 12
float yukari = 0;
float asagi = 0;
int bayrak = 1;
float voltaj = 0;
float akim = 0;
float dac = 0;
const int dacChipSelectPin = 17;
void setDac(int value, int channel) {
  byte dacRegister = 0b00110000;                         // Varsayılan DAC kayıtlarını ayarlar B00110000, 1. bit DAC'yi seçer, A=0 B=1, 2. Bit giriş Tamponunu atlar, 3. bit çıkış kazancını 1x'e ayarlar, 4. bit aktif düşük kapatmayı kontrol eder. LSB burada önemsizdir.
  int dacSecondaryByteMask = 0b0000000011111111;         // 12 bitlik değer olan B00000000111111111'in son 8 bitini izole eder.
  byte dacPrimaryByte = (value >> 8) | dacRegister;      //Değer maksimum 12 Bit değerdir, Birincil Bayta giriş için değerden ilk 4 MSB'yi almak için 8 bayt sağa kaydırılır, ardından da Register ile BORed
  byte dacSecondaryByte = value & dacSecondaryByteMask;  // 8 LSB'yi izole etmek ve onu tek bir bayta indirmek için 12 bit değerini karşılaştırır.
  // Ayarlanacak DAC'yi belirlemek için birincil Baytta MSB'yi ayarlar, DAC A=0, DAC B=1
  switch (channel) {
    case 0:
      dacPrimaryByte &= ~(1 << 7);
      break;
    case 1:
      dacPrimaryByte |= (1 << 7);
  }
  //noInterrupts();                        // DAC'ye veri göndermeye hazırlanmak için kesintileri devre dışı bırakın
  digitalWrite(dacChipSelectPin, LOW);   // DAC'yi seçmek için Chip Select pinini alçaltın:
  SPI.transfer(dacPrimaryByte);          //  Birincil Baytı gönder:
  SPI.transfer(dacSecondaryByte);        // İkincil Baytı gönder
  digitalWrite(dacChipSelectPin, HIGH);  // DAC'nin seçimini kaldırmak için Chip Select pinini yükseğe alın:
  //interrupts();                         // Kesintileri etkinleştir
}
void setup() {
  Serial.begin(115200);
  SPI.begin();
  SPI.setTX(19);
  SPI.setSCK(18);
  SPI.setCS(17);
  Wire.setSDA(4);
  Wire.setSCL(5);
  Wire.begin();
 // DAC KODLARI /////////////
  pinMode(dacChipSelectPin, OUTPUT);
  // set the ChipSelectPins high initially:
  digitalWrite(dacChipSelectPin, HIGH);
  // initialise SPI:
  setDac(0, 0);  //Amper
  setDac(0, 1);  //Volt*/
  pinMode(onikiv, OUTPUT);
  pinMode(yirmialtiv, OUTPUT);
  pinMode(otuzikiv, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(yukariBtn, INPUT);
  pinMode(asagiBtn, INPUT);
  digitalWrite(onikiv, LOW);
  digitalWrite(yirmialtiv, LOW);
  digitalWrite(otuzikiv, LOW);
  digitalWrite(led, LOW);
}
void loop() {
  if (voltaj >= 30) {
    voltaj = 30;
    dac = 4095.90;
  }else if(voltaj <= 0){
    voltaj = 0;
    dac = 0;
  }
  Serial.print("voltaj: ");
  Serial.println(voltaj);
  Serial.print("dac: ");
  Serial.println(dac);
  if (digitalRead(yukariBtn) == 1) {
      voltaj++;
      delay(200);
      
      dac = voltaj * 136.53;
      setDac(dac, 1);  // Volt
      setDac(dac, 0);  // Volt
      /*akim = akim * 136;*/
      //setDac(akim, 0);  //Amper
    }
  if (digitalRead(asagiBtn) == 1) {
      voltaj--;
      delay(200);
    
      dac = voltaj * 136.53;
      setDac(dac, 1);  // Volt
      setDac(dac, 0);  // Volt
      /*akim = akim * 136;*/
     // setDac(akim, 0);  //Amper
    }
  digitalWrite(onikiv, LOW);
  digitalWrite(otuzikiv, LOW);
  delay(20);
  digitalWrite(yirmialtiv, HIGH);
  digitalWrite(led, HIGH);
}