Hallo Achim,
kokettier mal nicht so mit deinem Alter - da hast Du mir kaum was voraus
.
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
, 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.