1 Taster Sketch Einschaltproblem

Hallo Forum!

Ich habe mir einen Uno zugelegt um eine spezielle Blitz/Kamerasteuerung mit einer Lichtschranke als Trigger zu erstellen.
Da ich absoluter Neuling bin vielleicht ein etwas zu komplexes Projekt aber das ist die einzige Anwendung zu der ich eine Elektronik brauche.
Nun versuche ich Step by Step zu verstehen wie das alles funktioniert.
Als ersten Erfolg habe ich die mit einem Taster zu aktivierende und wieder ausschaltbare LED zum Leuchten bekommen. Allerdings läuft beim Strom anlegen an den Ardunio der Sketch sofort los und die LED leuchtet.
Geht das auch anders? Ich möchte nach Strom anlegen zunächst gar keine Reaktion, erst beim Ersten Betätigen des Tasters.

Gruß
Jürgen

Hallo,

Am besten Du postest Dein Sketch (in </> Code Tages). Natürlich geht es, dass sich die LED erst nach dem Tastendruck, einschaltet.
Du hast hast es ja geschafft, dass der Taster die LED ein und ausschaltet, also einfach die LED im setup() ausgeschalten lassen.

Grüße,
Donny

Ja, das geht auch anders.
Dazu solltest du uns deinen Sketch zeigen(Code-Tags verwenden, Schaltfläche </> oben links im Forum-Editorfenster) und deinen Sketch posten.
Dann können wir daran helfen.

Danke, mache ich nachher wenn ich wieder am PC bin.

Hier mein Sketch:
Die LED an Pin 7 habe ich hinzugefügt um das zu testen, funktioniert.
Nur wie gesagt startet der Sketch direkt nach Anlegen einer Spannung am Arduiono mit der Aktivierung der LED's und das möchte ich nicht.

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
  pinMode(7, OUTPUT);
   // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin, HIGH);
    digitalWrite(7,HIGH);
  } else {
    digitalWrite(ledPin, LOW);
    digitalWrite(7,LOW);    
  }

}

Nimm ein anderes Pin Ausgang für die Auslösung der kamera als Pin13 da an diesem eine LED hängt die vom Bootlaoder angesteuert wird.
Grüße Uwe

Hallo,

int lastButtonState = 1;     // previous state of the button

Wenn der Wer auf 1 steht sollte es funktionieren. (Zeile 8 )

// Delay a little bit to avoid bouncing

Dem muss ich mich anschließen aber für Dein (einziges) Projekte kann es reichen.

Grüße,
Donny

Leider keine Änderung.
Zudem habe ich den Sketch so geändert, dass PIN 13 nicht angesprochen wird, trotzdem leuchtet die Diode sofort nach Anschalten dauerhaft. Sie wird aber nicht mehr parallel zur externen Diode per Taster an- und ausgeschaltet. Ist das normal, dass sie leuchtet?

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 7;        // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 1;     // previous state of the button

void setup() {
  
  pinMode(buttonPin, INPUT);     // initialize the button pin as a input:
  pinMode(ledPin, OUTPUT);       // initialize the LED as an output:
  Serial.begin(9600);            // initialize serial communication:
}


void loop() {
  
  buttonState = digitalRead(buttonPin);   // read the pushbutton input pin:

  
  if (buttonState != lastButtonState)     // compare the buttonState to its previous state
  {
   
    if (buttonState == HIGH)              // if the state has changed, increment the counter
    {
     
      buttonPushCounter++;                // if the current state is HIGH then the button went from off to on:
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      Serial.println("off");              // if the current state is LOW then the button went from on to off:
    }
      delay(50);                          // Delay a little bit to avoid bouncing
  }
 
  lastButtonState = buttonState;          // save the current state as the last state, for next time through the loop


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);

  }

}

Hallo,

Wie hast Du den Taster eigentlich verkabelt? 5v -> Taster -> Pin (und einen 10k Pulldown) ?
edit:

int lastButtonState = 0; // <- Den wieder auf "normal" stellen    // previous state of the button

void setup() {
  pinMode(buttonPin, INPUT);     // initialize the button pin as a input:
  pinMode(ledPin, OUTPUT);       // initialize the LED as an output:
  digitalWrite(ledPin, LOW); // Ausgang ausschalten
  Serial.begin(9600);            // initialize serial communication:
}

Grüße,
Donny

Wenn ich keinen Fehler gemacht habe ja...

ok, ich hab in #8 noch was verändert, funktioniert es so?

Erstmal danke für die Hilfe.

Leider funktioniert es immer noch nicht.

Hier mal ein Bild der Verkabelung:

Mein Testaufbau

Der aktuelle Sketch

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 7;        // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
  pinMode(buttonPin, INPUT);     // initialize the button pin as a input:
  pinMode(ledPin, OUTPUT);       // initialize the LED as an output:
  digitalWrite(ledPin, LOW);     // Ausgang ausschalten
  Serial.begin(9600);            // initialize serial communication:
}
void loop() {
  buttonState = digitalRead(buttonPin);   // read the pushbutton input pin:
  if (buttonState != lastButtonState)     // compare the buttonState to its previous state
  {
  if (buttonState == HIGH)              // if the state has changed, increment the counter
  {
      buttonPushCounter++;                // if the current state is HIGH then the button went from off to on:
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      Serial.println("off");              // if the current state is LOW then the button went from on to off:
    }
      delay(50);                          // Delay a little bit to avoid bouncing
  }
 
  lastButtonState = buttonState;          // save the current state as the last state, for next time through the loop


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

Hallo,

Du machst es einen nicht leicht mit der Verkabelung, schwarz ist normalerweiße Masse und rot 5v. So wie ich das auf dem Foto erkenne ist der 10k Widerstand mit 5v verbunden. Das Kabel ist ja richtig gewählt aber dann alles verkehrt angesteckt. :confused:
Soweit ich das erkennen kann, stimmt die Schaltung aber soweit.

Ich hab den Code mal überarbeitet, jetzt sollte er funktionieren.

// this constant won't change:
const byte  buttonPin = 2;    // the pin that the pushbutton is attached to
const byte ledPin = 7;        // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0; // den kannst Du auch rausnehmen! // counter for the number of button presses
bool buttonState = 0;         // current state of the button
bool lastButtonState = 0;     // previous state of the button

bool buttonPress;

void setup() {
  pinMode(buttonPin, INPUT);     // initialize the button pin as a input:
  pinMode(ledPin, OUTPUT);       // initialize the LED as an output:
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);            // initialize serial communication:
}


void loop() {
  buttonState = digitalRead(buttonPin);   // read the pushbutton input pin:
  if (buttonState != lastButtonState)     // compare the buttonState to its previous state
  {
    if (buttonState == HIGH)              // if the state has changed, increment the counter
    {
      //buttonPress != buttonPress;  // LED wird beim drücken eingeschaltet
      buttonPress = false; // erst beim loslassen, siehe unten
      buttonPushCounter++;                // if the current state is HIGH then the button went from off to on:
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      //buttonPressed != buttonPress; // 
      buttonPress = true; // so wird beim loslassen die LED eingeschaltet
      Serial.println("off");              // if the current state is LOW then the button went from on to off:
    }
      delay(50);                          // Delay a little bit to avoid bouncing
  }
 
  lastButtonState = buttonState;          // save the current state as the last state, for next time through the loop


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPress) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

Grüße,
Donny

Hallo Donny!

Sorry, ich hab das eins zu eins von einer Beschreibung übernommen.
Ist mir auch schon aufgefallen, werde ich ändern.

Jetzt bleibt die LED zwar aus beim Einschalten ABER der erste Tasterdruck lässt die LED leuchten und ab da ist es dann so, dass die LED bei gedrücktem Taster LOW ist, bei geöffnetem HIGH

Gruß
Jürgen

Hallo,

Ja, sorry, war ein Denkfehler (etwas aus der Übung).

So sollte es jetzt hoffentlich funktionieren (aber die LED geht an sobald man drückt, nicht erst beim loslassen).

// this constant won't change:
const byte  buttonPin = 2;    // the pin that the pushbutton is attached to
const byte ledPin = 7;        // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0; // den kannst Du auch rausnehmen! // counter for the number of button presses
bool buttonState = 0;         // current state of the button
bool lastButtonState = 0;     // previous state of the button

bool buttonPress;

void setup() {
  pinMode(buttonPin, INPUT);     // initialize the button pin as a input:
  pinMode(ledPin, OUTPUT);       // initialize the LED as an output:
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);            // initialize serial communication:
}


void loop() {
  buttonState = digitalRead(buttonPin);   // read the pushbutton input pin:
  if (buttonState != lastButtonState)     // compare the buttonState to its previous state
  {
    if (buttonState == HIGH)              // if the state has changed, increment the counter
    {
      buttonPress != buttonPress;  // LED wird beim drücken eingeschaltet
      buttonPushCounter++;                // if the current state is HIGH then the button went from off to on:
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      buttonPress != buttonPress;
      Serial.println("off");              // if the current state is LOW then the button went from on to off:
    }
      delay(150);  // etwas erhöht                        // Delay a little bit to avoid bouncing
  }
 
  lastButtonState = buttonState;          // save the current state as the last state, for next time through the loop


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:

  if (buttonPress) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

}

Wenn das auch nicht geht dann reden wir morgen weiter. (mir raucht schon der Kopf :confused: & :sleeping: )

Poste doch mal die Seriellen Ausgaben.

Grüße,
Donny

Um ungewollte Flankenerkennungen bei Reset zu verhindern, würde ich noch diese Zeilen in setup einfügen:

  buttonState = digitalRead(buttonPin);
  lastButtonState = buttonState;

Danke dir erstmal!
Super, dass du dich meiner annimmst.

Weiß noch nicht ob ich das heute testen kann.
Melde mich aber dann sofort!

Ja, die LED soll ja auch erst angehen wenn der Taster das erste Mal gedruckt wird.
An bleiben und erst beim nächsten Tastendruck wieder aus gehen.

Letztlich wird die LED dann irgendwann von einem Optokoppler ersetzt, das soll nämlich die Kamerasteuerung werden.

Mir schwant schon schlimmes... Wenn das schon ein solches Problem ist...
Ich brauche dann später noch einen Eingang ( Signal der Lichtschranke), der wenn er geschaltet wird, zunächst mit Timer einen Blitz auslösen soll und, ebenfalls mit Timer, den Kameraverschluss abschaltet...

Und ich möchte das auch verstehen was da wie gemacht wird und nicht nur machen lassen...

Gruß
Jürgen

Hallo,

Neuer Tag. :slight_smile:
Ich hab das jetzt mal schnell nachgebaut, funktioniert mit diesem Code einwandfrei. Ich hab unten einfach was umgedreht.

// this constant won't change:
const byte  buttonPin = 2;    // the pin that the pushbutton is attached to
const byte ledPin = 7;        // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
bool buttonState = 0;         // current state of the button
bool lastButtonState = 0;     // previous state of the button

void setup() {
 
  pinMode(buttonPin, INPUT);     // initialize the button pin as a input:
  pinMode(ledPin, OUTPUT);       // initialize the LED as an output:
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);            // initialize serial communication:
}


void loop() {
 
  buttonState = digitalRead(buttonPin);   // read the pushbutton input pin:
  
  if (buttonState != lastButtonState)     // compare the buttonState to its previous state
  {
    if (buttonState == HIGH)              // if the state has changed, increment the counter
    {
      buttonPushCounter++;                // if the current state is HIGH then the button went from off to on:
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      Serial.println("off");              // if the current state is LOW then the button went from on to off:
    }
      delay(50);                          // Delay a little bit to avoid bouncing
  }
 
  lastButtonState = buttonState;          // save the current state as the last state, for next time through the loop


  // turns on the LED every four button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 2 == 0) {
   // digitalWrite(ledPin, HIGH); // raus
    digitalWrite(ledPin, LOW); // rein
  } else {
    digitalWrite(ledPin, HIGH);
    //digitalWrite(ledPin, LOW);
  }

}

Mir schwant schon schlimmes... Wenn das schon ein solches Problem ist...
Ich brauche dann später noch einen Eingang ( Signal der Lichtschranke), der wenn er geschaltet wird, zunächst mit Timer einen Blitz auslösen soll und, ebenfalls mit Timer, den Kameraverschluss abschaltet...

Ganz so schlimm ist es dann auch dann auch nicht, es geht eigentlich immer um die Flankenerkennung. Einen Sensor ist manchmal "einfacher" abzufragen als einen Taster, da ein Taster mechanisch prellt.

Aber ich muss dazu sagen, hier wird nur mit delay() entprellt, das ist nicht so Toll. Schau Dir mal das Beispiel BlinkWithoutDelay an oder ließ Dir mal den Nachtwächter durch.

Die Lichtschranke ändert auch nur den Pegel auf HIGH (oder LOW, je nachdem).
Mit Timer meinst Du eine verzögerte Auslösung? Wenn ja, dann kannst Du dann auch wie im Beispiel BlinkWithoutDelay zusammenbauen.

Grüße,
Donny

Alles klar, ich werde mir das dann alles in Ruhe zu Gemüte führen... Und versuchen zu verstehen.

Mein geplanter Ablauf soll dann am Ende so aussehen:

Ardunio ein
Parallel dazu mit separater Versorgung Lichtschranke ein.
Am Ausgang der LS soll ein Piezo hängen, der piepst sobald ein Signal kommt.
Taster am Uno wird gedrückt
Kameraverschluss öffnet
Wird nun die LS ausgelöst, öffnet diese, auch unabhängig vom Uno,, einen externen Verschluss ( Highspeed) auslösen.
Zusätzlich soll nun an einem Ausgang des Uno mit einer noch zu bestimmenden Verzögerung ein Blitz ausgelöst werden.
UND die Verbindung zur Kamera soll, ebenfalls mit einer noch zu bestimmenden Verzögerung, getrennt werden.
Idealerweise soll dann nach einem Delay alles wieder 'scharf" geschaltet werden, bis mit einem erneuten Tastendruck die ganze Sache wieder in den Ausgangszustand zurück gesetzt wird.

Hört sich ja gar nicht soo kompliziert an, mal sehen wie lange ich brauche bis das funktioniert...

Gruß
Jürgen

jojolino:
Mein geplanter Ablauf sieht soll dann am Ende so aussehen:
...
Am Ausgang der LS soll ein Piezo hängen, der piepst sobald ein Signal kommt.

Wahrscheinlich ist es besser den Piezo an das Arduino anzuschließen. Hast Du schon eine Lichtschranke oder baust Du dir die selber? Der Piezo braucht für einen halbwegs vernüftigen Ton mehr als nur die Flanke der Lichtschranke.

Wird nun die LS ausgelöst, öffnet diese, auch unabhängig vom Uno,, einen externen Verschluss ( Highspeed) auslösen.

Was meinst Du mit "Highspeed"? Wie dem auch sei, hier solltest Du einen Optokoppler verwenden den Rest würde ich mit dem Arduino machen.

Hört sich ja gar nicht soo kompliziert an, mal sehen wie lange ich brauche bis das funktioniert...

Mit oder ohne Hilfe? :smiling_imp: imho hört sich das schon etwas kompliziert an, aber ich hab auch keine konkrete Vorstellung von Deinem Projekt.
Machst Du Langzeitbelichtungen und beim durch das Bild gehen wird der Blitz ausgelöst?

Was ich auch noch nicht so recht verstehe, die Kamera soll auslösen wenn man auf einen Knopf drückt, dann kommt irgendwann der Blitz und dann soll die verbindung getrennt werden, die Verschlusszeit musst Du ja im vorhinein auf der Kamera einstellen. :confused:

Übrigens:

Zudem habe ich den Sketch so geändert, dass PIN 13 nicht angesprochen wird, trotzdem leuchtet die Diode sofort nach Anschalten dauerhaft. Ist das normal, dass sie leuchtet?

Ja, wenn Du zB folgenden Code auf das hoch ladest und anschließend den nächsten bleibt die LED 13 an.

void setup() {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
}

void loop() { }

und dann den hier:

void setup() {
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
}

void loop() { }

Es gibt kein zurücksetzen des Pins, das bleibt im Register gespeichert. Kurz gesagt, es ist normal.

Grüße,
Donny