DJ SETUP

(DİKKAT! BU YAPILMASI ÇOK ZOR BİR PROJEDİR VE BÜYÜK KOD İÇERİR!)

Siz de DJ SETUP yapmak isterseniz işte gerekenler, şema ve kodlar!

  • Arduino Uno
  • 16×2 I2C LCD Ekran
  • 1x 10K Potansiyometre
  • 2x 5mm Push Buton
  • 1x 0.96″ OLED 128×64 SSD1306 I2C OLED Ekran
  • 7x LED (2x Sarı, 2x Mavi, 2x Yeşil, 1x Kırmızı*)
  • 7x 220 Ohm Direnç
  • 1x Breadboard
  • 1x Orta Breadboard
  • 1x Hoparlör
  • Jumper Kablolar
dj setup

ve kodlar…

#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>
#include <LiquidCrystal_I2C.h>
#include <avr/pgmspace.h>

// ================= OLED =================

U8G2_SSD1306_128X64_NONAME_1_SW_I2C oled(
  U8G2_R0,
  11,
  12,
  U8X8_PIN_NONE
);

LiquidCrystal_I2C lcd(0x27, 16, 2);

// ================= PINLER =================

const byte buzzerPin = 10;
const byte potPin = A0;

const byte btnAsagi = 9;
const byte btnSec = 13;

const byte ledD2 = 2;
const byte ledD3 = 3;
const byte ledD4 = 4;
const byte ledD5 = 5;
const byte ledD6 = 6;
const byte ledD7 = 7;
const byte ledD8 = 8;

// ================= NOTALAR =================

#define NOTE_DO4   262
#define NOTE_RE4   294
#define NOTE_MI4   330
#define NOTE_FA4   349
#define NOTE_SOL4  392
#define NOTE_LA4   440
#define NOTE_SIB4  466
#define NOTE_SI4   494

#define NOTE_DO5   523
#define NOTE_RE5   587
#define NOTE_MI5   659
#define NOTE_FA5   698
#define NOTE_SOL5  784
#define NOTE_LA5   880

#define REST 0

// ================= LCD TÜRKÇE KARAKTERLER =================

byte g_kucuk[] = {
  0b01110,
  0b00000,
  0b01111,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b01110
};

byte s_kucuk[] = {
  0b01111,
  0b10000,
  0b10000,
  0b01110,
  0b00001,
  0b01111,
  0b00100,
  0b00000
};

byte i_buyuk[] = {
  0b00100,
  0b00000,
  0b01110,
  0b00100,
  0b00100,
  0b00100,
  0b01110,
  0b00000
};

byte i_kucuk[] = {
  0b00000,
  0b00000,
  0b01100,
  0b00100,
  0b00100,
  0b00100,
  0b01110,
  0b00000
};

byte c_kucuk[] = {
  0b00000,
  0b00000,
  0b01110,
  0b10000,
  0b10000,
  0b01110,
  0b00100,
  0b00000
};

byte s_buyuk[] = {
  0b01111,
  0b10000,
  0b10000,
  0b01110,
  0b00001,
  0b01111,
  0b00100,
  0b00000
};

byte c_buyuk[] = {
  0b00000,
  0b01110,
  0b10000,
  0b10000,
  0b10000,
  0b01110,
  0b00100,
  0b00000
};

// ================= LCD TÜRKÇE =================

void lcdTurkce(const char *metin) {

  for (byte i = 0; metin[i] != '\0'; i++) {

    byte b1 = (byte)metin[i];

    if (b1 == 0xC4 || b1 == 0xC5 || b1 == 0xC3) {

      byte b2 = (byte)metin[++i];

      if (b1 == 0xC4 && b2 == 0x90)
        lcd.write(2);

      else if (b1 == 0xC4 && b2 == 0xB1)
        lcd.write(3);

      else if (b1 == 0xC5 && b2 == 0x91)
        lcd.write(1);

      else if (b1 == 0xC5 && b2 == 0x9E)
        lcd.write(5);

      else if (b1 == 0xC3 && b2 == 0xA7)
        lcd.write(4);

      else if (b1 == 0xC3 && b2 == 0x87)
        lcd.write(6);

      else if (b1 == 0xC4 && b2 == 0x9F)
        lcd.write(0);

      else
        lcd.print('?');
    }

    else {
      lcd.print((char)b1);
    }
  }
}

// ================= LED =================

void ledleriKapat() {

  digitalWrite(ledD2, LOW);
  digitalWrite(ledD3, LOW);
  digitalWrite(ledD4, LOW);
  digitalWrite(ledD5, LOW);
  digitalWrite(ledD6, LOW);
  digitalWrite(ledD7, LOW);
  digitalWrite(ledD8, LOW);
}

void ledControl(int freq) {

  ledleriKapat();

  if (freq == NOTE_DO4 || freq == NOTE_DO5)
    digitalWrite(ledD2, HIGH);

  else if (freq == NOTE_RE4 || freq == NOTE_RE5)
    digitalWrite(ledD3, HIGH);

  else if (freq == NOTE_MI4 || freq == NOTE_MI5)
    digitalWrite(ledD4, HIGH);

  else if (freq == NOTE_FA4 || freq == NOTE_FA5)
    digitalWrite(ledD5, HIGH);

  else if (freq == NOTE_SOL4 || freq == NOTE_SOL5)
    digitalWrite(ledD6, HIGH);

  else if (freq == NOTE_LA4 || freq == NOTE_LA5 ||
           freq == NOTE_SIB4)
    digitalWrite(ledD7, HIGH);

  else if (freq == NOTE_SI4)
    digitalWrite(ledD8, HIGH);
}

// ================= POTANSİYOMETRE =================

int sureHesapla(int sure) {

  int pot = analogRead(potPin);

  int carpani = map(pot, 0, 1023, 250, 50);

  long sonuc = ((long)sure * carpani) / 100;

  if (sonuc < 30)
    sonuc = 30;

  if (sonuc > 4000)
    sonuc = 4000;

  return (int)sonuc;
}

// ================= BUTON SESLERİ =================

void butonAsagiSesi() {

  tone(buzzerPin, 900);
  delay(35);
  noTone(buzzerPin);

}

void butonSecSesi() {

  tone(buzzerPin, 1200);
  delay(45);

  tone(buzzerPin, 1600);
  delay(55);

  noTone(buzzerPin);
}

// ================= NOTA =================

void notaCal(int frekans, int sure) {

  int gercekSure = sureHesapla(sure);

  if (frekans == REST) {

    noTone(buzzerPin);
    ledleriKapat();

    delay(gercekSure);

    return;
  }

  ledControl(frekans);

  tone(buzzerPin, frekans);

  delay(gercekSure);

  noTone(buzzerPin);
  ledleriKapat();
}

// ================= MENÜ =================

byte seciliSarki = 0;

void menuCiz() {

  oled.firstPage();

  do {

    oled.setFont(u8g2_font_6x10_tf);

    // ÜST BAŞLIK
    oled.drawStr(31, 10, "DJ SETUP");

    // ANA MENÜ ÇERÇEVESİ
    oled.drawLine(8, 14, 119, 14);
    oled.drawLine(8, 14, 8, 60);
    oled.drawLine(8, 60, 119, 60);
    oled.drawLine(119, 14, 119, 60);

    // SEÇİLİ ÖĞE ÇERÇEVESİ
    if (seciliSarki == 0) {

      oled.drawLine(3, 18, 118, 18);
      oled.drawLine(3, 18, 3, 32);
      oled.drawLine(3, 32, 118, 32);
      oled.drawLine(118, 18, 118, 32);

      oled.drawStr(7, 28, ">");
    }

    else if (seciliSarki == 1) {

      oled.drawLine(3, 33, 118, 33);
      oled.drawLine(3, 33, 3, 47);
      oled.drawLine(3, 47, 118, 47);
      oled.drawLine(118, 33, 118, 47);

      oled.drawStr(7, 43, ">");
    }

    else {

      oled.drawLine(3, 48, 118, 48);
      oled.drawLine(3, 48, 3, 62);
      oled.drawLine(3, 62, 118, 62);
      oled.drawLine(118, 48, 118, 62);

      oled.drawStr(7, 58, ">");
    }

    // ŞARKILAR
    oled.drawStr(17, 28, "Izmir Marsi");
    oled.drawStr(17, 43, "Istiklal Marsi");
    oled.drawStr(17, 58, "Happy Birthday");

  } while (oled.nextPage());
}

// ================= ÇALINIYOR EKRANI =================

void oledCaliniyor(const char *sarki) {

  oled.firstPage();

  do {

    oled.setFont(u8g2_font_6x10_tf);

    // Dış çerçeve
    oled.drawFrame(3, 3, 122, 58);

    oled.drawStr(32, 15, "DJ SETUP");

    // Ayırıcı çizgi
    oled.drawLine(8, 20, 120, 20);

    oled.drawStr(5, 35, sarki);

    oled.drawStr(5, 52, "CALINIYOR...");

  } while (oled.nextPage());
}

// ================= LCD BAŞLANGIÇ =================

void lcdBaslangic() {

  lcd.clear();

  lcd.setCursor(0, 0);
  lcdTurkce("DJ SETUP");

  lcd.setCursor(0, 1);
  lcdTurkce("Sarki Secin");
}

// ============================================================
// ====================== İZMİR MARŞI =========================
// ============================================================

const uint16_t izmirMelodi[] PROGMEM = {

  REST,50,

  NOTE_LA4,150,
  NOTE_MI5,150,
  NOTE_MI5,150,
  NOTE_MI5,150,
  NOTE_MI5,150,
  NOTE_MI5,150,
  NOTE_FA5,150,
  NOTE_MI5,150,
  NOTE_RE5,150,
  NOTE_FA5,300,
  NOTE_MI5,400,

  REST,50,

  NOTE_LA4,150,
  NOTE_MI5,150,
  NOTE_MI5,150,
  NOTE_MI5,150,
  NOTE_MI5,150,
  NOTE_MI5,150,
  NOTE_FA5,150,
  NOTE_MI5,150,
  NOTE_RE5,150,
  NOTE_FA5,300,
  NOTE_MI5,400,

  NOTE_MI5,150,
  NOTE_LA5,150,
  NOTE_SOL5,150,
  NOTE_FA5,150,
  NOTE_MI5,150,
  NOTE_RE5,150,
  NOTE_MI5,150,
  NOTE_RE5,150,
  NOTE_DO5,150,
  NOTE_SI4,150,
  NOTE_DO5,400,

  NOTE_DO5,150,
  NOTE_MI5,150,
  NOTE_RE5,150,
  NOTE_DO5,150,
  NOTE_SI4,150,
  NOTE_LA4,150,
  NOTE_DO5,150,
  NOTE_SI4,150,
  NOTE_LA4,150,
  NOTE_SOL5,150,
  NOTE_LA4,400,

  NOTE_MI5,150,
  NOTE_LA5,150,
  NOTE_SOL5,150,
  NOTE_FA5,150,
  NOTE_MI5,150,
  NOTE_RE5,150,
  NOTE_MI5,150,
  NOTE_RE5,150,
  NOTE_DO5,150,
  NOTE_SI4,150,
  NOTE_DO5,400,

  NOTE_DO5,150,
  NOTE_MI5,150,
  NOTE_RE5,150,
  NOTE_DO5,150,
  NOTE_SI4,150,
  NOTE_LA4,150,
  NOTE_DO5,150,
  NOTE_SI4,150,
  NOTE_LA4,150,
  NOTE_SOL5,150,
  NOTE_LA4,400
};

const byte izmirNotaSayisi =
  sizeof(izmirMelodi) / sizeof(izmirMelodi[0]) / 2;

void izmirMarsiCal() {

  noTone(buzzerPin);
  ledleriKapat();

  lcd.clear();

  lcd.setCursor(0, 0);
  lcdTurkce("İzmir Marşı");

  lcd.setCursor(0, 1);
  lcdTurkce("Çalınıyor...");

  oledCaliniyor("IZMIR MARSI");

  delay(1200);

  for (byte i = 0; i < izmirNotaSayisi; i++) {

    int freq = pgm_read_word(&izmirMelodi[i * 2]);
    int dur = pgm_read_word(&izmirMelodi[i * 2 + 1]);

    notaCal(freq, dur);
  }

  bitisEkrani();
}

// ============================================================
// ===================== İSTİKLAL MARŞI ========================
// ============================================================

const uint16_t istiklalMelodi[] PROGMEM = {

  NOTE_DO5,800,
  NOTE_FA5,800,
  NOTE_SOL5,800,
  830,800,
  NOTE_MI5,400,
  NOTE_SOL5,200,
  NOTE_FA5,1600,
  REST,300,

  NOTE_FA5,800,
  932,800,
  1046,800,
  1108,800,
  880,400,
  1046,200,
  932,1600,

  1046,200,
  932,200,
  1046,200,
  NOTE_SOL5,400,
  REST,100,
  NOTE_SOL5,400,
  466,200,
  830,400,
  NOTE_MI5,200,
  NOTE_FA5,400,
  NOTE_SOL5,200,
  830,400,
  466,200,
  1046,400,
  1108,200,
  622,400,
  1396,200,
  622,400,

  622,200,
  NOTE_RE5,200,
  622,200,
  1046,800,
  466,800,
  830,1600,

  NOTE_DO5,200,
  NOTE_SI4,200,
  NOTE_DO5,200,
  NOTE_SOL5,800,
  NOTE_DO5,800,
  1046,800,
  466,200,
  830,200,
  NOTE_SOL5,400,
  830,200,
  NOTE_FA5,800,

  1396,800,
  622,200,
  1108,400,
  1046,200,
  466,400,
  830,200,
  NOTE_SOL5,400,
  NOTE_FA5,200,
  1046,400,
  NOTE_DO5,800,
  NOTE_FA5,1600,

  NOTE_DO5,800,
  NOTE_FA5,800,
  NOTE_SOL5,800,
  830,800,
  NOTE_MI5,400,
  NOTE_SOL5,200,
  NOTE_FA5,1600,
  REST,300,

  NOTE_FA5,800,
  932,800,
  1046,800,
  1108,400,
  932,400,
  880,400,
  1046,400,
  932,800,

  1046,200,
  932,200,
  1046,200,
  NOTE_SOL5,400,
  REST,100,
  NOTE_SOL5,400,
  466,200,
  830,400,
  NOTE_MI5,200,
  NOTE_FA5,400,
  NOTE_SOL5,200,
  830,400,
  466,200,
  1046,400,
  1108,200,
  622,400,
  1396,200,
  622,400,

  622,200,
  NOTE_RE5,200,
  622,200,
  1046,800,
  466,800,
  830,1600,

  NOTE_DO5,200,
  NOTE_SI4,200,
  NOTE_DO5,200,
  NOTE_SOL5,800,
  NOTE_DO5,800,
  1046,800,
  466,200,
  830,200,
  NOTE_SOL5,400,
  830,200,
  NOTE_FA5,800,

  1396,800,
  622,200,
  1108,400,
  1046,200,
  466,400,
  830,200,
  NOTE_SOL5,400,
  NOTE_FA5,200,
  1046,400,
  NOTE_DO5,800,
  NOTE_FA5,1600,

  REST,300
};

const byte istiklalNotaSayisi =
  sizeof(istiklalMelodi) / sizeof(istiklalMelodi[0]) / 2;

void istiklalMarsiCal() {

  noTone(buzzerPin);
  ledleriKapat();

  lcd.clear();

  lcd.setCursor(0, 0);
  lcdTurkce("İstiklal Marşı");

  lcd.setCursor(0, 1);
  lcdTurkce("Çalınıyor...");

  oledCaliniyor("ISTIKLAL MARSI");

  delay(1200);

  for (byte i = 0; i < istiklalNotaSayisi; i++) {

    int freq = pgm_read_word(&istiklalMelodi[i * 2]);
    int dur = pgm_read_word(&istiklalMelodi[i * 2 + 1]);

    notaCal(freq, dur);
  }

  bitisEkrani();
}

// ============================================================
// ==================== HAPPY BIRTHDAY =========================
// ============================================================

const uint16_t birthdayMelodi[] PROGMEM = {

  NOTE_DO4,250,
  NOTE_DO4,250,
  NOTE_RE4,500,
  NOTE_DO4,500,
  NOTE_FA4,500,
  NOTE_MI4,800,

  NOTE_DO4,250,
  NOTE_DO4,250,
  NOTE_RE4,500,
  NOTE_DO4,500,
  NOTE_SOL4,500,
  NOTE_FA4,800,

  NOTE_DO4,250,
  NOTE_DO4,250,
  NOTE_DO5,500,
  NOTE_LA4,500,
  NOTE_FA4,500,
  NOTE_MI4,500,
  NOTE_RE4,800,

  NOTE_SIB4,250,
  NOTE_SIB4,250,
  NOTE_LA4,500,
  NOTE_FA4,500,
  NOTE_SOL4,500,
  NOTE_FA4,1000
};

const byte birthdayNotaSayisi =
  sizeof(birthdayMelodi) / sizeof(birthdayMelodi[0]) / 2;

void happyBirthdayCal() {

  noTone(buzzerPin);
  ledleriKapat();

  lcd.clear();

  lcd.setCursor(0, 0);
  lcd.print("Happy Birthday");

  lcd.setCursor(0, 1);
  lcd.print("Caliniyor...");

  oledCaliniyor("HAPPY BIRTHDAY");

  delay(1200);

  for (byte i = 0; i < birthdayNotaSayisi; i++) {

    int freq = pgm_read_word(&birthdayMelodi[i * 2]);
    int dur = pgm_read_word(&birthdayMelodi[i * 2 + 1]);

    notaCal(freq, dur);
  }

  bitisEkrani();
}

// ================= BİTİŞ EKRANI =================

void bitisEkrani() {

  noTone(buzzerPin);
  ledleriKapat();

  lcd.clear();

  lcd.setCursor(0, 0);
  lcdTurkce("Bitti!");

  lcd.setCursor(0, 1);
  lcd.print("DJ SETUP");

  oled.firstPage();

  do {

    oled.setFont(u8g2_font_6x10_tf);

    // Tam çerçeve
    oled.drawFrame(3, 3, 122, 58);

    oled.drawStr(40, 25, "BITTI!");
    oled.drawLine(25, 31, 103, 31);
    oled.drawStr(30, 45, "DJ SETUP");

  } while (oled.nextPage());

  delay(2000);

  lcdBaslangic();
  menuCiz();
}

// ================= SETUP =================

void setup() {

  pinMode(buzzerPin, OUTPUT);
  pinMode(potPin, INPUT);

  pinMode(btnAsagi, INPUT_PULLUP);
  pinMode(btnSec, INPUT_PULLUP);

  pinMode(ledD2, OUTPUT);
  pinMode(ledD3, OUTPUT);
  pinMode(ledD4, OUTPUT);
  pinMode(ledD5, OUTPUT);
  pinMode(ledD6, OUTPUT);
  pinMode(ledD7, OUTPUT);
  pinMode(ledD8, OUTPUT);

  noTone(buzzerPin);
  ledleriKapat();

  // LCD
  lcd.init();
  lcd.backlight();

  lcd.createChar(0, g_kucuk);
  lcd.createChar(1, s_kucuk);
  lcd.createChar(2, i_buyuk);
  lcd.createChar(3, i_kucuk);
  lcd.createChar(4, c_kucuk);
  lcd.createChar(5, s_buyuk);
  lcd.createChar(6, c_buyuk);

  // OLED
  oled.begin();

  lcdBaslangic();

  // ================= AÇILIŞ EKRANI =================

  oled.firstPage();

  do {

    oled.setFont(u8g2_font_6x10_tf);

    // Dış çerçeve
    oled.drawFrame(3, 3, 122, 58);

    oled.drawStr(31, 25, "DJ SETUP");

    oled.drawLine(22, 30, 106, 30);

    oled.drawStr(22, 45, "Hazirlaniyor");

  } while (oled.nextPage());

  delay(1000);

  menuCiz();
}

// ================= LOOP =================

void loop() {

  // ================= AŞAĞI BUTONU =================

  if (digitalRead(btnAsagi) == LOW) {

    delay(30);

    if (digitalRead(btnAsagi) == LOW) {

      // Buton sesi
      butonAsagiSesi();

      seciliSarki++;

      if (seciliSarki >= 3)
        seciliSarki = 0;

      menuCiz();

      while (digitalRead(btnAsagi) == LOW) {
        delay(1);
      }

      delay(30);
    }
  }

  // ================= SEÇ BUTONU =================

  if (digitalRead(btnSec) == LOW) {

    delay(30);

    if (digitalRead(btnSec) == LOW) {

      // Buton sesi
      butonSecSesi();

      while (digitalRead(btnSec) == LOW) {
        delay(1);
      }

      delay(30);

      if (seciliSarki == 0) {

        izmirMarsiCal();

      }

      else if (seciliSarki == 1) {

        istiklalMarsiCal();

      }

      else {

        happyBirthdayCal();

      }
    }
  }
}

*= DEĞİŞKEN