So, hier einmal ein Sketch der es tun sollte (zumindest in der Theorie/Simulation):
const byte NullZwoPin = 11;
const byte NullDreiPin = 12;
const byte NullVierPin = 13;
const byte BeeperPin = 8;
enum LiterType {
NICHTS,
NULLZWO,
NULLDREI,
NULLVIER,
};
byte Value = NICHTS;
byte lastValue = NICHTS;
byte beepCount = 0;
int Frequency = 2000; // [Hz]
int Duration = 75; // [ms]
int Pause = 100; // [ms]
unsigned long lastToneTime = 0;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
pinMode(NullZwoPin,INPUT);
pinMode(NullDreiPin,INPUT);
pinMode(NullVierPin,INPUT);
}
void loop()
{
CheckEvery(50);
Evaluate();
Play();
}
void CheckEvery(unsigned long CheckTime){
static unsigned long lastCheckTime = 0;
if (millis()-lastCheckTime >= CheckTime){
lastCheckTime = millis();
CheckPins();
}
}
void CheckPins(){
if (digitalRead(NullZwoPin)) Value = NULLZWO;
if (digitalRead(NullDreiPin)) Value = NULLDREI;
if (digitalRead(NullVierPin)) Value = NULLVIER;
}
void Evaluate(){
if (Value == lastValue) return;
noTone(BeeperPin);
lastToneTime = 0;
switch(Value){
case NULLZWO :
Serial.println("0.2l");
beepCount = 1;
break;
case NULLDREI :
Serial.println("0.3l");
beepCount = 2;
break;
case NULLVIER :
Serial.println("0.4l");
beepCount = 3;
break;
default:
break;
}
lastValue = Value;
}
void Play(){
if (beepCount > 0 && millis()-lastToneTime > Duration + Pause) {
lastToneTime = millis();
beepCount--;
tone(BeeperPin, Frequency, Duration);
}
}
Schaltung wie folgt:
Zum Ausprobieren hier: https://wokwi.com/projects/328835024040231507
Die Taster verhalten sich natürlich nicht ganz so wie ein Optokoppler, daher abwarten, ob es gleich funktioniert... Der Sketch kommt damit zurecht, dass
a) kein Taster betätigt ist (die LED des Automaten alle nicht leuchten) und
b) einer der Taster dauerhaft betätigt wird (LED am Automaten leuchtet länger/dauerhaft)
Die Tonausgabe ist ohne Delay() ausgeführt, so dass eine Neuwahl die alte Tonfolge abbricht und die neue startet. Wie sich das in der Praxis anhört, wäre zu testen.
Ansonsten sind die Optokoppler-Anschlüsse so mit der Pinseiten und 5V zu verbinden, wie die Taster in dieser Testschaltung. Das sollte kein Problem darstellen.
Was ich tun kann/konnte, ist m.E. getan.
Viel Erfolg und bitte Vorsicht beim Basteln am offenen Gerät sowie der internen Verlegung von Kabeln!
P.S.: Wie man im Sketch sieht, "gewinnt" im Fehlerfall die Ausgabe für die größere Liefermenge ...