Danke Christian :top:
so hier der Quelltext der auf den Arduino aufgespielt wird
Code:
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// KONSTANTEN
const int lichtschranken_pin = A0;
const int ventil_pin = 13;
const int kamera_pin = 8;
const int autofocus_pin = 9;
const int lichtschranken_led =6;
const int ventil_led =7;
// 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 = 24;
int tropfenzeit_2 = 170;
int verschlusszeit_2_3 = 18;
int tropfenzeit_3 = 170;
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 = 20000;
// Auslöseverzögerung festlegen
int ausloeseverzoegerung = 45;
// Aktivierungszeit für Kameraauslöser festlegen
int ausloeser_aktivzeit = 170;
// 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);
pinMode(autofocus_pin, OUTPUT);
pinMode(lichtschranken_led, OUTPUT);
pinMode(ventil_led, OUTPUT);
// set up the LCD's number of columns and rows:
lcd.begin(20, 4);
// Begrüßungsbildschirm.
lcd.setCursor(1,0);
lcd.print("Hallo, Clarissa!");
lcd.setCursor(1,1);
lcd.print("viel Spass beim");
lcd.setCursor(1,2);
lcd.print("Wassertropfen");
lcd.setCursor(1,3);
lcd.print("fotografieren !!!!");
// Serielle Verbindung zum Computer initialisieren für Textausgabe
Serial.begin(9600);
Serial.println("Lichtschranke wird kalibiert...");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Lichtschranke wird");
lcd.setCursor(1,1);
lcd.print("kalibriert...");
// 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);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Leerwert der");
lcd.setCursor(1,1);
lcd.print("Lichtschranke");
lcd.setCursor(17,1);
lcd.print(lichtschranke_maximum);
lcd.setCursor(1,2);
lcd.print("Schwellenwert der");
lcd.setCursor(2,2);
lcd.print("Lichtschranke");
lcd.setCursor(17,2);
lcd.print(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);
digitalWrite(ventil_led, HIGH);
ventil_offen = true;
tropfserie_laeuft = true;
Serial.println("Tropfen 1 Start, Ventil offen");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Tropfen 1 Start,");
lcd.setCursor(1,1);
lcd.print("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);
digitalWrite(ventil_led, LOW);
ventil_offen = false;
Serial.println("Tropfen 1 Ende, Ventil geschlossen");
lcd.setCursor(1,2);
lcd.print("Tropfen 1 Ende");
lcd.setCursor(1,3);
lcd.print("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);
digitalWrite(ventil_led, HIGH);
ventil_offen = true;
Serial.println("Tropfen 2 Start, Ventil offen");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Tropfen 2 Start,");
lcd.setCursor(1,1);
lcd.print("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);
digitalWrite(ventil_led, LOW);
ventil_offen = false;
Serial.println("Tropfen 2 Ende, Ventil geschlossen");
lcd.setCursor(1,2);
lcd.print("Tropfen 2 Ende");
lcd.setCursor(1,3);
lcd.print("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);
digitalWrite(ventil_led, HIGH);
ventil_offen = true;
Serial.println("Tropfen 3 Start, Ventil offen");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Tropfen 3 Start,");
lcd.setCursor(1,1);
lcd.print("Ventil offen");
}
else if (aktuellezeit_ventil - startzeit_ventil > endzeit_offen_3 && aktuellezeit_ventil - startzeit_ventil < endzeit_pause && ventil_offen == true) {
digitalWrite(ventil_pin, LOW);
digitalWrite(ventil_led, LOW);
ventil_offen = false;
Serial.println("Tropfen 3 Ende, Ventil geschlossen");
lcd.setCursor(1,2);
lcd.print("Tropfen 3 Ende");
lcd.setCursor(1,3);
lcd.print("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");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Ende der Pause,");
lcd.setCursor(1,1);
lcd.print("Startzeit aktualisiert,");
lcd.setCursor(1,2);
lcd.print("Lichtschranke wieder");
lcd.setCursor(1,3);
lcd.print("scharf !!!!!!");
}
}
// Lichtschranke abfragen
lichtschranke_messwert = analogRead(lichtschranken_pin);
if (lichtschranke_messwert < lichtschranke_schwellenwert && lichtschranke_unterbrochen == false) {
Serial.println("Lichtschranke unterbrochen");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Lichtschranke");
lcd.setCursor(1,1);
lcd.print("unterbrochen");
digitalWrite(lichtschranken_led, HIGH);
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) {
Serial.println(aktuellezeit_ausloeseverzoegerung);
digitalWrite(kamera_pin, HIGH);
digitalWrite(autofocus_pin, HIGH);
kamera_ausloeser_aktiv = true;
Serial.println("Kamera-Ausloeser aktiviert");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Kamera-Ausloeser");
lcd.setCursor(1,1);
lcd.print("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);
digitalWrite(autofocus_pin, LOW);
digitalWrite(lichtschranken_led, LOW);
kamera_ausloeser_aktiv = false;
Serial.println("Kamera-Ausloeser deaktiviert");
lcd.setCursor(1,2);
lcd.print("Kamera-Ausloeser");
lcd.setCursor(1,3);
lcd.print("deaktiviert");
}
}
|