ich habe erst seit kurzem einen Arduino und habe heute ein Verhalten bemerkt, dass ich mir nicht erklären kann.
Es geht um die digitalen Eingänge. Ich habe mit jeweils einem digitalen Eingang einen Taster verbunden. Und den Eingang als INPUT_PULLUP definiert, damit ich den internen Widerstand verwenden kann.
Mit einem Taster schalte ich eine LED ein mit dem andere Taster schalte ich die LED aus. Eigentlich ganz simpel.
Nun ist mir aufgefallen, dass ich für das Einschalten den Taster nur ganz kurz drücken muss. Das ist gut.
Dann ist wird der Ausgang für die LES angesteuert und die LED leuchtet.
Wenn ich nun den anderen Taster drücke, um die LED wieder auszuschalten ist mir aufgefallen, dass es nicht reicht den Taster genauso kurz zu drücken, sondern ich muss ihn ein kleines bisschen länger drücken.
Meine Anforderung an einem Mikroprozessor wäre eigentlich, dass ein sehr kurzer Tastendruck ausreicht und ich nicht ein zweites mal drücken muss.
Gerne kann ich euch Schaltbilder und Programmcode zukommen lassen. Aber vielleicht habt ihr auch so schon eine Erklärung für dieses Verhalten.
Wenn ich nun den anderen Taster drücke, um die LED wieder auszuschalten ist mir aufgefallen, dass es nicht reicht den Taster genauso kurz zu drücken, sondern ich muss ihn ein kleines bisschen länger drücken.
Ich glaube dir nicht.
Dein Programm ist nicht nur gruselig zu lesen, sondern passt auch nicht zur Problembeschreibung.
Denn:
Da nur ein Taster gelesen wird, kann auf den zweiten keine Reaktion erfolgen.
combie:
Ich glaube dir nicht.
Dein Programm ist nicht nur gruselig zu lesen, sondern passt auch nicht zur Problembeschreibung.
Denn:
Da nur ein Taster gelesen wird, kann auf den zweiten keine Reaktion erfolgen.
Bitte entschuldigt. Ich habe das Programm mittlerweile etwas modifiziert und arbeite nur noch mit einem Taster. Das Verhalten ist aber immer noch da.
Hier also das Originalprogramm - hoffentlich für euch einfacher zu lesen:
bool memswitch;
// the setup function runs once when you press reset or power the board
void setup() {
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
void loop() {
bool input1;
bool input2;
input1=not digitalRead(8);
input2=not digitalRead(9);
if (input1)
{
memswitch=true;
}
else if (input2)
{
memswitch=false;
}
if (memswitch==true)
{
digitalWrite(13, true);
delay(50);
digitalWrite(13, false);
delay(50);
digitalWrite(12, true);
delay(50);
digitalWrite(12, false);
delay(50);
digitalWrite(11, true);
delay(50);
digitalWrite(11, false);
delay(50);
} else
{
digitalWrite(13, false);
digitalWrite(12, false);
digitalWrite(11, false);
}
}
HotSystems:
Und wie ich sehe, meine Glaskugel hat Recht.
Deine zahlreichen millis stören deinen Sketch.
Lass bitte mal Deine Glaskugel überholen.
millis wäre gut, aber er verwendet das böse, böse delay.
@TO:
delay hält den Prozessor davon ab irgendwas anderes zu machen außer zu warten.
Schau Dir mal das Beispiel BlinkWithoutDelay in der IDE an und suche mal nach der Nachtwächtererklärung im Forum. Du musst Deine delay auf millis umbauen, dann geht es.
Katsumi_S:
delay hält den Prozessor davon ab irgendwas anderes zu machen außer zu warten.
Schau Dir mal das Beispiel BlinkWithoutDelay in der IDE an und suche mal nach der Nachtwächtererklärung im Forum. Du musst Deine delay auf millis umbauen, dann geht es.
Gruß, Jürgen
Vielen Dank an alle. Ihr habt natürlich recht. Wie konnte ich nur so blöd sein?
HotSystems:
Stimmt genau, sollte delay() heißen.
Aber gut, dass du es dennoch verstanden hast.
Natürlich ich als alter SPS Programmierer habe es sofort verstanden. Ich habe meinen Code nun angepasst und siehe da: Das LED-Lauflicht läuft (hat es ja vorher schon), und es reagiert schnell auf die Tastendrücker, insbesondere die Aus-Taste, wenn das Lauflicht läuft...
Danke nochmal für den stets freundlichen und hilfsbereiten Tonfall vom ersten Posting an und die freundliche Aufnahme.
Merke: Delay() ist böse!
bool bMemSwitch;
int iLedNo=0;
unsigned long uiPrevTime;
// the setup function runs once when you press reset or power the board
void setup() {
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
void loop() {
bool bInput1;
bool bInput2;
unsigned long uiCurrTime;
unsigned long uiDiffTime;
bInput1=not digitalRead(8);
bInput2=not digitalRead(9);
uiCurrTime=millis();
uiDiffTime=uiCurrTime-uiPrevTime;
if (bInput1) {
bMemSwitch=true;
iLedNo=0;
}
else if (bInput2) {
bMemSwitch=false;
}
if (uiDiffTime>=200) {
iLedNo=iLedNo+1;
if (iLedNo>2) {
iLedNo=0;
}
uiPrevTime=uiCurrTime;
}
if (bMemSwitch==true) {
if (iLedNo==0) {
digitalWrite(13, true);
digitalWrite(12, false);
digitalWrite(11, false);
}
if (iLedNo==1){
digitalWrite(13, false);
digitalWrite(12, true);
digitalWrite(11, false);
}
if (iLedNo==2) {
digitalWrite(13, false);
digitalWrite(12, false);
digitalWrite(11, true);
}
} else {
digitalWrite(13, false);
digitalWrite(12, false);
digitalWrite(11, false);
}
}