Zeitscheiben für Ereignisse vernünftig programmieren

Hallo zusammen,

als Neuling im Arduino Uno - Bereich beschäftige ich mich mit dem Projekt, eine Kamera und Blitze für High-Speed-Fotografie anzusteuern.
Ich spiele mit dem Gedanken (vier) verschiedene Sensoren als Auslöser anzusprechen.
(Sensorschalter - einfacher Kontak oder Feuchtigkeit; Schall, Lichtschranke, Blitz)

Mein Programmierstil ist grottig aber das Meiste in meinem Menü läuft bereits …
Die Funktion für den Sensorschalter habe ich in erster Fassung realisiert aber so ist das noch nicht richtig.

  • Es muss noch abgehandelt werden ob Blitz und/oder Kamera ausgelöst werden sollen.
  • Die Zeitscheiben passen so noch nicht für jeden Fall ineinander und delay() ist ja ziemlich verpönt

Könnt ihr mal bitte über meine Funktion schauen und mich in die richtige Richtung schubsen?
Wie mache ich das besser ohne delay()?
Wie sieht die grundlegende Logic bei den Zeitscheiben aus? Da bilden sich bei mir gerade Knoten im Hirn …

Vielleicht besteht auch Interesse das gesamte “Gebilde” zu begutachten, da ich bestimmt nicht elegant vorgegangen bin, sondern benutzt habe, was ich als Erstes beim Googlen fand …

void aktion_schalter(int subMenue)
{
  zeileLoeschen(1);
  lcd.print(" ::: aktiv :::");
  
  unsigned long cameraDelay = valForCamera(subMenue);
  unsigned long flashDelay = valForFlash(subMenue);
  
  int sensorVal = 1;

  while (sensorVal == 1)
  {
      
    sensorVal = digitalRead(pinSwitchSensor);
  
    if (sensorVal==0) {
      
      if (cameraDelay > flashDelay)
      {
        unsigned long rest = cameraDelay - flashDelay;
        delay(flashDelay);
        digitalWrite(pinFlash, HIGH);
        // hoffentlich ist rest nicht kleiner als 10
        delay(10); // Impulszeit
        digitalWrite(pinFlash, LOW);
        delay(rest-10);
        digitalWrite(pinCam, HIGH);
        delay(10); // Impulszeit
        digitalWrite(pinCam, LOW);
      }
      if (flashDelay > cameraDelay) 
      {
        unsigned long rest = flashDelay - cameraDelay;
        delay(cameraDelay);
        // hoffentlich ist rest nicht kleiner als 10
        digitalWrite(pinCam, HIGH);
        delay(10); // Impulszeit        
        digitalWrite(pinCam, LOW);        
        delay(rest);
        digitalWrite(pinFlash, HIGH);
        delay(10); // Impulszeit
        digitalWrite(pinFlash, LOW);        
      }
      zeileLoeschen(1);
      lcd.print("<- stop * neu ->");
    }
    else 
    {
      digitalWrite(pinFlash, LOW);
    }
  } // while

  // Warten nach einer Aktion und Entscheidung: Stop / Nochmal
  boolean aktiv = true;
  while (aktiv)
  {
    int lcd_key = buttonPressed();
    if (lcd_key == btnLEFT)
    {
      aktiv = false;
      stayInMenue = 0;
    }
    if (lcd_key == btnRIGHT)
    {
      aktiv = false;
      stayInMenue = 1;
    }
  }
}

Hi, zu deinem Delay Problem schau dir mal dieses Thema an: http://forum.arduino.cc/index.php?topic=165552.0

Stell es dir einfach als ganz viele Loop Schleifen vor, nur das diese nicht immer Aufgerufen werden, sondern zu einem Intervall (alle x Milli-/Mikrosekunden/Minuten/...). Genauso können diese gestoppt und neu gestartet werden.

klaros: als Neuling im Arduino Uno - Bereich beschäftige ich mich mit dem Projekt, eine Kamera und Blitze für High-Speed-Fotografie anzusteuern.

Eine einfache Ablaufsteuerung für fotografische Zwecke habe ich hier mal gepostet: http://forum.arduino.cc/index.php?topic=211536.msg1552201#msg1552201 Das sollte eigentlich ausreichen, um eine zeitliche Abfolge von Schaltvorgängen hochgenau zu steuern.

Für noch extremere Anforderungen an die Wiederholgenauigkeit habe ich hier dann nochmal einen wesentlich aufwändigeren Code gepostet: http://forum.arduino.cc/index.php?topic=223038.msg1636451#msg1636451

Danke für die Rückmeldungen und Anregungen.

Die werde ich mir mal nach dem Urlaub genauer zu Gemüte führen ...

Hallo,

ich habe die einfache Ablaufsteuerung von jurs mal bei mir "eingebaut".

Jetzt stellt sich mir die Frage, ob ich diese generell immer in den Ablauf (Sensor triggert, Blitz / Kamera wird ausgelöst) einbauen soll, damit mein Programm für "irgenwelche" Eventualitäten flexibel bleibt, oder ob ich besser bei speziellen Anforderungen "hartcodiere".

Beispiel: Wenn ich versuchen sollte - angeblich geht das ja sogar - einen Gewitterblitz / die nachfolgenden Blitze einzufangen, brauche ich keine Routine, die ausrechnet, ob die Kamera- oder Blitzgerätaktion zuerst erfolgt und wie lange die gesamte Aktionsfolge dauert. Da sollte wohl allein die Kamera schnellstmöglich auslösen ...

Als Frage(n) formuliert: Wie viel Zeit fressen die Abfragen, Sortierereien und Berechnungen? Könnte man - um tatsächlich flexibel zu sein - diese optimieren?

(Ich könnte auch einen weiteren Menüpunkt aufnehmen und die Wahl zwischen Ablaufsteuerung und direkter Aktion ermöglichen aber eigentlich will ich auf dem 2-Zeilen-LCD das Menü nicht zu sehr verschachteln / aufblähen.)

Danke im Voraus und Grüße, Klaus