Zeit einstellen

Hallo zusammen,

ich hoffe ihr könnt mir bei meinem Problem helfen. Ich habe noch nicht so viel Erfahrung mit dem Programmieren, stehe noch am Anfang. Ich bin auch nicht mehr der Jüngste, 70. Aber egal.

Ich habe mir eine Schaltung aufgebaut. Ein I2C Display, 5 Taster und einen Magneten.

Mit vier Tastern kann ich die Zeit einstellen, auf und abzählen. Zwei Taster für die Einerstellen und zwei für die Zehnerstellen. Jeweils einen zum Auf und Abzählen.
Das Ergebnis, der Zeit wird mir auf dem Display angezeigt.
Soweit, so gut. Das funktioniert.

Mittels des 5ten Tasters soll ein Magnet ausgeschaltet und nach der voreingestellten Zeit eine Kamera oder ein Blitz ausgelöst werden.
Und das kann ich nicht einbinden, das funktioniert nicht.

Ich habe hier schon ein anderes Setup, bei dem ich mit Optokopplern arbeite.
Nach dem Ausschalten wird eine vorbestimmte Zeit gewartet und dann der Blitz ausgelöst.
Das funktioniert alles sehr gut.
Nur, ich muss die Zeit über "delay" im Sketch einstellen. Also immer den Sketch neu laden, wenn ich die Zeit verändern will. Und das möchte ich vermeiden.

Ich hoffe es war nicht zu verworren, und es kann mir jemand einen Tipp geben.

Mit freundlichen Grüßen
Achim

Taster_mit_Magnet.ino (5.37 KB)

(deleted)

Wenn Du jetzt denkst, dass ich dies verstanden habe, bist Du auf dem Holzweg.

Aber trotzdem Danke für den Wink mit dem Holzpfahl.

Ich werde Tante Kugel bemühen und sehen was da bei rumkommt.

Und wenn ich dann immer noch zu blöd bin, komme ich halt ganz kleinlaut wieder hier her.

du brauchst jetzt noch am Ende

  • eine Startbedingung, quasi das was du jetzt mit if (zaehlerEiner == 4) angedeutet hast.
    du merkst dir auch die aktuelle "Zeite" mit startMillis=millis()
    und ein Flag dass die Zeit läuft, lauft = TRUE

  • und dann ein zweites if das bei gesetztem flag prüft ob deine Zeit abgelaufen ist, und dann den Magneten wieder losläst

unter der Annahme, dass du in Fallzeit Sekunden hast in etwa so:

  // LED an oder aus, ist später der Magnet: (Denkfehler, aber erstmal egal)
  if (zaehlerEiner == 4 && !lauft) {
    digitalWrite (LED, HIGH);
    startMillis = millis();
    lauft = true;
  }

  if (lauft && millis() - startMillis > Fallzeit * 1000UL)
  {
    digitalWrite (LED, LOW);
    lauft = false;
  }

startMillis soll ein uint32_t sein,
lauft ist ein bool

und bei der Gelegenheit, überprüfe ALLE deine int, viele kannst auf byte bzw. const byte ändern.

Danke, schaue ich mir an.

Ich muss aber erstmal das Prinzip verstehen. Bin nicht mehr so schnell im Denken, wegen der Kalkablagerungen

Maibenrai:
Bin nicht mehr so schnell im Denken, wegen der Kalkablagerungen

Nein, daran liegt das nicht.

Du hast viel Lebenserfahrung, die du mit den neuen Eindrücken abgleichen musst.
Das funktioniert zwar im Hintergrund/Unbewusst, aber benötigt dennoch etwas Zeit.

Hallo Achim,
kokettier mal nicht so mit deinem Alter - da hast Du mir kaum was voraus :smiley: .

Ich glaube, mit meinen MobaTools kannst Du dir allerhand Arbeit sparen 8) . Die erleichtern das Verwalten der Taster und auch der Zeiten wesentlich.
Da Altersgenossen sich ja unterstützen sollen :wink: , hab' ich deinen Sketch mal entsprechend umgebaut. Obwohl jetzt auch schon die Zeit für das Magnetausschalten drin ist, ist er kürzer geworden. Es ließe sich sicher noch mehr optimieren, aber das ist erstmal nicht so wesentlich.
Bei Unklarheiten - gerne fragen 8) .

Du brauchst die neueste Version (2.2.0) der MobaTools, die der Bibliotheksmanager leider noch nicht übernommen hat. Du kannst sie aber hier als zip herunterladen, und dann mit der IDE (Sketch-> Bibliothek einbinden -> .Zip Bibliothek hinzufügen... ) installieren.

#include <Wire.h>              // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
#include <MobaTools.h>

// Hier wird festgelegt um was für einen Display es sich handelt.
// In diesem Fall eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x3F.
// Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)"
LiquidCrystal_I2C lcd(0x3F, 16, 2); //

// Einrichten der Taster
const byte tasterPins[] = { 8, 9, 10, 11, 12 };
const byte tasterZahl = sizeof(tasterPins);   // tasterPins muss 'byte' sein, damit das so funktioniert

//Index der Taster in obiger Tabelle ( über diese Indexnummer werden die Taster in den MoToButtosns-Methoden angesprochen ):
const byte einerPlus     = 0;    // Taste zum Aufzählen der Einerstellen
const byte einerMinus    = 1;    // Taste zum Abzählen der Einerstellen
const byte zehnerMinus   = 2;    // Taste zum Abzählen der Zehnerstellen
const byte zehnerPlus    = 3;    // Taste zum Aufzählen der Zehnerstellen
const byte tasterMagnet  = 4;    // Taste für Magnet, zum aus und einschalten

MoToButtons Taster( tasterPins, tasterZahl, 20, 500 ); // 20ms Entprellzeit, 500ms zur Unterscheidung kurz/lang gedrückt ( wird hier aber nicht genutzt )

// Magnet-Timer für die Magnet-Auschaltzeit
MoToTimer MagnetZeit;

int LED           = 13;    // Pin an dem die (Kontroll) LED ist
int Magnet        =  3;    // Steuerpin Für Magnet, an- oder ausschalten

int SensorWert    =  0;

int zaehlerEiner   = 0;    // Anfangswert
int zaehlerZehner  = 0;    // Anfangswert

int set            = 0;    // soetwas nennt man auch "Merker" (Keine Ahnung was das ist :-(

int FallZeit       = 0;    // Zeit zwischen Magnet Low und Auslösen der Kamera/Blitz

int TasterStatus;          // in dieser Variable wird die Information abgespeichert
// ob der Taster gedrückt ist oder nicht

//------------------------------Setup--------------------------------------------------------------------

void setup() {

  Serial.begin(9600);   // Nur zum Überprüfen der Fallzeit

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 6);
  pinMode (LED, OUTPUT);                 // LED Ausgang (Power)
  pinMode (Magnet, OUTPUT);              // Steuer Pin für Magnet, Aktiv/Inaktiv

  digitalWrite (Magnet, HIGH);

  // Grundbeschriftung des LCD
  lcd.setCursor(1, 1);
  lcd.print("0,0");
  lcd.setCursor(4, 1); // Cursor Positionieren, erste Ziffer = Position, Zweite = Zeile
  lcd.print(zaehlerZehner);
  lcd.setCursor(3, 1); // Cursor Positionieren, erste Ziffer = Position, Zweite = Zeile
  lcd.print(zaehlerEiner);
  lcd.setCursor(7, 01);
  lcd.print("Sekunden");

  // Erste Zeile im Display
  lcd.setCursor(1, 0);
  lcd.print("Zeit Einstellen");


}


void loop () {
  Taster.processButtons();    // Tasterverwaltung

  // Einerstellen Abzählen:
  if (Taster.pressed(einerMinus)) {
    zaehlerEiner--;
    set = 1;      // Merker, dass ein Wert verändert wurde
    if (zaehlerEiner < 0) {
      zaehlerEiner = 0;
    }
  }

  // Einerstellen Aufzählen:
  if (Taster.pressed(einerPlus) ) {
    zaehlerEiner++;
    if (zaehlerEiner > 9) {
      zaehlerEiner = 9;
    }
    set = 1;
  }

  // Zehnerstellen Aufzählen:
  if (Taster.pressed(zehnerPlus)) {
    zaehlerZehner++;
    if (zaehlerZehner > 9) {
      zaehlerZehner = 9;
    }
    set = 1;
  }
  // Zehnerstelle Abzählen
  if (Taster.pressed(zehnerMinus)) {
    zaehlerZehner--;

    if (zaehlerZehner < 0) {
      zaehlerZehner = 0;
    }

    set = 1;
  }

  if ( set ) {
    // Es wurde ein Wert verändert, LCD aktualisieren
    lcd.setCursor(4, 1); // Cursor Positionieren, erste Ziffer = Position, Zweite = Zeile
    lcd.print(zaehlerZehner);
    lcd.setCursor(5, 1); // Cursor Positionieren, erste Ziffer = Position, Zweite = Zeile
    lcd.print(zaehlerEiner);
    set = 0;                    //Merker wieder löschen

  }
  // LED an oder aus, ist später der Magnet: (Denkfehler, aber erstmal egal)
  if (zaehlerEiner == 4) {
    digitalWrite (LED, HIGH);
  } else {
    digitalWrite (LED, LOW);
  }

  if ( Taster.pressed(tasterMagnet) ) {
    // Fallzeit berechen.
    // Die Zeit vom Ausschalten des Magnets bis Auslösen des Blitzes:
    FallZeit = (zaehlerEiner + (zaehlerZehner * 10));
    MagnetZeit.setTime( FallZeit ); // in ms
    digitalWrite( Magnet, LOW );
    digitalWrite( LED, LOW );
    Serial.println (FallZeit);
  }

  if ( MagnetZeit.expired() ) {
    // Zeit für 'Magnet abgeschaltet' ist abgelaufen
    digitalWrite( Magnet, HIGH );
    digitalWrite( LED, HIGH );
    // Hier kann jetzt auch die Kamera ausgelöst werden
    Serial.println( "Kamera auslösen");
  }


}

N.B. Das Einschalten der internen PullUp-Widerstände hat nichts mit dem Entprellen zu tun.

Weils gerade Spaß gemacht hat, noch eine Variante. Die FallZeit lässt sich da noch flexibler einstellen. Zum einen geht es auch über 99ms ( wenn's denn sein soll :wink: ).
Zum anderen laufen die Einerstellen in die Zehner über ( und die Zehner in die Hunderter ). Um z.B. von 9 auf 10 zu kommen, muss man auch nur einmal den Einer-Taster drücken.
Drückt man den Zehnertaster länger, ändert sich auch die Hunderter-Stelle um eins.

#include <Wire.h>              // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
#define MAX8BUTTONS 
#include <MobaTools.h>

// Hier wird festgelegt um was für einen Display es sich handelt.
// In diesem Fall eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x3F.
// Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)"
LiquidCrystal_I2C lcd(0x3F, 16, 2); //

// Einrichten der Taster
const byte tasterPins[] = { 8, 9, 10, 11, 12 };
const byte tasterZahl = sizeof(tasterPins);   // tasterPins muss 'byte' sein.

//Index der Taster in obiger Tabelle ( über diese Indexnummer werden die Taster in den MoToButtosns-Methoden angesprochen ):
const byte einerPlus     = 0;    // Taste zum Aufzählen der Einerstellen
const byte einerMinus    = 1;    // Taste zum Abzählen der Einerstellen
const byte zehnerMinus   = 2;    // Taste zum Abzählen der Zehnerstellen
const byte zehnerPlus    = 3;    // Taste zum Aufzählen der Zehnerstellen
const byte tasterMagnet  = 4;    // Taste für Magnet, zum aus und einschalten

MoToButtons Taster( tasterPins, tasterZahl, 20, 500 ); // 20ms Entprellzeit, 500ms zur Unterscheidung kurz/lang gedrückt ( wird hier aber nicht genutzt )

// Magnet-Timer für die Magnet-Auschaltzeit
MoToTimer MagnetZeit;

int LED           = 13;    // Pin an dem die (Kontroll) LED ist
int Magnet        =  3;    // Steuerpin Für Magnet, an- oder ausschalten

int SensorWert    =  0;

int set            = 0;    // soetwas nennt man auch "Merker" (Keine Ahnung was das ist :-(

int FallZeit       = 0;    // Zeit zwischen Magnet Low und Auslösen der Kamera/Blitz

int TasterStatus;          // in dieser Variable wird die Information abgespeichert
// ob der Taster gedrückt ist oder nicht

//------------------------------Setup--------------------------------------------------------------------

void setup() {

  Serial.begin(9600);   // Nur zum Überprüfen der Fallzeit

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 6);
  pinMode (LED, OUTPUT);                 // LED Ausgang (Power)
  pinMode (Magnet, OUTPUT);              // Steuer Pin für Magnet, Aktiv/Inaktiv

  digitalWrite (Magnet, HIGH);

  // Grundbeschriftung des LCD
  lcd.setCursor(1, 1);
  lcd.print("0,000");
  lcd.setCursor(7, 01);
  lcd.print("Sekunden");

  // Erste Zeile im Display
  lcd.setCursor(1, 0);
  lcd.print("Zeit Einstellen");
}

void loop () {
  Taster.processButtons();    // Tasterverwaltung

  // Einerstellen Abzählen:
  if (Taster.pressed(einerMinus)) {
    set = 1;      // Merker, dass ein Wert verändert wurde
    FallZeit++;
  }
  // Einerstellen Aufzählen:
  if (Taster.pressed(einerPlus) ) {
    FallZeit--;
    set = 1;
  }
  // Zehnerstellen Aufzählen:
  if (Taster.pressed(zehnerPlus)) {
    FallZeit+=10;;
    set = 1;
  }
  // Zehnerstelle Abzählen
  if (Taster.pressed(zehnerMinus)) {
    FallZeit-=10;
    set = 1;
  }
  // Hunderterstellen Aufzählen:
  if (Taster.longPress(zehnerPlus)) {
    FallZeit+=100;
    set = 1;
  }
  // Hunderterstelle Abzählen
  if (Taster.longPress(zehnerMinus)) {
    FallZeit-=100;
    set = 1;
  }

  if ( set ) {
    // Es wurde ein Wert verändert, LCD aktualisieren
    FallZeit = constrain( FallZeit, 0, 999 ); // Fallzeit auf Wertebereich 0...999 begrenzen
    char txtBuf[10];
    sprintf( txtBuf, "%03d", FallZeit );      // Zeit dreistellig mit Vornullen in Textpuffer eintragen
    lcd.setCursor(3, 1);                      // Cursor Positionieren, erste Ziffer = Position, Zweite = Zeile
    lcd.print(txtBuf);                        // Textpuffer ausgeben
    set = 0;                    //Merker wieder löschen
  }

  if ( Taster.pressed(tasterMagnet) ) {
    // Fallzeit berechen.
    // Die Zeit vom Ausschalten des Magnets bis Auslösen des Blitzes:
    MagnetZeit.setTime( FallZeit ); // in ms
    digitalWrite( Magnet, LOW );
    digitalWrite( LED, LOW );
    Serial.println (FallZeit);
  }

  if ( MagnetZeit.expired() ) {
    // Zeit für 'Magnet abgeschaltet' ist abgelaufen
    digitalWrite( Magnet, HIGH );
    digitalWrite( LED, HIGH );
    // Hier kann jetzt auch die Kamera ausgelöst werden
    Serial.println( "Kamera auslösen");
  }
}

Kannst dich ja mal reinwühlen. Ist eigentlich auch nicht länger geworden.

Edit: Inzwischen hat der Bibliotheksverwalter die Version 2.2.0 auch übernommen. Du kannst die MobaTools also auch direkt im Bibliotheksverwalter installieren ( in der Suchleiste mobatools eingeben )

Nochmal Edit: kleinen Fehler beseitigt: Der Merker für Änderungen muss nach dem Ausgeben auf's LCD auch wieder zurückgesetzt werden.

Hallo Franz-Peter,

ach, es geht doch nicht ums Kokettieren mit meinem Alter. Wollte mich nur im Vorfeld für meine Begriffsstutzigkeit entschuldigen. Ich fange ja gerade erst an mich mit dem Arduino zu beschäftigen.

Wofür ist die Saltung aber gut.
Es geht um High Speed Fotografie. Die Reihenfolge der Ereignisse ist folgende. Kamera wird ausgelöst, Magnet, an dem eine Nadel hängt wird ausgeschaltet. Nach voreingestellter Zeit wird ein Blitz ausgelöst, der das Platzen des Ballons einfriert. Danach wird alles wieder auf null gestellt. Magnet scharf, Kamera und Blitz aus. Die Tasterdruck beginnt das Spiel von vorn.

Danke, ich werde es mir anschauen und versuchen es zu verstehen. Denn mit dem Verstehen was da abläuft habert es halt.
Ich bin zurzeit nicht zu Hause, wenn ich wieder in meinen vier Wänden bin schaue ich es mir genauer an.

Danke nochmal für Deine Mühe.

Hallo Franz-Peter,

funktioniert alles wunderprächtig, nochmals Danke.
Das mit den Tastern habe ich noch nicht verstanden, bin aber dran.
Aber ich konnte darauf aufbauen.

Mein Setup steht und ich kann anfangen mich an die richtige Fallzeit heranzutasten, im wahrsten Sinne des Wortes