OneButton Library Schalter mit Priorität und && Abfrage

Hallo liebe Arduino-begeisterte :slight_smile:

Ich möchte ein Cocktailmaschine, die zwei Getränke zusammenmixt von Zeitrelais auf Arduino umrüsten.
Das was ich jetzt hier beschreibe habe ich mit der OneButton Library umgesetzt und funktioniert auch soweit (un eingebaut)

Dazu habe ich 3 IR-Sensoren zur Verfügung. Sensor1 befindet sich ganz rechts vom Fließband, sobald ein Glas auf das Fliesband gestellt wird löst dieser aus und startet das Fließband. Das Fließband läuft solange, bis Sensor2 das Glas erfasst, dann bleibt das Band stehen und öffnet nach kurzer Pause Ventil1, durch dem das erste Getränk fließt. Nach einer gewissen Zeit schließt das Ventil, wartet kurz und das Band fährt dann weiter und Wiederholt das selbe nur mit längerer Standzeit für das zweite Getränk. Ist das 2 Getränk eingefüllt, fährt das Fließband solange weiter bis das Glas gegen Sensor3 (Endschalter)kommt und zum Stillstand gebracht wird.
Um Ventile und Motor für Fließband anzusteuern benutze ich eine Vierer Relaiskarte welche anscheinend eine umgekehrte Logik haben, also habe ich HIGH statt LOW und umgekehrt geschrieben.

Soweit zur Funktion / Arbeitsablauf...

Mein Größtes Problem ist es das wenn ein Glas fertig befüllt gegen den Endschalter fährt, und ganz links vom Fließband stehen bleibt.
Wenn nun Rechts ein neues Glas auf das Fließband gestellt wird, fährt das Band los und das befüllte Glas fällt links runter vom Fließband
Das habe ich versucht mit dem Operator Ungleich zu lösen in dem ich Sensor1 und Sensor3 auf Ungleichheit überprüfe, was jedoch nicht geklappt hat.

Mein Zweites Problem ist das Sensor2 nur auslösen soll, wenn vorher Sensor1 ausgelöst wurde, um zu vermeiden das wenn jemand ans Sensor2 kommt die Ventile öffnen, obwohl gar kein Glas darunter steht.
Das wäre am besten mit der && Funktion zu ermöglichen oder?

Ich hoffe die Funktion der Maschine wird an meinen Sketch klarer.
Sorry fals ich einiges unverständlich oder umständlich geschrieben habe, ich bin noch Anfänger und das ist mein erstes Arduino Projekt .
Ich bin für alle Tipps dankbar!
Gruß
Bastian

#include "OneButton.h"

// Setup a new OneButton on pin A1.
OneButton button1(A1, true);
// Setup a new OneButton on pin A2.
OneButton button2(A2, true);
// Setup a new OneButton on pin A3.
OneButton button3(A3, true);

const int Fliessband = 11;
const int Getraenk1 = 12;
const int Getraenk2 = 10;

// setup code here, to run once:
void setup() {
pinMode(Fliessband, OUTPUT);
pinMode(Getraenk1, OUTPUT);
pinMode(Getraenk2, OUTPUT);

// link the button 1 functions.
button1.attachDuringLongPress(longPress1);

button1.setPressTicks(1);

// link the button 2 functions.
button2.attachDuringLongPress(longPress2);

button2.setPressTicks(1);

// link the button 3 functions.
button3.attachDuringLongPress(longPress3);

button3.setPressTicks(1);

digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, HIGH);

} // setup

// main code here, to run repeatedly:
void loop() {
// keep watching the push buttons:
button1.tick();
button2.tick();
button3.tick();

} // loop

void longPress1() {
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, LOW);

} // click1

void longPress2() {
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, HIGH);
delay(1000);
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, LOW);
digitalWrite(Fliessband, HIGH);
delay(2000);
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, HIGH);
delay(1000);
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, LOW);
delay(4000);
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, HIGH);
delay(1000);
digitalWrite(Getraenk2, LOW);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, HIGH);
delay(2000);
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, HIGH);
delay(1000);
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, LOW);

}

void longPress3() {
digitalWrite(Getraenk2, HIGH);
digitalWrite(Getraenk1, HIGH);
digitalWrite(Fliessband, HIGH);
}

kann man die delay vermeiden?
du solltest etwas abfragen, dass den kompletten prozess nur zulässt, wenn er vom startpunkt gestartet wurd. und erst resettet wird, wenn das glas entnommen wurde, also auch. schritte durchlaufen sind. oder ein manueller reset erfolgte.

Was du brauchst ist ein sog. Endlicher Automat, auch Zustandsautomat oder State Machine genannt: Statemachine – Mikrocontroller.net.
Das ist ein "Programmierkonzept" für Ablaufsteuerungen. Ein Cocktailautomat "schreit" quasi nach so einem Steuerkonzept. :slight_smile:
Eine State Machine würde auch dafür sorgen, dass Sensor2 nur auslösen kann, nachdem vorher Sensor1 ausgelöst wurde und so weiter.