Hilfe bei Ablaufsteuerung

moin!
ich brauche eine ablaufsteuerung die dafür zuständig sein soll :
Tropfenfotos :wink:

hardwareseitig absolut kein thema...
aber mit programmierung kenn ich mich nicht aus :cold_sweat:
ich habe hier den arduino uno liegen und schaffe es damit led blinken zu lassen :grin: stolz bin
dann hört es aber leider auch schon auf :~

was soll gemacht werden ?
-starttaster drücken
-2s vergehen
-ventil 1 schaltet ab hier nach bestimmter zeit (300ms) zu und für zb 30ms (wichtig!)
-kamera schaltet (impuls reicht)
-vebtil 2 schaltet nach bestimmter zeit zu und für zb 20ms
-ventil 3 schaltet nach bestimmter zeit zu und für zb 40ms
-ende

es wäre schön wenn man das prozedere zb. 5x nacheinander ablaufen lassen könnte und dann gehts von vorn los.
ventil 2+3 müssen auch abwählbar sein da nicht immer benötigt.
das ganze muss auch sehr genau ablaufen. hab gelesen das bestimmte befehle den MC mehr beschäftigen so das es zu verzögerungen kommt...

mein bisheriges sketch sieht so aus:

//ventilsteuerung

int startPin = 13;
int ventil1Pin = 12;
int ventil2Pin = 11;
int ventil3Pin = 10;
int kameraPin = 9;


void setup() {
pinMode(startPin, INPUT);   
pinMode(ventil1Pin, OUTPUT);
pinMode(ventil2Pin, OUTPUT); 
pinMode(ventil2Pin, OUTPUT);
pinMode(kameraPin, OUTPUT);
  
}  
  
void loop() {  
  
if (digitalRead(startPin)==HIGH) {
  delay(2000);
  digitalWrite(ventil1Pin,HIGH);
  } else
  // Anweisungsblock für falsch
  digitalWrite(ventil1Pin,LOW);  
  
}

kann mir einer der alten hasen dabei helfen ?
vielen dank im voraus!
lg Dirk

Dirk3000:
aber mit programmierung kenn ich mich nicht aus :cold_sweat:
ich habe hier den arduino uno liegen

Den Pin-13, an dem eine LED hängt, kannst Du nur auf Boards vom Typ "UNO R3" problemlos als Input verwenden.
Hast Du einen "UNO R3" oder vielleicht ein älteres Board?

Im Zweifelsfall lieber als INPUT einen anderen Pin als 13 für verwenden!
Nur beim UNO R3 kann Pin-13 problemlos auch als INPUT verwendet werden.

Bei solchen Abläufen wie Du es vorhast, ist die Wahl einer passenden Datenstruktur die halbe Miete. Ich habe dir mal ein Programmbeispiel gemacht, bei dem zu einer bestimmten "Startzeit" (die über einen Input-Button festgelegt wird) bis zum Ablauf einer Gesamtzeit eine Abfolge von Schaltvorgängen ausgelöst wird.

Die Schaltvorgänge sind in einem struct-Array definiert, wobei jedes Array-Element drei Variablen enthält:

  • pin ==> Legt fest, welcher Pin geschaltet werden soll
  • vorlaufzeit ==> Legt fest, nach welcher Zeit ab Start gerechnet eingeschaltet werden soll
  • dauer ==> legt die Dauer der Einschaltzeit fest

Da Du die Timings offenbar in Millisekunden festlegen möchtest, aber der millis() Timer nicht auf die Millisekunde genau läuft, habe ich die Variablen so festgelegt, dass Du in der Datenstruktur zwar Millisekunden vorgibst, aber im Setup werden diese Werte in Mikrosekunden umgerechnet und im Programm dann nach dem Stand des micros() Timers geschaltet. Die erzielbare Schaltgenauigkeit mit diesem Code sollte bei ca. +/-0,5ms liegen.

Vielleicht kannst Du was damit anfangen.

//Ventilsteuerung by 'jurs' for German Arduino Forum
// (Code ist ungetestet)

int startPin = 3;
int ventil1Pin = 12;
int ventil2Pin = 11;
int ventil3Pin = 10;
int kameraPin = 9;


struct hardware_t{int pin;long vorlaufzeit; long dauer;};

hardware_t hardware[]={
  {ventil1Pin, 2000, 300},
  {ventil2Pin, 2300, 20},
  {ventil3Pin, 2350, 40},
  {kameraPin,  2310, 2},
};

int schritte=sizeof(hardware)/sizeof(hardware[0]);
unsigned long gesamtDauer;

void setup() 
{
  Serial.begin(9600); // Serielle Schnittstelle mit 9600 Baud starten
  Serial.println("Ventilsteuerung gestartet");
  pinMode(startPin, INPUT);   // startPin auf INPUT setzen
  gesamtDauer=0; // Gesamtdauer des längsten Schaltschritts ermitteln
  for (int i=0;i<schritte;i++)
  {
    pinMode(hardware[i].pin,OUTPUT); // Pin auf OUTPUT setzen
    hardware[i].vorlaufzeit*=1000;   // Millisekunden zu Mikrosekunden
    hardware[i].dauer*=1000;         // Millisekunden zu Mikrosekunden
    if (hardware[i].vorlaufzeit+hardware[i].dauer>gesamtDauer)
      gesamtDauer=hardware[i].vorlaufzeit+hardware[i].dauer;
  }
  Serial.print("Gesamtdauer: ");
  Serial.print(gesamtDauer/1000);
  Serial.print(" ms = ");
  Serial.print(gesamtDauer);
  Serial.println(" Mikrosekunden");
}  

void loop() {  
  unsigned long starttime;
  unsigned long looptime;
  if (digitalRead(startPin)==HIGH)
  {
    Serial.println("Started...");
    starttime=micros();
    while (micros()-starttime<gesamtDauer) // Jetzt läuft die Steuerschleife
    {
      looptime=micros()-starttime;
      for (int i=0;i<schritte;i++)
      {
        if (looptime>=hardware[i].vorlaufzeit && looptime<hardware[i].vorlaufzeit+hardware[i].dauer)
          digitalWrite(hardware[i].pin,HIGH);
        else  
          digitalWrite(hardware[i].pin,LOW);
      }
    }
    // Nur zur Sicherheit nochmal alles abschalten
    for (int i=0;i<schritte;i++)
    {
      digitalWrite(hardware[i].pin,LOW);
    }    
    Serial.println("Finished...");
  }  
}

Und dran denken: Die Vorlaufzeiten in der Datenstruktur gelten für jede angesteuerte Hardware ab Startzeit, also nicht relativ zu irgendeiner anderen Hardware, sondern ab Auslösung durch den INPUT! Die Reihenfolge, in der die Hardware in der Datenstruktur steht (z.B. Kamera am Ende) ist ohne Belang, es kommt nur auf die eingetragenen Vorlaufzeiten ab der Startzeit an, wann eine bestimmte Hardware geschaltet wird. Testen konnte ich das mangels vorliegender Hardware allerdings nicht vollständig.

Nachtrag: Bestimmte Hardware "abwählen" kannst Du, indem Du Kommentarstriche // vor die entsprechenden Zeilen der Datenstruktur setzt.

oooh super!

habs gerade mal getestet macht das was es soll... nuuur
keine reaktion auf den starttaster.
es läuft von alleine ohne zutun los.
und es hört auch nicht mehr auf :grin:
ist also in dauerschleife :roll_eyes:

hab ein wenig rumprobiert... ist aber alles außer besser geworden pfeif

könntest du das noch hinbiegen ?

achja ich habe den arduiono uno r3. habs aber auf pin3 belassen. ist ja ansich auch wurst.

Wie hast Du den Taster angeschlossen? Nach GND, mit Pullup ....?

Dirk3000:
habs gerade mal getestet macht das was es soll... nuuur
keine reaktion auf den starttaster.
es läuft von alleine ohne zutun los.
und es hört auch nicht mehr auf :grin:
ist also in dauerschleife :roll_eyes:

Soviel also zum Thema "hardwareseitig absolut kein thema...".

Falls Du für den Starttaster den "PullDown" Widerstand "vergessen" hast in die Schaltung einzubauen, mache in der Software folgendes, um den internen PullUp zu verwenden:

Statt:
pinMode(startPin, INPUT); // startPin auf INPUT setzen
Verwende den internen PullUp mit:
pinMode(startPin, INPUT_PULLUP); // startPin auf INPUT setzen und PullUp-Widerstand aktivieren

Und statt auf HIGH
if (digitalRead(startPin)==HIGH)
starte dann, wenn der Taster LOW durchschaltet:
if (digitalRead(startPin)==LOW)

Dann braucht der Taster keinen Pull-Widerstand.

Schau dir doch mal den Fred an: Steuerung von Kamera und Ventilen zur Aufnahme von TaTs
Da wurde das Thema schon mal diskutiert.

uups den pulldown hab ich wirklich vergessen... passiert in der eile aufm breadboard :grin:
jetzt läufts tadellos :slight_smile:
schon wahnsinn was das so ausmacht.

super danke leute!