#define ENCODER_CLK 12
#define ENCODER_DT 11
int counterPlay = 1; // Encoder számláló Play állás alap
int counterRec = 1; // Encoder számláló Rec állás alap
bool PrevModeButton; // Encoder gomb kezeléséshez
bool ActModeButton; // szintén
bool ModeState = HIGH; // szintén (PLAY induláskor)
bool PrevDirectButton; // Direct gomb kezeléséhez
bool ActDirectButton; // szintén
bool led1State = LOW; // szintén
bool PrevMuteButton; // Mute gomb kezeléséhez
bool ActMuteButton; // szintén
bool led2State = LOW; // szintén
bool PrevMonoButton; // Mono gomb kezeléséhez
bool ActMonoButton; // szintén
bool led3State = LOW; // szintén
bool PrevLoudButton; // Loudness gomb kezeléséhez
bool ActLoudButton; // szintén
bool led4State = LOW; // szintén
#define latchPinPlay 49 // Play : Adat kiiras lab
#define clockPinPlay 48 // Play : Orajel lab
#define dataPinPlay 47 // Play : Adat láb
#define latchPinRec 53 // Rec : Adat kiiras lab
#define clockPinRec 52 // Rec : Orajel lab
#define dataPinRec 51 // Rec : Adat láb
int beforePlayKapcsolo = 0; // Annak ellenőrzése, hogy 2x ne kapcsoljon ugyanannál az állásnál
int beforeRecKapcsolo = 0; // Annak ellenőrzése, hogy 2x ne kapcsoljon ugyanannál az állásnál
bool buttonState; // the current reading from the input pin
bool lastButtonState = LOW; // the previous reading from the input pin
unsigned long endTime; // Az adatküldés késleltetéséhez
unsigned long endTime1; // Az kijelző kikapcsolásához
bool displayOn = 1; // OLED kijelző felkapcsolása
bool kesleltetes = 1; // Flag, az első akció figyelésére (ami kimarad)
int katt = 0; // A késleltetett adatküldés miatt szükséges a 3 állapot (kikapcs, play, rec)
bool BToutStatePlay = 0; // Bluetooth kártya induló állapot (kikapcsolva)
bool BToutStateRec = 0; // Bluetooth kártya induló állapot (kikapcsolva)
// Kapcsolo címek tömbje bitben
uint16_t kapcsolopozicio[9] = { 0b0000000000111000, // Minden kikapcs
0b0010000000111000, // CD
0b0001000000111000, // Tape-1
0b0000100000111000, // Tape-2
0b0000010000111000, // Aux-1
0b0000001000111000, // Aux-2
0b0000000100111000, // Tuner
0b0000000010111000, // Phono
0b0000000001111000 }; // Bluetooth
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 25;
int lastClk = HIGH;
void setup() {
pinMode(ENCODER_CLK, INPUT); // encoder tekerő órajel láb
pinMode(ENCODER_DT, INPUT); // encoder tekerő adat láb
pinMode(10, INPUT); // Encoder gombja
pinMode(A1, INPUT); // Direct imput gombja
pinMode(A2, INPUT); // MUTE gomb
pinMode(A0, INPUT); // MONO gomb
pinMode(A14, OUTPUT); // PLAY / REC kimenet vezérlése (DG419 felé)
pinMode(5, INPUT); // szenzor érzékelő 1
pinMode(A8, OUTPUT); // Direct input alapba
digitalWrite(A8, LOW); // Direct input alapba
pinMode(A9, OUTPUT); // MUTE input alapba
digitalWrite(A9, LOW); // MUTE input alapba
pinMode(A10, OUTPUT); // MONO-STEREO input alapba
digitalWrite(A10, LOW); // MONO-STEREO input alapba
pinMode(A11, OUTPUT); // OLED output bekapcs
digitalWrite(A11, HIGH); // OLED output bekapcs
pinMode(A5, OUTPUT); // Bluetooth kártya állapot visszajelzés
digitalWrite(A5, LOW); // Bluetooth kártya állapot visszajelzés
pinMode(A6, OUTPUT); // Tape1 monitor kapcsolo (csak felvételnél)
digitalWrite(A6, HIGH); // Tape1 monitor kapcsolo (csak felvételnél)
pinMode(A7, OUTPUT); // Tape2 monitor kapcsolo (csak felvételnél)
digitalWrite(A7, HIGH); // Tape2 monitor kapcsolo (csak felvételnél)
pinMode(latchPinPlay, OUTPUT); // Play IC kapcsoló adat kimenete
pinMode(clockPinPlay, OUTPUT); // szintén
pinMode(dataPinPlay, OUTPUT); // szintén
pinMode(latchPinRec, OUTPUT); // Rec IC kapcsoló adat kimenete
pinMode(clockPinRec, OUTPUT); // szintén
pinMode(dataPinRec, OUTPUT); // szintén
Serial.begin(9600);
PlayIcData(1); // Induláskor a Play IC 1-es bemenetének bekapcsolása.
RecIcData(1); // Induláskor a Rec IC 1-es bemenetének bekapcsolása.
DDRA = 0xFF; // Az A digitális kimeneteket mind OUTra állítja
DDRC = 0xFF; // A C digitális kimeneteket mind OUTra állítja
digitalWrite(37, HIGH); // BS2 -- 6800 paralel mod beállítása
digitalWrite(34, LOW); // BS1 -- 6800 paralel mod beállítása
digitalWrite(35, LOW); // BS0 -- 6800 paralel mod beállítása
digitalWrite(36, LOW); // R/W - alacsony : mindig írás
}
void loop() {
// Encoder tekerő kiértékelése és a play-rec outputok számlálása
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk) {
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) {
endTime = millis() + 1500; // 1 katt-ra beolvasom az időt és hozzá adom a késleltetést
if (ModeState == 0) {
if (kesleltetes == 1) {
kesleltetes =0;
displayOn = 1; // OLED felkapcsolása
} else {
displayOn = 1; // OLED felkapcsolása
counterPlay++;
if (counterPlay == 9) counterPlay = 1;
katt = 1;
encoderSwitch();
}
// ebben a sorban ki kell írni a kijelzőre a következő bemenetet
}
if (ModeState == 1) {
if (kesleltetes == 1) {
kesleltetes =0;
displayOn = 1; // OLED felkapcsolása
} else {
displayOn = 1; // OLED felkapcsolása
counterRec++;
if (counterRec == 9) counterRec = 1;
katt = 2;
encoderSwitch();
}
// ebben a sorban ki kell írni a kijelzőre a következő bemenetet
}
}
if (newClk == LOW && dtValue == LOW) {
endTime = millis() + 1500; // 1 katt-ra beolvasom az időt és hozzá adom a késleltetést
if (ModeState == 0) {
if (kesleltetes == 1) {
kesleltetes =0;
displayOn = 1; // OLED felkapcsolása
} else {
displayOn = 1; // OLED felkapcsolása
counterPlay--;
if (counterPlay == 0) counterPlay = 8;
katt = 1;
encoderSwitch();
}
// ebben a sorban ki kell írni a kijelzőre a következő bemenetet
}
if (ModeState == 1) {
if (kesleltetes == 1) {
kesleltetes =0;
displayOn = 1; // OLED felkapcsolása
} else {
displayOn = 1; // OLED felkapcsolása
counterRec--;
if (counterRec == 0) counterRec = 8;
katt = 2;
encoderSwitch();
}
// ebben a sorban ki kell írni a kijelzőre a következő bemenetet
}
}
}
// Késleltett bemeneti IC átkapcsolás - play
if (endTime <= millis() && katt == 1) {
if (counterPlay == 8) {
digitalWrite(A5, HIGH);
BToutStatePlay = 1;
}
if (BToutStateRec == 0 && counterPlay != 8) {
digitalWrite(A5, LOW);
BToutStatePlay = 0;
}
PlayIcData(counterPlay);
katt = 0;
Serial.print(" | Adatküldés!");
}
// Késleltett bemeneti IC átkapcsolás - rec
if (endTime <= millis() && katt == 2) {
if (counterRec == 8) {
digitalWrite(A5, HIGH);
BToutStateRec = 1;
}
if (BToutStatePlay == 0 && counterRec != 8) {
digitalWrite(A5, LOW);
BToutStateRec = 0;
}
RecIcData(counterRec);
katt = 0;
Serial.print(" | Adatküldés!");
}
// A bemenet választás váltás-késleletetése 1.5mp-el
if (endTime1 < millis()) {
digitalWrite(A11, LOW); // 1.5mp adatkiírás késleltetése
kesleltetes = 1;
}
// A kijelző kikapcsolása a beállított érték múlva
if (displayOn == 1) {
endTime1 = millis() + 8000; // A 8mp OLED kikapcsolásának időalapja
digitalWrite(A11, HIGH); // OLED kikapcs
kesleltetes = 0;
displayOn = 0;
}
// Encoder gomb kezelése - késleltetés, feléleszti a kijelzőt, nincs ledes visszajelzés!
if (digitalRead(10) != PrevModeButton) {
lastDebounceTime = millis();
PrevModeButton = digitalRead(10);
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (ActModeButton != PrevModeButton) {
ActModeButton = PrevModeButton;
if (ActModeButton == HIGH) {
if (kesleltetes == 1) {
kesleltetes = 0;
displayOn = 1;
} else {
displayOn = 1;
ModeState = !ModeState;
encoderSwitch();
}
}
}
}
// Direct Input gomb kezelése (A1) - nincs késleltetés, nem éleszti a kijelzőt, van ledes visszajelzés is!
if (digitalRead(A1) != PrevDirectButton) {
lastDebounceTime = millis();
PrevDirectButton = digitalRead(A1);
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (ActDirectButton != PrevDirectButton) {
ActDirectButton = PrevDirectButton;
if (ActDirectButton == HIGH) {
led1State = !led1State;
digitalWrite(A8, led1State);
}
}
}
// Mute gomb kezelése (A2) - nincs késleltetés, feléleszti a kijelzőt, van ledes visszajelzés is!
if (digitalRead(A2) != PrevMuteButton) {
lastDebounceTime = millis();
PrevMuteButton = digitalRead(A2);
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (ActMuteButton != PrevMuteButton) {
ActMuteButton = PrevMuteButton;
if (ActMuteButton == HIGH) {
displayOn =1;
led2State = !led2State;
digitalWrite(A9, led2State);
if (led2State == HIGH) {
PlayIcData(0);
RecIcData(0);
} else {
PlayIcData(counterPlay);
RecIcData(counterRec);
}
}
}
}
// Mono gomb kezelése (A0) - nincs késleltetés, nem éleszti a kijelzőt, van ledes visszajelzés is!
if (digitalRead(A0) != PrevMonoButton) {
lastDebounceTime = millis();
PrevMonoButton = digitalRead(A0);
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (ActMonoButton != PrevMonoButton) {
ActMonoButton = PrevMonoButton;
if (ActMonoButton == HIGH) {
led3State = !led3State;
digitalWrite(A10, led3State);
}
}
}
// Loudness gomb kezelése (A4) - nincs késleltetés, nem éleszti a kijelzőt, van ledes visszajelzés is!
if (digitalRead(A4) != PrevLoudButton) {
lastDebounceTime = millis();
PrevLoudButton = digitalRead(A4);
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (ActLoudButton != PrevLoudButton) {
ActLoudButton = PrevLoudButton;
if (ActLoudButton == HIGH) {
led4State = !led4State;
digitalWrite(A15, led4State);
}
}
}
// Infra érzékelő - szimulációja - nincs késleltetés, feléleszti a kijelzőt, nincs ledes visszajelzés!
bool sensor1 = digitalRead(A3);
if (sensor1 != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (sensor1 != buttonState) {
buttonState = sensor1;
if (buttonState == HIGH) {
displayOn = 1;
}
}
}
lastButtonState = sensor1;
// Serial.print("infraBal : ");
// Serial.print(infraBal);
// Serial.print(" | ");
// Serial.print("oledON : ");
// Serial.print(oledON);
// Serial.print(" | ");
// Serial.print("timerFlag : ");
// Serial.print(timerFlag);
// Serial.println();
// Serial.print("led3State : ");
// Serial.print(led3State);
}
// Adatkiírás a play ICnek
void PlayIcData (int PlayKapcsolo) {
if (beforePlayKapcsolo != PlayKapcsolo) {
digitalWrite(latchPinPlay, LOW);
shiftOut(dataPinPlay, clockPinPlay, MSBFIRST, kapcsolopozicio[PlayKapcsolo] >> 8);
shiftOut(dataPinPlay, clockPinPlay, MSBFIRST, kapcsolopozicio[PlayKapcsolo]);
digitalWrite(latchPinPlay, HIGH);
beforePlayKapcsolo = PlayKapcsolo;
}
}
// Adatkiírás a REC ICnek
void RecIcData (int RecKapcsolo) {
if (beforeRecKapcsolo != RecKapcsolo) {
if (RecKapcsolo == 2) { // Ha Tape1 van akkor Tape1Rec OFF
digitalWrite(A6, LOW);
} else {
digitalWrite(A6, HIGH);
}
if (RecKapcsolo == 3) { // Ha Tape2 van akkor Tape2Rec OFF
digitalWrite(A7, LOW);
} else {
digitalWrite(A7, HIGH);
}
digitalWrite(latchPinRec, LOW);
shiftOut(dataPinRec, clockPinRec, MSBFIRST, kapcsolopozicio[RecKapcsolo] >> 8);
shiftOut(dataPinRec, clockPinRec, MSBFIRST, kapcsolopozicio[RecKapcsolo]);
digitalWrite(latchPinRec, HIGH);
beforeRecKapcsolo = RecKapcsolo;
}
}
void encoderSwitch() {
if (ModeState == 0) {
digitalWrite(A14, HIGH); // PLAY / REC kimenet vezérlése (DG419 felé)
Serial.println(" ");
Serial.print("> PLAY ");
Serial.print(" | counter_play: ");
Serial.print(counterPlay);
Serial.print(" | counter_Rec: ");
Serial.print(counterRec);
}
if (ModeState == 1) {
digitalWrite(A14, LOW); // PLAY / REC kimenet vezérlése (DG419 felé)
Serial.println(" ");
Serial.print("> REC ");
Serial.print(" | counter_play: ");
Serial.print(counterPlay);
Serial.print(" | counter_Rec: ");
Serial.print(counterRec);
}
}
Kék : Direct - OK!
Zöld : MUTE - OK!
Sárga : MONO - OK!
Fekete : Loudness - OK!
jobb-bal : bemenet választás
gomb : play / rec választás
infra érzékelő
0=semmi / 1=valami
OLED BE / KI
Bluetooth aktiváló kimenet
kimenet vezérlés PLAY/REC
Tape1
REC
tiltás
Tape2
REC
tiltás
Loudnes on/off
BT card PS
ON/OFF
BT card button
ON/OFF