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 ...
// KONSTANTEN
const int lichtschranken_pin = A0;
const int ventil_pin = 12;
const int kamera_pin = 13;
const int ircontrol_pin = 11;
// 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);
pinMode(ircontrol_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);
}
// sets the pulse of the IR signal.
void pulseON(int pulseTime) {
unsigned long endPulse = micros() + pulseTime; // create the microseconds to pulse for
while( micros() < endPulse) {
digitalWrite(ircontrol_pin, HIGH); // turn IR on
delayMicroseconds(13); // half the clock cycle for 38Khz (26.32×10-6s) - e.g. the 'on' part of our wave
digitalWrite(ircontrol_pin, LOW); // turn IR off
delayMicroseconds(13); // delay for the other half of the cycle to generate wave/ oscillation
}
}
void pulseOFF(unsigned long startDelay) {
unsigned long endDelay = micros() + startDelay; // create the microseconds to delay for
while(micros() < endDelay);
}
void takePicture() {
for (int i=0; i < 2; i++) {
pulseON(2000); // pulse for 2000 uS (Microseconds)
pulseOFF(27850); // turn pulse off for 27850 us
pulseON(390); // and so on
pulseOFF(1580);
pulseON(410);
pulseOFF(3580);
pulseON(400);
pulseOFF(63200);
} // loop the signal twice.
}
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);
takePicture();
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");
}
}
Hallo niggoh und alle anderen,Gravierender Vorteil gegenüber der bisherigen Version: der ständige Upload vom PC aufs Arduino entfällt, da man die Zeiten nun auch per Knopfdruck verändern kann. Das System wird also wesentlich bequemer zu bedienen.
#include <LiquidCrystal.h> // LiquidCrystal Bibliothek einbinden
// Folgende PINS werden für Knöpfe und LCD genutzt und stehen somit nicht mehr zur Verfügung:
// LCD: Digital 4,5,6,7,8,9
// Knöpfe: A0
// Arduino-Pins für das LCD setzen
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// sonstige Arduino-Pins setzen
const int lichtschranken_pin = A1;
const int ventil_pin = 12;
const int kamera_pin = 13;
// Variablen und Konstanten für die Knöpfe am LCD Shield definieren
int LCD_Knopf = 0;
int Analoge_Knopf_Eingabe = 0;
#define rechts_Knopf 0
#define links_Knopf 1
#define oben_Knopf 2
#define unten_Knopf 3
#define select_Knopf 4
#define kein_Knopf 5
// 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, evtl. in nächster Programmversion später im EEPROM speichern!
int tropfenzeit_1 = 150;
int verschlusszeit_1_2 = 70;
int tropfenzeit_2 = 150;
int verschlusszeit_2_3 = 0; // auf Null gesetzt, solange noch keine Menüs existieren und wir nur mit 2 Tropfen arbeiten
int tropfenzeit_3 = 0; // auf Null gesetzt, solange noch keine Menüs existieren und wir nur mit 2 Tropfen arbeiten
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
// Standardwerte für Auslöseverzögerung festlegen, evtl. in nächster Programmversion später im EEPROM speichern!
int ausloeseverzoegerung = 288;
int tropfverzoegerung = 70;
// Zeit zwischen den Tropfenserien festlegen
int pausenzeit = 10000;
// Aktivierungszeit für Kameraauslöser festlegen
int ausloeser_aktivzeit = 200;
// Statusvariable Tropfen ausgelöst
boolean tropfen_ausgeloest = false;
// 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;
// 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;
// Debounce-Variablen
const int debounce_zeit = 100; // (in ms) reduzieren, um schnelleren Zahlendurchlauf bei Knopfdruck zu erreichen, erhöhen für langsameren Zahlendurchlauf
long debounce_zeitstempel = 0; // Zeitstempelvariable für Knopf-Debounce initialisieren
void setup() {
lcd.begin(16, 2); // LCD initialisieren
lcd.setCursor(0,0); // LCD Cursor in die erste Reihe nach oben links setzen
lcd.print("crazy machine"); // Programmnamen ausgeben
lcd.setCursor(0,1); // LCD Cursor in die zweite Reihe nach ganz links setzen
lcd.print("Version 0.1"); // Programmversion ausgeben
delay(1000); // 1 Sekunde verzögern
lcd.clear(); // Display löschen
lcd.setCursor(0,0);
lcd.print("Cam. delay");
lcd.setCursor(11,0);
lcd.print(ausloeseverzoegerung);
lcd.setCursor(14,0);
lcd.print("ms");
lcd.setCursor(0,1);
lcd.print("Drop delay");
lcd.setCursor(11,1);
lcd.print(tropfverzoegerung);
lcd.setCursor(14,1);
lcd.print("ms");
// 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);
Serial.begin(9600); // Serielles Verbindung (9600 Baud) starten
Serial.println("Funktioniert!"); // Auch über seriellen Port bekanntgeben, dass das Programm läuft
}
// ##############################
// BEGINN HAUPTSCHLEIFE VOID LOOP
// ##############################
void loop(){
if (debounce_zeitstempel + debounce_zeit < millis()) {
Knopf_Lesen(); // Knopfdruck auslesen und darauf entsprechend reagieren
debounce_zeitstempel = millis();
}
if (tropfen_ausgeloest == true) {
Tropfen_Fallen_Lassen();
}
}
// ############################
// ENDE HAUPTSCHLEIFE VOID LOOP
// ############################
void kamera_ausloesen() {
// 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");
}
}
// *******************************************
// BEGINN FUNKTION: VOID TROPFEN_FALLEN_LASSEN
// *******************************************
void Tropfen_Fallen_Lassen() {
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;
tropfen_ausgeloest = false;
Serial.println("Ende der Pause, Startzeit aktualisiert, Lichtschranke wieder scharf");
}
}
// *****************************************
// ENDE FUNKTION: VOID TROPFEN_FALLEN_LASSEN
// *****************************************
// *********************************
// BEGINN FUNKTION: VOID KNOPF_LESEN
// *********************************
// Funktion, um die auf Knopfdrücke zu reagieren
void Knopf_Lesen() {
LCD_Knopf = Umwandlung_Analoge_Knopf_Eingabe(); // Funktion Umwandlung_Analoge_Knopf_Eingabe aufrufen
switch (LCD_Knopf) { // Ergebnis der Funktion auswerten
case rechts_Knopf: { // Rechts Knopf gedrückt
if (ausloeseverzoegerung < 999) {
ausloeseverzoegerung = ausloeseverzoegerung + 1;
lcd.setCursor(11,0);
lcd.print(" ");
lcd.setCursor(11,0);
lcd.print(ausloeseverzoegerung);
}
break;
}
case links_Knopf: { // Links Knopf gedrückt
if (ausloeseverzoegerung > 0) {
ausloeseverzoegerung = ausloeseverzoegerung - 1;
lcd.setCursor(11,0);
lcd.print(" ");
lcd.setCursor(11,0);
lcd.print(ausloeseverzoegerung);
}
break;
}
case oben_Knopf: { // Oben Knopf gedrückt
if (tropfverzoegerung < 500) {
tropfverzoegerung = tropfverzoegerung + 1;
lcd.setCursor(11,1);
lcd.print(" ");
lcd.setCursor(11,1);
lcd.print(tropfverzoegerung);
}
break;
}
case unten_Knopf: { // Unten Knopf gedrückt
if (tropfverzoegerung > 0) {
tropfverzoegerung = tropfverzoegerung - 1;
lcd.setCursor(11,1);
lcd.print(" ");
lcd.setCursor(11,1);
lcd.print(tropfverzoegerung);
}
break;
}
case select_Knopf: { // Select Knopf gedrückt
tropfen_ausgeloest = true;
break;
}
case kein_Knopf: { // Kein Knopf gedrückt
break;
}
}
}
// *******************************
// ENDE FUNKTION: VOID KNOPF_LESEN
// *******************************
// *****************************************************
// BEGINN FUNKTION: INT UMWANDLUNG_ANALOGE_KNOPF_EINGABE
// *****************************************************
// Funktion, um Spannungsveränderungen durch die Knopfdrücke in einen Integer umzuwandeln (SELECT, LEFT, UP, DOWN, RIGHT)
int Umwandlung_Analoge_Knopf_Eingabe() {
// Wert von A0 auslesen und mit der "Knopfwerttabelle" vergleichen
Analoge_Knopf_Eingabe = analogRead(0);
// Knopfwerttabelle:
// Rechts: 0 // Oben: 142 // Unten: 328 // Links: 504 // Select: 741 // keiner: 1023
// mittels des Testprogramms ermittelt
// um Raum für Schwankungen zu lassen, uu jeder gemessenen Zahl etwa 50 addieren und die Werte zu den Knöpfen zugeordnet hier eintragen:
if (Analoge_Knopf_Eingabe > 1000) return kein_Knopf;
if (Analoge_Knopf_Eingabe < 50) return rechts_Knopf;
if (Analoge_Knopf_Eingabe < 195) return oben_Knopf;
if (Analoge_Knopf_Eingabe < 380) return unten_Knopf;
if (Analoge_Knopf_Eingabe < 555) return links_Knopf;
if (Analoge_Knopf_Eingabe < 790) return select_Knopf;
return kein_Knopf; // Falls alles andere nicht zutrifft: kein_Knopf zurückgeben
}
// ***********************************************
// ENDE FUNKTION: UMWANDLUNG_ANALOGE_KNOPF_EINGABE
// ***********************************************