#include <Wire.h> //QC
#include <Adafruit_MCP4728.h> //QC
#include <EEPROM.h> //QC
// Adressen im EEPROM, an denen die Schalterstatus gespeichert werden
int switchStatusAddress = 0; //QC
// Erstelle ein MCP4728-Objekt
Adafruit_MCP4728 dac; //QC
const int inputPin1 = A0; // Analoger Eingangspin für Signal 1 //QC
const int inputPin2 = A1; // Analoger Eingangspin für Signal 2 //QC
const int inputPin3 = A2; // Analoger Eingangspin für Signal 3 //QC
const int inputPin4 = A3; // Analoger Eingangspin für Signal 4 //QC
const int inputPin5 = A4; // Analoger Eingangspin für Signal 5 //QC
const int inputPin6 = A5; // Analoger Eingangspin für Signal 6 //QC
const int inputPin7 = A6; // Analoger Eingangspin für Signal 7 //QC
const int inputPin8 = A7; // Analoger Eingangspin für Signal 8 //QC
const int buzzerPin = 2; // Pin für Buzzer //QC
const int ledPin1 = 8; // Digitaler Ausgangspin für LED 1
const int ledPin2 = 9; // Digitaler Ausgangspin für LED 2
const int safetyPin = 6; // Digitaler Eingangspin für den Sicherheitseingang
const int buttonPin = 4; // Pin-Nummer des Tasters
int buttonState = 0; //QC // Variable, um den aktuellen Zustand des Tasters zu speichern
bool safetyEnabled = true; // Sicherheit ist standardmäßig aktiviert
bool directionForward = true; //QC // Variable, um die Richtung des Wechsels zu speichern (false = vorwärts, true = rückwärts)
bool buzzerBeep = true; //BUZZERBEEP QC
bool buzzerBeep2 = true; //BUZZERBEEP QC
void setup() {
// Initialisiere den I2C-Bus für den MCP4725
Wire.begin(); //QC
// Setze den MCP4728 auf die Standardadresse 0x60
dac.begin(0x60); //QC
pinMode(inputPin1, INPUT); //QC
pinMode(inputPin2, INPUT); //QC
pinMode(inputPin3, INPUT); //QC
pinMode(inputPin4, INPUT); //QC
pinMode(inputPin5, INPUT); //QC
pinMode(inputPin6, INPUT); //QC
pinMode(inputPin7, INPUT); //QC
pinMode(inputPin8, INPUT); //QC
pinMode(safetyPin, INPUT_PULLUP); //QC
pinMode(buttonPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
dac.setChannelValue(0, MCP4728_CHANNEL_A); //QC
dac.setChannelValue(0, MCP4728_CHANNEL_B); //QC
dac.setChannelValue(0, MCP4728_CHANNEL_C); //QC
dac.setChannelValue(0, MCP4728_CHANNEL_D); //QC
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
// Laden des zuvor gespeicherten Schalterstatus aus dem EEPROM
directionForward = EEPROM.read(switchStatusAddress); //QC
//Anzeige des aktuellen Status nach Neustart durch setzen der LEDs und abspielen der Tonausgabe
if (directionForward) { //QC
tone(2, 262, 25); //EMU
digitalWrite(ledPin1, HIGH); //QC
digitalWrite(ledPin2, LOW); //QC
} else { //QC
tone(2, 262, 25); //EMU
delay(250);
tone(2, 262, 25); //EMU
digitalWrite(ledPin1, LOW); //QC
digitalWrite(ledPin2, HIGH); //QC
}
}
void loop() {
// Lesen Sie den Zustand des Sicherheitseingangs (HIGH oder LOW)
int safetyState = digitalRead(safetyPin);
if (safetyState == HIGH) {
safetyEnabled = false;
} else {
safetyEnabled = true;
}
// Nur wenn die Sicherheit aktiviert ist, können wir zwischen Signal 1 und Signal 2 umschalten
if (safetyEnabled) {
// Lesen des aktuellen Zustands des Tasters
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
delay(500); // Entprellen des Tasters
directionForward = !directionForward;
buzzerBeep = directionForward;
// Speichern des aktuellen Schalterstatus im EEPROM
EEPROM.write(switchStatusAddress, directionForward); //QC
}
// Beep ausgabe beim umschalten 1x Beep für rechts, 2x Beep für links
//Lässt Buzzer einmal für 500ms Piepen
// Raus wegen EMUdigitalWrite (buzzerPin, HIGH);
// Raus wegen EMUdelay (50);
// Raus wegen EMUdigitalWrite (buzzerPin, LOW);
// Raus wegen EMUdelay (50);
// Raus wegen EMUdigitalWrite (buzzerPin, HIGH);
// Raus wegen EMUdelay (50);
// Raus wegen EMUdigitalWrite (buzzerPin, LOW);
// Raus wegen EMUdelay (50);
if (directionForward == buzzerBeep) {
if (buzzerBeep2 == buzzerBeep) {
tone(2, 262, 25); //EMU
buzzerBeep2 = buzzerBeep;
buzzerBeep = !buzzerBeep;
} else {
tone(2, 262, 25); //EMU
delay(250);
tone(2, 262, 25); //EMU
buzzerBeep = !buzzerBeep;
buzzerBeep2 = buzzerBeep;
}
}
// Lesen Sie die analogen Werte von den beiden Eingängen
int analogValue1 = analogRead(inputPin1); //QC
int analogValue2 = analogRead(inputPin2); //QC
int analogValue3 = analogRead(inputPin3); //QC
int analogValue4 = analogRead(inputPin4); //QC
int analogValue5 = analogRead(inputPin5); //QC
int analogValue6 = analogRead(inputPin6); //QC
int analogValue7 = analogRead(inputPin7); //QC
int analogValue8 = analogRead(inputPin8); //QC
// Lesen Sie den Zustand des Auswahlpins (HIGH oder LOW)
int selectState = directionForward;
// Je nach Zustand des Auswahlpins, schalte entweder Signal 1 oder Signal 2 auf den MCP4725 DAC-Ausgang
if (selectState == HIGH) {
digitalWrite(ledPin1, HIGH); // LOW Pin 8 = Links Schalte LED 1 ein, um anzuzeigen, dass linke Pedal aktiviert ist
digitalWrite(ledPin2, LOW); // Schalte LED 2 aus
// Schalte Signal 1,3,5, und 7 auf die MCP4728 DAC-Ausgänge
dac.setChannelValue(analogValue1, MCP4728_CHANNEL_A); // false bedeutet, dass der Wert nicht in den EEPROM des MCP4725 gespeichert wird //QC
dac.setChannelValue(analogValue3, MCP4728_CHANNEL_B); //QC
dac.setChannelValue(analogValue5, MCP4728_CHANNEL_C); //QC
dac.setChannelValue(analogValue7, MCP4728_CHANNEL_D); //QC
} else {
digitalWrite(ledPin1, LOW); // Pin 9 = rechts Schalte LED 1 aus
digitalWrite(ledPin2, HIGH); // HIGH Schalte LED 2 ein, um anzuzeigen, dass rechte Pedal aktiviert ist
// Schalte Signal 2,4,6 und 8 auf die MCP4728 DAC-Ausgänge
dac.setChannelValue(analogValue2, MCP4728_CHANNEL_A); // false bedeutet, dass der Wert nicht in den EEPROM des MCP4725 gespeichert wird //QC
dac.setChannelValue(analogValue4, MCP4728_CHANNEL_B); //QC
dac.setChannelValue(analogValue6, MCP4728_CHANNEL_C); //QC
dac.setChannelValue(analogValue8, MCP4728_CHANNEL_D); //QC
}
}
// Eine kleine Verzögerung, um Stabilität sicherzustellen
delay(10);
}