#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);
}