maeckes:
Also das Dir das jemand programmiert, wird glaub ich nicht klappen 
Dann kennst Du aber noch nicht die "erweiterten Beispielprogramme" die User 'jurs' hier im Forum von Zeit zu Zeit postet.
Zum Beispiel auch für eine Ablaufsteuerung:
// Ventilsteuerung Cocktails by 'jurs' for German Arduino Forum
#define SPRITARTEN 6
#define COCKTAILARTEN 6
#define EIN LOW
#define AUS HIGH
int startPins[COCKTAILARTEN]={2,3,4,5,6,7};
int pumpenPins[SPRITARTEN]={8,9,10,11,12,13};
int MaiTai[SPRITARTEN]={30,15,0,15,15,60};
int GoldenGirl[SPRITARTEN]={0,0,30,30,0,60};
void setup()
{
int i;
Serial.begin(9600); // Serielle Schnittstelle mit 9600 Baud starten
Serial.println("Ventilsteuerung gestartet");
for (i=0;i<COCKTAILARTEN;i++) pinMode(startPins[i],INPUT_PULLUP);
for (i=0;i<SPRITARTEN;i++)
{
digitalWrite(pumpenPins[i], AUS);
pinMode(pumpenPins[i],OUTPUT);
}
}
void ablaufSteuerung(char* name, int* pumpzeit)
{
long laufzeit[SPRITARTEN];
long maxlaufzeit=0;
// Pumpzeit von Sekunden in Millisekunden umrechnen und Gesamtdauer feststellen
for (int i=0;i<SPRITARTEN;i++)
{
laufzeit[i]=1000L*pumpzeit[i];// Sekunden in Millisekunden umrechnen
if (laufzeit[i]>maxlaufzeit) maxlaufzeit=laufzeit[i];
}
Serial.print("Gesamtdauer zum Mixen von ");Serial.print(name);
Serial.print(" = ");Serial.print(maxlaufzeit/1000);Serial.println(" Sekunden");
Serial.println("Millis\tPumpe\tEIN/AUS");
delay(100); // Zum Senden der vorherigen Serial-Ausgaben
unsigned long startTime=millis();
do
{
for (int i=0;i<SPRITARTEN;i++)
{
if (millis()-startTime<laufzeit[i])
{
if (digitalRead(pumpenPins[i])!=EIN)
{
digitalWrite(pumpenPins[i],EIN);
Serial.print(millis()-startTime);Serial.print("\t");Serial.print(i);Serial.println("\tEIN");
}
}
else
{
if (digitalRead(pumpenPins[i])!=AUS)
{
digitalWrite(pumpenPins[i],AUS);
Serial.print(millis()-startTime);Serial.print("\t");Serial.print(i);Serial.println("\tAUS");
}
}
}
if (millis()-startTime>maxlaufzeit) break;
} while(1);
Serial.println("fertig!\r\n");
}
void loop() {
if (digitalRead(startPins[0])==LOW)
ablaufSteuerung("Mai Tai",MaiTai);
else if (digitalRead(startPins[1])==LOW)
ablaufSteuerung("Golden Girl",GoldenGirl);
}
Annahmen über die Hardware:
-
Die Button-Pins seien ohne Pulldown-Widerstände angeschlossen, im Setup werden die internen PullUps aktiviert. So kann man die Simulation auf Serial starten, indem man als "Tastendruck" einfach einen Draht zwischen GND und Pin-2, Pin-3 etc. dranhält, um einen Tastendruck zu simulieren.
-
Die Relais seien "Active LOW" schaltend, also schalten auf LOW. Kann man natürlich im Quellcode leicht ändern, indem die Definitionen für EIN und AUS vertauscht werden.
Wie immer ist bei solchen Dingen die Wahl einer geeigneten Datenstruktur entscheidend. Ich habe mich einfach dazu entschlossen, für jeden Cocktail die Pumpzeiten jeder Pumpe in ein Array zu packen:
int MaiTai[SPRITARTEN]={30,15,0,15,15,60};
int GoldenGirl[SPRITARTEN]={0,0,30,30,0,60};
Wenn eine Pumpe bei einem Cocktail nicht gefeuert werden soll, ist die Zeit für diese Pumpe eben 0.
Viel Spaß beim Saufen!