Hilfe bei millis()

Hallo, ich habe ein kleines Problem mit der millis() Funktion. Eine einzelne millis() Anwendung bekomme ich hin, auch habe ich den Sinn verstanden. Das was mir jetzt Probleme bereitet, ich komme nicht mehrere zum laufen. Ich habe den Code eingefügt und möchete nun die delays raus haben und durch millis ersetzen. Es sollen 2 verschiedene zeitvariablen genutzt werden. Der 1. Code funktioniert aber im 2. Code geht gar nichts(ist zum testen gedacht :slight_smile: ).
Es soll auch immer einen art geben, zum abbrechen der for schleife.

1.Code

#include <Bounce.h>
#include <LiquidCrystal.h>
#include <Encoder.h>

LiquidCrystal  lcd(17, 4, 5, 6, 7, 8);  // LCD
Encoder  myEnc (15, 16);                 // Encoder


int KameraPin = 3;  //Kamera auslöser Optokopler
int Motor1Pin = 0 ;   //Slidermotor vorwärts//
int Motor2Pin = 18 ;  //Slidermotor rückwärts//
int MotorsteuerungPin = 11 ;  //Slider Geschwindigkeit//
int encoderknopfpin = 1 ;  // Encoder Bushbutton //
int menueknopfpin = 9;  // Menueauswahl Schalter  S1//
int zurueckknopfpin = 10 ;  // Zruückschalter  S2//
int AkkuPin  = A5  ;  // Akku Ladezustand messen//
int interzeit = 0;    // Encoderintervallzeit//       



Bounce startknopf = Bounce(encoderknopfpin, 50);
Bounce menueknopf =  Bounce(menueknopfpin, 50);
Bounce zurueckknopf = Bounce(zurueckknopfpin, 50);


int zaehler1 = 0;
int zaehler2 = 0;
int zaehler3 = 0;
int akkuwert = 0;  // akku spannug am A5//
//int akkuausgabe = 0;  //Akku ausgabe wert für LCD//
unsigned long vorher;  //Zeitwert 0 Aufnahme
unsigned long vorher1;  // Zeitwert 1 Aufnahme
unsigned long vorher2;  // Zeitwert 2 Aufnahme
int ausloe = 0;         // Auslösung

int Intervall [] = { 100, 1000, 2000, 5000, 10000 };    // Intervall Kameraauslösung Zeit
int Kamerastatus = LOW;
int Sliderstatus = LOW;

void setup()
{ pinMode(KameraPin, OUTPUT);
  pinMode(Motor1Pin, OUTPUT);
  pinMode(Motor2Pin, OUTPUT);
  pinMode(MotorsteuerungPin, OUTPUT);
  pinMode(encoderknopfpin, INPUT);
  pinMode(menueknopfpin, INPUT); 
  pinMode(zurueckknopfpin, INPUT);
  pinMode(AkkuPin,  INPUT);
 vorher = 0;
  
  lcd.begin(16, 2);
  //Serial.begin(9600);
  lcd.print( "Fototimer MK 600");
  delay(2000);
  lcd.clear();
     
  
}
long position = -999;

void loop()

{
   akkuwert = analogRead(AkkuPin);
  float V = akkuwert * ( 12.0 / 1023.0);
   lcd.setCursor(10, 0);
   lcd.print(V);
   lcd.setCursor(15, 0);
   lcd.print("V");

  
    long newPos = (myEnc.read())/4;
        if (newPos != position) {
            position = newPos;  } 
            
            
  menueknopf.update ();   //update für Menüknopf-Auswahl//
  int menuewert = menueknopf.read();
     
 zurueckknopf.update ();    
 int zurueckwert = zurueckknopf.read();  
     zurueckwert++; 
 
 startknopf.update();
 int startwert = startknopf.read();
  if(startwert == HIGH)
     zaehler1++; 
 
if(startwert == 1)
{
 for(int i = 1; i < 400; i++)
 {
   lcd.setCursor(0,1);
  lcd.print(i);
  lcd.print(" Foto   ");
 digitalWrite(KameraPin, HIGH);
 delay(500);
 digitalWrite(KameraPin, LOW);
 delay(newPos * 1000);
  
 }
} 
  
  
  
  lcd.setCursor(0,0);
  lcd.print(newPos);
  lcd.print( " Zeit  ");
  zaehler1 = zaehler1%4; 
 }
  1. Code ( die Variablen sind gleich..)
long position = -999;

void loop()

{
  akkuwert = analogRead(AkkuPin);
  float V = akkuwert * ( 12.0 / 1023.0);
   lcd.setCursor(10, 1);
   lcd.print(V);
   lcd.setCursor(15, 1);
   lcd.print("V");
   menueknopf.update ();   //update für Menüknopf-Auswahl//
  int menuewert = menueknopf.read();

zurueckknopf.update ();    
 int zurueckwert = zurueckknopf.read();  
     zurueckwert++; 
 
 startknopf.update();
 int startwert = startknopf.read();
  if(startwert == HIGH)
     zaehler1++; 
 
 
  if(menuewert == HIGH)
     zaehler1++; 
     
        long newPos = (myEnc.read())/4;
        if (newPos != position) {
            position = newPos;  } 
           
     
     
     switch(zaehler1)
  {
       case 0:  lcd.setCursor(0, 0);
                 lcd.print( "Menue Test");       
                 lcd.setCursor(1, 6);
                 lcd.print(position);
      
                break;
       case 1:
               lcd.setCursor(0, 0);
               lcd.print("Foto 400");
               
                 if((millis() - vorher1) > Intervall[2])
                 {
                   vorher1 = millis();
                   Kamerastatus = !Kamerastatus;
                   digitalWrite(KameraPin, Kamerastatus);
                     zaehler2++; 
                 }
                 ausloe = (zaehler2 / 2);
                 lcd.setCursor(1, 4);
                 lcd.print(ausloe);
                                                   
                 break;
                      
       case 2 :
               lcd.setCursor(0, 0);
               lcd.print( "HDR 7");
                if((millis() - vorher1) > 1000)
                  {
                    Sliderstatus =!Sliderstatus;
                    digitalWrite(Motor2Pin, Sliderstatus);
                    if(zurueckwert == 1)
                       break;
                   }
               
                if((millis() - vorher2) > 1000)
               {
                   vorher2 = millis();
                   Kamerastatus = !Kamerastatus;
                    digitalWrite(KameraPin, Kamerastatus);
                   
               }
               break;
       
        case 3 :
               lcd.setCursor(0, 0);
               lcd.print( "Foto 400 Slider");
               
               if((millis() - vorher1) > Intervall[2])
               {
                   
                   Kamerastatus = !Kamerastatus;
                    digitalWrite(KameraPin, Kamerastatus);
                    zaehler3++;
               }
                 if((millis() - vorher1) > Intervall[2])
                  {
                   
                    Sliderstatus =!Sliderstatus;
                    digitalWrite(Motor2Pin, Sliderstatus);
                   }
                   
                 ausloe = (zaehler3 / 2);
                 lcd.setCursor(1, 4);
                 lcd.print(ausloe);
 
              break; 
            }

  
  zaehler1 = zaehler1 % 4;
 
}

Wo liegt nun mein denk fehler :~

Gruß Marco

  menueknopf.update ();   //update für Menüknopf-Auswahl//
  int menuewert = menueknopf.read();

zurueckknopf.update ();    
 int zurueckwert = zurueckknopf.read();  
     zurueckwert++; 
 
 startknopf.update();
 int startwert = startknopf.read();
  if(startwert == HIGH)
     zaehler1++; 
 
 
  if(menuewert == HIGH)
     zaehler1++;

Diese Zähler mußt Du alle mittels L-H Flanke (oder H-L flanke falls Du einen Pullupwiderstand verwendest) erhöhen, nicht mittels Zustand des Tasterpins damit ein Tastendruck die Zählerwariable nur einmal erhöht. siehe Toggle On and Off - Pre-Engineering: Electronics with Micro-controllers

case 1:
               lcd.setCursor(0, 0);
               lcd.print("Foto 400");
               
                 if((millis() - vorher1) > Intervall[2])
                 {
                   vorher1 = millis();
                   Kamerastatus = !Kamerastatus;
                   digitalWrite(KameraPin, Kamerastatus);
                     zaehler2++; 
                 }
                 ausloe = (zaehler2 / 2);
                 lcd.setCursor(1, 4);
                 lcd.print(ausloe);
                                                   
                 break;

Du mußt die Logik des Switch case Bedingung ändern.
Der Startknopf darf nicht die Switch variable ändern sondern die Switch case aktivieren, da ansonsten das Foto dauernd ausgelöst wird.

Bitte beschreibe wie die Steuerung des Fotoapparats funktionieren soll.

Grüße Uwe

Hallo, die zaehler wären das nächste Problem. Ich habe mir den link angesehen und werde es dem entsprechend ab ändern. ich hänge aber gerade bei den millis(). Wer kann mir da helfen?
Ich möchte die delay´s gern durch millis() ersetzen.

if(startwert == 1)
{
 for(int i = 1; i < 400; i++)
 {
   lcd.setCursor(0,1);
  lcd.print(i);
  lcd.print(" Foto   ");
 digitalWrite(KameraPin, HIGH);
 delay(500);
 digitalWrite(KameraPin, LOW);
 delay(newPos * 1000);
  
 }
}

Die Kamera wird über einen Optokopler gesteuert, was schon recht gut funktioniert.
Im "case1" ist zwischen KameraPin HIGH 500ms Pause und dann LOW. Aber im "Case2" soll dann der (newPos*1000) und 500ms nach dem KameraPin LOW zutreffen.
Ich möchte einmal die Pausenlänge zwischen HIGH und LOW steueren und dann die Pausenlänge zwischen LOW und HIGH. Das in unterschiedlichen case aufgeteilt.
Im Code 2 sieht man meinen kläglichen Versuch, es mit millis zuversuchen aber leider ohne Erfolg.

Gruß Marco

Ähnlich schlecht wie delay() ist deine for-Schleife.

loop() an sich ist die Schleife.
Sorg dafür dass sie schnell fertig ist, und prüfe beim nächsten Mal wieder, ob eine Wartezeit abgelaufen ist.
Du solltest dir dazu merken, wie der KameraPin gerade steht und vieviele Fotos du schon gemacht hast.

boolean k = LOW;
int foto = 9999;
unsigned long t;
void loop()
{
      if (digitalRead( Startbutton) && foto >= 400)
      { 
          foto = 1; // Start-Trigger 
      }

      if (foto <= 400)
      {
           if (k == LOW)
           {
                 if ( millis() - t > (newPos*1000) )
                 {
                      k = HIGH;
                      digitalWrite(KameraPin, k);
                      myLcdDisplay ( foto );  // Positionieren,Text ausgeben ... ( meine Faulheit, hier eine Funktion hinzuschreiben ) 
                      t = millis();
                 }
           } 
           else      // k == HIGH
           {
                 if (millis() - t > 500)
                 {  
                       // Delay zu ende
                       k = LOW;
                       foto ++;
                       digitalWrite(KameraPin, k);
                       t = millis();   // startet das andere delay
                 }
           }
      }
}

.. und nicht von den vielen Klammern verwirren lassen :wink:

Deinen startwert verstehe ich evtl. nicht richtig...
Hab mal einen Button mit pulldown angenommen, stattdessen

Hi, Danke für die schnelle Hilfe. XD XD XD XD XD
Werde es gleich mal ausprobieren.

Gruß Marco