Hat sich erledigt, habe eine Lösung gefunden und das Problem gelöst.
Und wie hast du es geschafft wenn man fragen darg
Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: this_feature_currently_requires_accessing_site_using_safari
In eigener Sache!
Liebe Mitglieder, liebe Besucher und Gäste
ich weiß, es ist ein leidiges Thema, aber ich muss es ansprechen: Werbung, Werbeblocker und Finanzierung des Forums.
Bitte hier weiterlesen ...
Hat sich erledigt, habe eine Lösung gefunden und das Problem gelöst.
// KONSTANTEN
const int lichtschranken_pin = A0;
const int ventil_pin = 12;
const int kamera_pin = 13;
// VARIABLEN
// Alle Zeiten in Millisekunden angegeben
// Zeitvariablen initalisieren
// Auslöseverzögerung Kamera
long aktuellezeit_ausloeseverzoegerung = 0;
long startzeit_ausloeseverzoegerung = 0;
// Ventil
long aktuellezeit_ventil = 0;
long startzeit_ventil = 0;
// Ventilöffnungszeiten festlegen
int tropfenzeit_1 = 150;
int verschlusszeit_1_2 = 70;
int tropfenzeit_2 = 150;
int verschlusszeit_2_3 = 70;
int tropfenzeit_3 = 150;
int gesamtzeit_tropfserie = tropfenzeit_1 + verschlusszeit_1_2 + tropfenzeit_2 + verschlusszeit_2_3 + tropfenzeit_3 + 500; // für die Inaktivzeit der Lichtschranke, 500 ms Sicherheitsreserve, damit die Lichtschranke nicht durch den dritten Tropfen doch wieder aktiviert werden kann
// Zeit zwischen den Tropfenserien festlegen
int pausenzeit = 10000;
// Auslöseverzögerung festlegen
int ausloeseverzoegerung = 288;
// Aktivierungszeit für Kameraauslöser festlegen
int ausloeser_aktivzeit = 200;
// Lichtschranken-Schwellenwert festlegen
int lichtschranke_messwert;
int lichtschranke_maximum;
int lichtschranke_minimum;
int lichtschranke_schwellenwert;
float lichtschranke_schwellenwertfaktor = 0.85; // Faktor, mit dem der maximale Messwert der Lichtschranke multipliziert wird, um den Schwellenwert zu errechnen, muss unbedingt kleiner als 1 sein!
// Statusvariable Lichtschranke
boolean lichtschranke_unterbrochen = false;
// Statusvariable Kameraauslöser
boolean kamera_ausloeser_aktiv = false;
// Satusvariable Ventil
boolean ventil_offen = false;
// Statusvariable Tropfserie
boolean tropfserie_laeuft = false;
// Statusvariable Tropfen ausgelöst
boolean tropfen_ausgeloest = false;
// Ventilzeiten in Absolutwerte umrechnen
int endzeit_offen_1 = tropfenzeit_1;
int endzeit_geschlossen_1_2 = endzeit_offen_1 + verschlusszeit_1_2;
int endzeit_offen_2 = endzeit_geschlossen_1_2 + tropfenzeit_2;
int endzeit_geschlossen_2_3 = endzeit_offen_2 + verschlusszeit_2_3;
int endzeit_offen_3 = endzeit_geschlossen_2_3 + tropfenzeit_3;
int endzeit_pause = endzeit_offen_3 + pausenzeit;
// Eingabevariable initialisieren
int eingabe;
void setup() {
// Ausgangspins initialisieren
pinMode(ventil_pin, OUTPUT);
pinMode(kamera_pin, OUTPUT);
// Serielle Verbindung zum Computer initialisieren für Textausgabe
// Serial.begin(9600);
// Serial.println("Lichtschranke wird kalibiert...");
// Die ersten zwei Sekunden die Lichtschranke kalibrieren
while (millis() < 2000) {
lichtschranke_messwert = analogRead(lichtschranken_pin);
// Maximalwert speichern
if (lichtschranke_messwert > lichtschranke_maximum) {
lichtschranke_maximum = lichtschranke_messwert;
}
// Minimalwert speichern, nur fuer den Fall, dass wir den Schwellenwert irgendwann mal anders berechnen wollen
if (lichtschranke_messwert < lichtschranke_minimum) {
lichtschranke_minimum = lichtschranke_messwert;
}
}
lichtschranke_schwellenwert = lichtschranke_maximum * lichtschranke_schwellenwertfaktor;
// Serial.print("Leerwert der Lichtschranke: ");
// Serial.println(lichtschranke_maximum);
// Serial.print("Schwellenwert der Lichtschranke: ");
// Serial.println(lichtschranke_schwellenwert);
}
void loop() {
tropfen_ausgeloest = true;
// Tropfserie fallen lassen falls ausgelöst
if (tropfen_ausgeloest == true) {
aktuellezeit_ventil = millis();
if (aktuellezeit_ventil - startzeit_ventil < endzeit_offen_1 && ventil_offen == false) {
digitalWrite(ventil_pin, HIGH);
ventil_offen = true;
tropfserie_laeuft = true;
// Serial.println("Tropfen 1 Start, Ventil offen");
}
else if (aktuellezeit_ventil - startzeit_ventil > endzeit_offen_1 && aktuellezeit_ventil - startzeit_ventil < endzeit_geschlossen_1_2 && ventil_offen == true) {
digitalWrite(ventil_pin, LOW);
ventil_offen = false;
// Serial.println("Tropfen 1 Ende, Ventil geschlossen");
}
else if (aktuellezeit_ventil - startzeit_ventil > endzeit_geschlossen_1_2 && aktuellezeit_ventil - startzeit_ventil < endzeit_offen_2 && ventil_offen == false) {
digitalWrite(ventil_pin, HIGH);
ventil_offen = true;
// Serial.println("Tropfen 2 Start, Ventil offen");
}
else if (aktuellezeit_ventil - startzeit_ventil > endzeit_offen_2 && aktuellezeit_ventil - startzeit_ventil < endzeit_geschlossen_2_3 && ventil_offen == true) {
digitalWrite(ventil_pin, LOW);
ventil_offen = false;
// Serial.println("Tropfen 2 Ende, Ventil geschlossen");
}
else if (aktuellezeit_ventil - startzeit_ventil > endzeit_geschlossen_2_3 && aktuellezeit_ventil - startzeit_ventil < endzeit_offen_3 && ventil_offen == false) {
digitalWrite(ventil_pin, HIGH);
ventil_offen = true;
// Serial.println("Tropfen 3 Start, Ventil offen");
}
else if (aktuellezeit_ventil - startzeit_ventil > endzeit_offen_3 && aktuellezeit_ventil - startzeit_ventil < endzeit_pause && ventil_offen == true) {
digitalWrite(ventil_pin, LOW);
ventil_offen = false;
// Serial.println("Tropfen 3 Ende, Ventil geschlossen");
}
else if (aktuellezeit_ventil - startzeit_ventil > endzeit_pause) {
startzeit_ventil = aktuellezeit_ventil;
tropfserie_laeuft = false;
lichtschranke_unterbrochen = false;
// Serial.println("Ende der Pause, Startzeit aktualisiert, Lichtschranke wieder scharf");
}
}
// Lichtschranke abfragen
lichtschranke_messwert = analogRead(lichtschranken_pin);
if (lichtschranke_messwert < lichtschranke_schwellenwert && lichtschranke_unterbrochen == false) {
// Serial.println("Lichtschranke unterbrochen");
lichtschranke_unterbrochen = true;
startzeit_ausloeseverzoegerung = millis();
}
// Verzögerungszeit abwarten, dann Kamera-Auslöser aktivieren
aktuellezeit_ausloeseverzoegerung = millis();
if (aktuellezeit_ausloeseverzoegerung - startzeit_ausloeseverzoegerung > ausloeseverzoegerung && aktuellezeit_ausloeseverzoegerung - startzeit_ausloeseverzoegerung < ausloeseverzoegerung + ausloeser_aktivzeit && kamera_ausloeser_aktiv == false && lichtschranke_unterbrochen == true) {
digitalWrite(kamera_pin, HIGH);
kamera_ausloeser_aktiv = true;
// Serial.println("Kamera-Ausloeser aktiviert");
}
// Aktivzeit des Auslösers abwarten, dann Kamera-Auslöser deaktivieren
else if (aktuellezeit_ausloeseverzoegerung - startzeit_ausloeseverzoegerung > ausloeseverzoegerung + ausloeser_aktivzeit && aktuellezeit_ausloeseverzoegerung - startzeit_ausloeseverzoegerung < gesamtzeit_tropfserie && kamera_ausloeser_aktiv == true) {
digitalWrite(kamera_pin, LOW);
kamera_ausloeser_aktiv = false;
// Serial.println("Kamera-Ausloeser deaktiviert");
}
}
Kleines Update für die Software-Version mit Magnetventil. Dieses behebt das Problem, dass die Tropfenfolge nicht oder nicht vollständig ausgelöst wird, wenn die Öffnungs- und Pausenzeiten sehr kurz sind. Auch mit der neuen Version sind die Probleme nicht vollständig behoben, zumindest aber deutlich verringert.
Das Problem tritt durch Serial.println() auf, welches eine Verzögerung ähnlich delay() auslöst, die wiederum dazu führen kann, dass ein Tropfintervall verpasst wird. Im Grunde genommen kann man einfach alle Zeilen mit Serial.println() löschen oder über // auskommentieren. Hab mich für das Auskommentieren entschieden, weil das Debugging durch die Rückmeldungen etwas erleichtert wird und man so ggf. einfach die beiden Schrägstriche wieder entfernen kann.
#define ausloeser 7
#define led 13
#define lichtschranke A0
// Lichtschranken-Schwellenwert festlegen
int lichtschranke_messwert;
int lichtschranke_maximum;
int schwelle;
float lichtschranke_schwellenwertfaktor = 0.85; // Faktor, mit dem der maximale Messwert der Lichtschranke multipliziert wird, um den Schwellenwert zu errechnen, muss unbedingt kleiner als 1 sein!
void setup() {
pinMode(led, OUTPUT);
pinMode(ausloeser, OUTPUT);
digitalWrite(ausloeser, LOW);
Serial.begin(9600);
// Serial.println("Lichtschranke wird kalibiert...");
// Die ersten zwei Sekunden die Lichtschranke kalibrieren
while (millis() < 2000) {
lichtschranke_messwert = analogRead(lichtschranke);
// Maximalwert speichern
if (lichtschranke_messwert > lichtschranke_maximum) {
lichtschranke_maximum = lichtschranke_messwert;
}
}
schwelle = lichtschranke_maximum * lichtschranke_schwellenwertfaktor;
}
void loop() {
int verzoegerung = 120; // Auslöseverzögerung in ms festlegen
int sensorValue = analogRead(lichtschranke);
Serial.println(sensorValue, DEC); // Daten der Lichtschranke auf dem Computer ausgeben => darüber Schwellenwert festlegen
if (sensorValue < schwelle)
{
delay(verzoegerung); // Kameraauslösung verzögern
digitalWrite(ausloeser, HIGH); // Kameraauslöser betätigen
digitalWrite(led, HIGH); // LED anmachen zur Bestätigung, dass die Kamera ausgelöst hat
delay(500); // Kameraauslöser loslassen verzögern
digitalWrite(ausloeser, LOW); // Kameraauslöser wieder loslassen
delay(10000); // 10 Sekunden warten, bevor der Trigger wieder "scharf" ist
digitalWrite(led, LOW); // nach 10 Sekunden auch die LED wieder abschalten
}
}