Hi zusammen,
Vorweg: versucht es bitte auf dem Sanften Wege
Ich bin seit Dienstag Stolzer Besitzer (und sogar Eigentümer) eines Arduino Starter Kits.
Jetzt sitze ich zur Freude meiner Frau fast 24/7 an meinem Schreibtisch und frickel vor mich hin.
Erfahrung in C? nope!
Ich hab 1983 auf der Volkshochschule mal nen BASIC-Kurs belegt... ist aber schon was her...
Mein Ziel: Motorisierung/Automatisierung
Für den Anfang hab ich mir da was leichtes vorgenommen: Kameraslider mit Pan/Tilt und Timelaps-Steuerung. hüstel
OK, vorerst sollte erst mal die Fernauslösung funktionieren
Jetzt mein Problem:
Nach viel lesen und Stöbern im Forum bin ich imho schon ganz gut voran gekommen, habe aber jetzt das typische while-Problem: Ausstieg aus der Schleife bei Knopfdruck.
Bitte verlinkt jetzt nicht auf die Millis-Funktion; soweit bin ich schon, aber irgendwie will er nicht...
Während der "Millis-Schleife" hält er die eingestellte Pause (int pause) nicht ein und er unterbricht auch nicht sofort bei Knopfdruck (digitalRead (2)).
Also, was soll passieren?
- Zuerst über Poti einen Wert zwischen 1-30 Sekunden eingeben (int pause)
- dann button drücken
- nach Ablauf des 5-sekündigen Countdowns
- erste Aufnahme, dann (int pause) - zweite Aufnahme ... usw
währen dieser Pause möchte ich jetzt gerne durch Knopfdruck aus der while-Schleife raus... aber alles was ich bisher probiert habe funktioniert nicht:
while, delay, millis, if/else... jetzt bin ich mit meinem Latein am Ende. Wo liegt mein Denkfehler?
Vorab schon mal vielen Dank für die Hilfe!
hier mal mein sketch: (ja, geht bestimmt einfacher/besser/intelligenter, aber bedenkt, ich arbeite mich erst seit 3 Tagen in das Thema ein )
/*
*************************************************************
*************************************************************
TIMELAPS FOR CANON EOS 600D
V0.5 2017-08-17
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int poti = A2;
int pause;
int LED = 3;
int ausloeser = 4;
int cdown;
int Anz;
int xit;
unsigned long Mil;
unsigned long DelayTime;
// Belegung für 16x2 LCD-Modul
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3,POSITIVE);
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(poti, INPUT);
pinMode (ausloeser, OUTPUT);
lcd.begin(16,2); // ### Begruessungsbildschirm ###
lcd.setCursor(2,0);
lcd.print("Timelaps 0.5");
lcd.setCursor(1,1);
lcd.print("2017 by HAGGIE");
digitalWrite(ausloeser, LOW);
}
void loop()
{
delay(2000); //2 Sekunden Pause
lcd.clear(); //Display löschen und Cursor nach oben links
lcd.home();
// *** Intervall Einstellen bis Start gedrueckt wird ***
while(digitalRead(2)==LOW)
{
pause = analogRead(poti); // Wert vom Poti einlesen
pause = map(pause, 0, 1023, 0, 30); // Poti den Wert 0-30 zuweisen
if (pause < 1)
{
lcd.setCursor(0,0); // ### DISPLAY ###
lcd.print("off "); // Anzeige "off" bei 0 Sekunden-Timer
}
else
{
lcd.setCursor(0,0); // ### DISPLAY ###
lcd.print("alle ");
lcd.print(pause); // Anzeige der eingestellten Sekunden
lcd.print(" Sek. ");
}
}
lcd.clear(); //Display loeschen und Cursor nach oben links
lcd.home();
// *** 5 Sekunden Countdown bis zum Start der Aufnahme ***
cdown = 5;
while(cdown>0)
{
lcd.setCursor(0,0); // ### DISPLAY ###
lcd.print("Aufnahme startet");
lcd.setCursor(0,1);
lcd.print(" in ");
lcd.print(cdown);
lcd.print(" Sek. ");
digitalWrite(LED, HIGH);
delay(150);
digitalWrite(LED, LOW);
delay(850);
cdown = cdown - 1;
}
lcd.clear(); // Display loeschen und Cursor nach oben links
lcd.home();
// Anzeige während Aufnahme laeuft und Kontroll-LED blinkt
Anz = 0; // Zähler Anzahl Bilder auf 0
xit = 0;
while(xit == 0) // Serienaufnahme bis Stop gedrueckt wird
{
Anz = Anz + 1; // Zähler Anzahl Bilder +1
lcd.setCursor(0,0); // ### DISPLAY ###
lcd.print("Aufn. ");
lcd.print(pause); // Anzeige Intervall
lcd.print(" Sek. ");
lcd.setCursor(0,1);
lcd.print("Anz.Bilder: ");
lcd.print(Anz); // Anzeige Anzahl Bilder
digitalWrite(LED, HIGH); // Kontroll-LED an
digitalWrite(ausloeser, HIGH); // Fernausloeser fuer 1,5 sek. triggern
delay(1500);
digitalWrite(ausloeser, LOW); // Fernausloeser auf 0
digitalWrite(LED, LOW); // Kontroll-LED aus
Mil = millis(); // #####################################################
DelayTime = Mil + (pause*1000); // AB HIER: nicht funktionierender while-Ersatz
// mit Ausstiegsmöglichkeit während der "delay-zeit"
while (Mil < DelayTime) // |
{ // |
if (digitalRead(2)==LOW) // |
{ // |
Mil = Mil + 1; // |
} // |
if (digitalRead(2)==HIGH) // |
{ // |
Mil = DelayTime; // |
xit = 1; // |
} // V
} // bis hierhin läuft's nicht
} // ######################################################
lcd.clear(); // Display loeschen und Cursor nach oben links
lcd.home();
// Anzeige nach Aufnahme
lcd.setCursor(0,0); // ### DISPLAY ###
lcd.print("Aufnahme beendet");
lcd.setCursor(0,1);
lcd.print(Anz);
lcd.print(" Bilder"); // Anzeige Summe Bilder
delay(5000);
while (digitalRead(2)==LOW) // Anzeige bis erneut Stop gedrueckt wird <<-----
{
lcd.setCursor(0,0); // ### DISPLAY ###
lcd.print("Aufnahme beendet");
lcd.setCursor(0,1);
lcd.print(Anz);
lcd.print(" Bilder"); // Anzeige Summe Bilder
}
lcd.clear(); // Display loeschen und Cursor nach oben links
lcd.home();
}