Button

Hey, ich habe eine Kuriosität, die ich nicht nachvollziehen kann. Es geht darum, über einen Button ein Motor zu starten. Ich nutze dazu die Button
libary. Das Programm mit dem nachfolgenden Code funktioniert aber nur, wenn ich mir die Variable i in der for-Schleife über "Serial.println(i)" ausgeben lasse. Wenn ich die Zeile als Kommentar mache und i nicht ausgegeben wird, startet der Motor nicht. Woran liegt das?

#include "OneButton.h"
int motorPin = 9;  
const int buttonPin = 2;

OneButton button(buttonPin, false);

void setup() {
   Serial.begin(9600);
   Serial.println("Mehtode Setup");
   pinMode(buttonPin, INPUT);
   pinMode(motorPin, OUTPUT);
   button.attachClick(clickedIt1);     
}

void loop() {
button.tick();  
delay(10);
}


void clickedIt1() {
 Serial.println("click it");
for (int i=0; i<500; i++){
Serial.println(i);                                               // hier

digitalWrite(motorPin, HIGH);
 }
  digitalWrite(motorPin, LOW);
}

(deleted)

Was versprichst Du dir von dieser for-Schleife?

for (int i=0; i<500; i++){
Serial.println(i);

 digitalWrite(motorPin, HIGH);
  }
   digitalWrite(motorPin, LOW);
}

Du startest den Motor nur, während die for-Schleife läuft. Ohne das Serial.println ist die aber so schnell durchgelaufen, dass der Motor da garnichts von merkt.

P.S. mal ein ctrl-T in der IDE um deinen Code vernünftig zu formatieren wäre nicht schlecht. Und Du solltest Code immer in Code-Tags posten ( der Button </> links oben im Editor )

DerImker:
... ich habe eine Kuriosität, ... nutze dazu die Button
libary. ...

Ich finde kurios, dass Du für etwas dermaßen Simples wie die Abfrage eines gedrückten Knopfes eine Bibliothek benutzt.

Dein Code ist sehr schlecht zu lesen. Hübsche ihn noch ein bisschen auf - z. B. mit sinnigen und einheitlichen Einrückungen - und fasse ihn in Code-Tags.

Gruß

Gregor

Ich hoffe die Bibliothek hat was gutes und entprellt.
Grüße Uwe

DerImker:
.....
Woran liegt das?

Das Problem liegt meist daran, dass man ohne zwingenden Grund eine Library verwendet, die man nicht kennt und die nötigen Grundlagen dabei vergisst, zu lernen.

Nutze eine simple Tasterabfrage aus den Beispielen der IDE und du lernst gleich etwas dazu.

Danke für die schnellen Antowrten!

@MicroBahner
So was habe ich mir schon gedacht, mal schauen wie ich das umgehe bzw. regel, dass der Motor nur für eine bestimmte Zeit läuft.

@Gregorss
ich nutze die Bibliothek, da so automatisch ein gedrückt halten des Knopfes umgangen wird der Motor bei jetzigem Code nur die entsprechende Laufzeit läuft und nicht durch das gedrückt halten verlängert wird.

@uwefed
ein gedrückt halten wird verhindert, wenn man das entprellen nennt, dann macht sie das :slight_smile:

@hotsystems
Da hast definitiv Recht, wobei es mir als Anfänger um Funktionalität geht, dennoch lernt man mit seinen Aufgaben und ich bin wie gesagt am Anfang.

Hi

Ich sehe das Problem, daß der Motor ohne Anzeige wesentlich kürzer (oder gar nicht) dreht, weil die Anzeige pro Zeichen eine Millisekunde braucht, braucht der Motorlauf 500ms - also eine halbe Sekunde.
Ohne Ausgabe läuft die FOR direkt durch - und danach geht der Motor auch schon wieder aus.

MfG

DerImker:
Da hast definitiv Recht, wobei es mir als Anfänger um Funktionalität geht, dennoch lernt man mit seinen Aufgaben und ich bin wie gesagt am Anfang.

Du lernst def. besser und schneller, wenn du für solch einfache Aufgaben auch einfache Anweisungen (Basics) verwendest.

DerImker:
@MicroBahner
So was habe ich mir schon gedacht, mal schauen wie ich das umgehe bzw. regel, dass der Motor nur für eine bestimmte Zeit läuft.

Die 'Anfängervariante' wäre ein delay() dort reinzubauen. Das entspricht dann in etwa dem, was Du mit deiner for-Schleife machen wolltest.
Besser ist es aber über einen nicht blockierenden Timer. Entweder baust Du dir da selbst was mit millis(), oder Du verwendest den MoToTimer aus meinen MobaTools. Da ist ein Besipiel dabei ( Zeitgeber_02.ino ), wie man eine Led per Taster einschaltet, die dann nach einer Zeit von selbst wieder ausgeht. Das ist ja ungefähr das gleiche.

Hallo,
Du willst den Motor mit dem Button starten und dan eine bestimmte Zeit laufen lassen. Dann ist Dein Ansatz den du jetzt hast ziemlich unglücklich.

Man könnte das zwar mit der One Button lib machen aber das ist nur Gemurkse in dem Fall. Die one button Lib dient dazu einem Button mehrere Ereignisse zu ordnen zu können. Du hast aber nur eines. Bei der Verwendung von Zeiten solltest Du dir gleich die Verwendung von millis() angewöhnen. Delay ist denkbar schlecht weil es blokiert. Du must die Flanke von dem Button erkennen, und dann damit arbeiten, dann stört dich auch nicht wenn der Button länger als die Laufzeit gedrückt ist. Es gibt auch fertige Libs die Verzögerungen (timer) erzeugen.

Heinz

@uwefed
ein gedrückt halten wird verhindert, wenn man das entprellen nennt, dann macht sie das :slight_smile:

Nein, das nennt man Flankenerkennung. Aber Entprellung ist notgedrungen auch dabei.
Grüße Uwe

Ich habe die for-SChleife aufgelöst und es über MoToTimer umgesetzt, vielen dank für die Hilfe aller !