Hallo liebe Gemeinde,
ich habe folgendes Problem :
Ich möchte einen Kamera-Auslöser mit einer Lichtschranke erstellen.
Beim durchbrechen der Lichtschranke soll eine Kamera ausgelöst werden (zu Testzwecken im Moment eine Leuchtdiode). Es sollen zwei Drehgeber verwendet werden (in diesem Fall KY-040). Mit dem ersten Drehgeber soll die Auslöseverzögerung einstellbar sein. Mit dem zweiten Drehgeber soll der Schwellenwert (im Bezug auf die Lichtverhältnisse) für die Auslösung einstellbar sein. Erstelle ich den Sketch nur mit Drehgeber für die Verzögerung, funktioniert alles einwandfrei. Doch wenn der zweite Drehgeber hinzu kommt, lässt sich dieser nicht zuverlässig, bzw. mit extremer Verzögerung einstellen. Ein weiteres Problem ist (allerdings ein sekundäres), das ich die Werte nur einstellen kann, wenn der Laser auf die Fotozelle gerichtet ist. Die Werte werden auf einem zwei-zeiligen Display ausgegeben.
PS : Ich bin mir der Gefahr eines Laser´s (in diesem Fall der KY-008) bewusst. Wenn die ganze Elektronik in einem Gehäuse verbaut ist, bekommt der Laser einen Schalter als Unterbrecher.
Mein Ziel, die High-Speed Fotografie (fallende Gegenstände ins Wasser z.B.).
Die Werte sollen einstellbar sein,unabhängig vom der Aktivität des Laser´s.. Beide Drehgeber sollen vernünftig einstellbar sein (der für die Verzögerung ist es ja, allerdings nur wenn er auf die Fotozelle gerichtet ist). Soweit funktioniert alles, aber eben nicht reibungslos. Kann mir da jemand helfen ?
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
// Pins für den Drehgeber
const int laserPin = 9; // Pin für die Laserdiode
const int ledPin = 10; // Pin für die Leuchtdiode
const int ldrPin = A0; // Pin für die Fotozelle
const int pin_vz_A = 2; // DT - Drehgeber für Verzögerung PIN A
const int pin_vz_B = 3; // CLK - Drehgeber für Verzögerung PIN B
const int pin_sw_A = 4; // DT - Drehgeber für Schwellenwert PIN A
const int pin_sw_B = 5; // CLK - Drehgeber für Schwellenwert PIN B
// Erstelle einen Encoder-Objekt
Encoder verzoegerung(pin_vz_A, pin_vz_B); // Drehgeber Verzögerung
Encoder schwelle(pin_sw_A, pin_sw_B); // Drehgeber Schwellenwert
// Erstelle ein LCD-Objekt
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD-Adresse (muss ggf. angepasst werden)
int verz = 300; // Anfangswert für Verzögerung
int sw = 200; // Anfangswert für Schwellenwert
void setup() {
pinMode(laserPin, OUTPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(laserPin, HIGH); // Laserdiode einschalten
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("VZ-Wert:");
lcd.setCursor(0, 1);
lcd.print("SW-Wert:");
updateDisplay();
}
void loop() {
long pos1 = verzoegerung.read(); // Lese die Encoder-Position
// Berechne den neuen Wert in 5er-Schritten
if (pos1 % 5 == 0) {
verz = constrain(pos1 + 300, 0, 1000); // Begrenze den Wert auf 0 - 1 Sekunden
updateDisplay();
}
long pos2 = schwelle.read(); // Lese die Encoder-Position
// Berechne den neuen Wert in 5er-Schritten
if (pos2 % 5 == 0) {
sw = constrain(pos2 + 150, 0, 1000); // Begrenze den Wert auf 0 - 1 Sekunden
updateDisplay();
}
int sensorValue = analogRead(ldrPin);
if (analogRead(ldrPin) > sw) { // Bestätige die Unterbrechung
delay(verz); // Warte die eingestellte Verzögerung ab
digitalWrite(ledPin, HIGH); // LED einschalten
delay(1000); // Warte die eingestellte Verzögerung ab
digitalWrite(ledPin, LOW); // LED ausschalten
}
}
// Funktion zum Aktualisieren des Displays
void updateDisplay() {
// Erste Zeile für Verzögerung
lcd.setCursor(9, 0); // Setze den Cursor auf die zweite Zeile
lcd.print(" "); // Leere Zeile
lcd.setCursor(9, 0); // Setze den Cursor wieder auf die zweite Zeile
lcd.print(verz); // Zeige den aktuellen Wert an
// Zweite Zeile für Schwellenwert
lcd.setCursor(9, 1); // Setze den Cursor auf die zweite Zeile
lcd.print(" "); // Leere Zeile
lcd.setCursor(9, 1); // Setze den Cursor wieder auf die zweite Zeile
lcd.print(sw); // Zeige den aktuellen Wert an
}