//PedalSwitch UNI © 2023 by Robin Pe is licensed under CC BY-NC-SA 4.0
#include <EEPROM.h>
#include <Wire.h>
#include <Adafruit_MCP4728.h>
Adafruit_MCP4728 dac;
// Adressen im EEPROM, an denen die Schalterstatus gespeichert werden
int switchStatusAddress = 0; // EEProm Adressse wo der letzte Status gespeichert wird
int buttonState = 0; // Aktuellen Zustand des Tasters
int buttonState2 = 0; // Aktuellen Zustand des Tasters für den Beep
int analogValue1 = 0; // Analoges Eingangssignal 1
int analogValue2 = 0; // Analoges Eingangssignal 2
int scaledValue1 = 0; // Analoges Ausgangssignal 1 auf MCP4728
int scaledValue2 = 0; // Analoges AUsgangssignal 2 auf MCP4728
const int ledPin1 = 2; // Ausgangspin für LED 1
const int ledPin2 = 3; // Ausgangspin für LED 2
const int safetyPin = 4; // Eingangspin für den Sicherheitseingang
const int buttonPin = 5; // Taster L
const int buttonPin2 = 6; // Taster R
const int buzzerPin = 7; // Buzzer
const int Pedal1_1 = A0; // Eingangspin 1 von Pedal 1
const int Pedal1_2 = A1; // Eingangspin 2 von Pedal 1
const int Pedal2_1 = A2; // Eingangspin 1 von Pedal 2
const int Pedal2_2 = A3; // Eingangspin 2 von Pedal 2
//MCP4728 SDA = A4 // Anschluss für MCP4728
//MCP4728 SCL = A5 // Anschluss für MCP4728
//Ausgang
//MCP4728 Board VA Signal 1
//MCP4728 Board VD Signal 2
bool safetyEnabled = true; // Sicherheit ist standardmäßig aktiviert
bool directionForward = true; // Überbleibsel als nur ein Taster benutzt werden sollte
bool buzzerBeep = true; // BUZZERBEEP
bool buzzerBeep2 = true; // BUZZERBEEP
void setup() {
Wire.begin();
dac.begin(0x60); // Die Adresse des MCP4728 kann je nach Konfiguration variieren.
pinMode(safetyPin, INPUT_PULLUP);
pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
// Laden des zuvor gespeicherten Schalterstatus aus dem EEPROM
directionForward = EEPROM.read(switchStatusAddress);
//Anzeige des aktuellen Status nach Neustart durch setzen der LEDs und abspielen der Tonausgabe
if (directionForward) {
tone(buzzerPin, 262, 25);
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
} else {
tone(buzzerPin, 262, 25);
delay(250);
tone(buzzerPin, 262, 25);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
}
}
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 der Taster
buttonState = digitalRead(buttonPin);
buttonState2 = digitalRead(buttonPin2);
if (buttonState == HIGH && buttonState2 == HIGH) {
delay(500); // Entprellen des Tasters
}
else {
if (buttonState == HIGH) {
delay(500); // Entprellen des Tasters
directionForward = true;
buzzerBeep = directionForward;
// Speichern des aktuellen Schalterstatus im EEPROM
EEPROM.write(switchStatusAddress, directionForward);
}
if (buttonState2 == HIGH) {
delay(500); // Entprellen des Tasters
directionForward = false;
buzzerBeep = directionForward;
// Speichern des aktuellen Schalterstatus im EEPROM
EEPROM.write(switchStatusAddress, directionForward);
}
}
//Einmal Piepen für linkes Pedal, zweimal Piepen für rechtes Pedal
if (directionForward == buzzerBeep) {
if (buzzerBeep2 == buzzerBeep) {
tone(buzzerPin, 262, 25);
buzzerBeep2 = buzzerBeep;
buzzerBeep = !buzzerBeep;
} else {
tone(buzzerPin, 262, 25);
delay(250);
tone(buzzerPin, 262, 25);
buzzerBeep = !buzzerBeep;
buzzerBeep2 = buzzerBeep;
}
}
// Lesen Sie den Zustand des Auswahlpins (HIGH oder LOW)
int selectState = directionForward;
// Je nach Zustand des Auswahlknopfs, schalte entweder Pedal L oder Pedal R auf den Ausgang
if (selectState == HIGH) {
digitalWrite(ledPin1, HIGH); // Schalte LED 1 ein, um anzuzeigen, dass linke Pedal aktiviert ist
digitalWrite(ledPin2, LOW); // Schalte LED 2 aus
analogValue1 = analogRead(Pedal1_1);
analogValue2 = analogRead(Pedal1_2);
scaledValue1 = map(analogValue1, 0, 1023, 0, 4095);
scaledValue2 = map(analogValue2, 0, 1023, 0, 4095);
dac.setChannelValue(MCP4728_CHANNEL_A, scaledValue1);
dac.setChannelValue(MCP4728_CHANNEL_D, scaledValue2);
} 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
analogValue1 = analogRead(Pedal2_1);
analogValue2 = analogRead(Pedal2_2);
scaledValue1 = map(analogValue1, 0, 1023, 0, 4095);
scaledValue2 = map(analogValue2, 0, 1023, 0, 4095);
dac.setChannelValue(MCP4728_CHANNEL_A, scaledValue1);
dac.setChannelValue(MCP4728_CHANNEL_D, scaledValue2);
}
} else { //Zündung an = keine Änderung am Schalter möglich
int selectState = directionForward;
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
analogValue1 = analogRead(Pedal1_1);
analogValue2 = analogRead(Pedal1_2);
scaledValue1 = map(analogValue1, 0, 1023, 0, 4095);
scaledValue2 = map(analogValue2, 0, 1023, 0, 4095);
dac.setChannelValue(MCP4728_CHANNEL_A, scaledValue1);
dac.setChannelValue(MCP4728_CHANNEL_D, scaledValue2);
} 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
analogValue1 = analogRead(Pedal2_1);
analogValue2 = analogRead(Pedal2_2);
scaledValue1 = map(analogValue1, 0, 1023, 0, 4095);
scaledValue2 = map(analogValue2, 0, 1023, 0, 4095);
dac.setChannelValue(MCP4728_CHANNEL_A, scaledValue1);
dac.setChannelValue(MCP4728_CHANNEL_D, scaledValue2);
}
}
// Eine kleine Verzögerung, um Stabilität sicherzustellen
delay(10);
}