Ein Taster 2 Funktionen

Hallo liebe Leute.
Obwohl ich es mir fest vorgenommen hatte, bin ich noch nicht großartig dazu gekommen, mich endlich mal in Sachen Arduino weiter zu bilden.

Jedenfalls benötige ich noch mal eure Hilfe bei einem kleinem Sketch. Der Sketch ist sicher alles andere als sinnvoll und ihr könnt da sicher bessere Vorschläge machen. Aber dennoch würde ich gern wissen warum es nicht ganz so läuft.

So soll es laufen.
-Wenn ich den Taster drücke und unter 3 Sekunden los lasse, soll Programm 1 ausgeführt werden.

-Wenn der Taster über 3 Sekunden gedrückt und gehalten wird, soll Programm 2 starten.
(die Zeitangaben stimmen noch nicht im Sketch)

Es gibt eine Variabel die immer nur +1 zählen sollte, wenn der Taster HIGH ist.

Die zweite if Bedingung soll nur erfüllt sein wenn der Taster LOW ist und die Variable größer als 1 ist.

Die dritte if Bedingung soll erst erfüllt sein, wenn der Taster HIGH ist und die Variabel größer als 90000 ist.

Problem bei if Bedingung 3.
Die dritte if Bedingung funktioniert aber nicht ganz richtig.
Sie tritt nur ein wenn man den Taster los lässt. (Was jetzt nicht das schlimmste ist) Aber auch bei den darauf folgenden Programmzeilen mit ( LEDPin2), ist die delay Pause nicht immer 2 Sekunden lang und das HIGH der LED somit manchmal kürzer.

int LEDPin = 15;
int LEDPin2 = 17;
long Timer = 0;
int InputPin = 2;
int SchalterZustand;

void setup(){
pinMode(InputPin,INPUT);
pinMode(LEDPin,OUTPUT);
pinMode(LEDPin2,OUTPUT);
}

void loop() {

SchalterZustand=digitalRead(InputPin);
if (SchalterZustand == 1) // Wenn Taster HIGH dann.. 
{
Timer++; // Variable +1
}

if ((SchalterZustand ==0) && (Timer > 1)) //Wenn Taster LOW ist und Variable größer als 1 ist dann.. 
{ 
digitalWrite(LEDPin,HIGH);
delay(2000);
digitalWrite(LEDPin,LOW);
Timer = 0; //setze Variable auf 0
}

if ((SchalterZustand == 1) && (Timer >90000)) //Wenn Taster HIGH ist und Variable größer als 90000 dann.. 
{
digitalWrite(LEDPin2,HIGH);
delay(2000);
digitalWrite(LEDPin2,LOW);
Timer = 0; // setze Variable auf 0

}
}

Würde mich echt über Hilfe freuen und auch über komplett andere Ansätze um das Vorhaben sicher umsetzen zu können.

Liebe Grüße
Christian

EDIT
Jetzt hab ich nach 20 min noch mal alles angeschlossen und auf einmal geht alles wie es soll... Mannnn. Ich versteh die Welt nicht mehr. Habe nichts geändert.

E-D-I-T

Es is in der Tat keine gute Idee einen Sketch in dieser Art zu schreiben. Die Geschwindigkeit der Programmdurchläufe, ändert sich nach der Rechenleistung des Chips selber, und damit stimmt natürlich auch die angestrebte Zeit nicht mehr. Also wenn beim Nano die Variable schon in 4 Sekunden auf dem gewünschten Wert addiert ist, benötigt ein Attiny bspw. 12 Sekunden bis die Durchläufe den selben Wert erreicht haben.

Also muss man wieder anpassen..

Hi

Die umständliche Zählerei kannst Du Dir sparen und Dein Programm 'flüssiger' machen, wenn Du statt delay() millis() benutzt.

delay() hält das Programm für x Millisekunden an - der Arduino macht hierbei Nichts (ok, ruft yield() auf, nur der Erwähnung wegen).

millis() liefert Dir die Laufzeit seit dem letzten Start in Millisekunden zurück.

Du kannst damit bei Tastendruck genau diese Zeit festhalten (startzeit=millis():wink:
Beim Lösen der Taste, oder wenn die aktuelle Zeit länger als die längste Wartezeit entfernt ist, machst Du weiter.

Die Laufzeiten werden so geprüft:
if (millis()-startzeit>=laufzeit){ mache was;}
Hintergrund: millis() ist nur 32bit breit, kann also nur bis 0xFFFFFFFF (was knapp über 47 Tage Laufzeit entspricht).
Wenn der Arduino länger läuft, läuft der Zähler auf Null über - die Berechnung klappt trotzdem.

Wenn Dein Programm jetzt Das macht, was Es machen soll und Du Dieses auch nicht mehr erweitern willst - lasse Es ruhig so, passt schon.
Beim nächsten Programm solltest Du Das hier aber im Hinterkopf haben.

Lesenswert dazu auch
Die Nachtwächter-Erklärung

MfG

PS: Schön, daß Du Dein Programm (wie auch immer :wink: ) hinbekommen hast!
Beim nächsten Mal auch gleich die Code-Tags benutzen.
C64 klingt nach 'altem Hasen'

Hi,

ich schau mir das auf jeden Fall mal an. Habe den attiny eh noch nicht hier, auf den letztlich alles drauf soll. freu

Der Attiny läuft eh immer nur 8 oder 9 Stunden am Stück. Da würde nichts voll laufen. Daher war mir es auch egal das der komplette arduino mit dem delay angehalten wird.

Nun ich habe auf dem C64 Basic gelernt. Aber das ist auch schon wieder so lange her. :wink:

Vielen Dank erst mal an dich.

Hi

Wer C64 Basic konnte, Den kann doch Nichts schocken :o
Hatte zu der Zeit einen Schneider CPC464, Dessen Basic war Da wesentlich komfortabler, man musste nicht Alles Poken - aber der Erfolg galt den C64 - mit der Pokerei konnte man, wenn man konnte, verdammt viel aus der Kiste raus holen.

MfG

Nach dem studieren der Nachtwärter Erklärung kannst dir auch die Library

#include "OneButton.h" // https://github.com/mathertel/OneButton

ansehen.

Mit der kann man relativ einfach Buttons abfragen, stark vereinfacht:

button.attachClick(tuWas);
button.attachDoubleClick(tuWasAnderes);
button.attachLongPressStop(tuNochWasAnderes);

Was ist C64?
Ich weiß wohl was eine 3.5" und 7.5" Diskette ist...

Ich benutze ClickButton Library für solche Sachen.
Die nimmt nicht viel mehr Speicher als wenn man es zu Fuß gemacht hätte und kann sogut wie alles, nur Kochen nicht.

Das ist ein Computer von 1983 Comodore C64. mit weniger Rechenleistung als ein Arduino, aber leicht mehr Speicher und Video und Sound
Grüße Uwe

Ich weiß wohl was eine 3.5" und 7.5" Diskette ist…

3.5" 5 1/4" und 8"

Comodore C64 ist an mir vorüber gegangen.
“Sinclair Spectrum Plus” wars bei mir.

uwefed:
mit weniger Rechenleistung als ein Arduino, aber leicht mehr Speicher und Video und Sound
Grüße Uwe

Und was für ein geiler Soundchip. Da ließ sich sogar schon die menschliche Stimme nachbilden.

Videos konnte man über ein gewissen Player auch noch laufen lassen.

Und seit einigen Jahren holt man das letzte aus der Kiste. Das hätten die sich in den 80ern nie träumen lassen.

Und selbst heute kommt noch neue Software für den Brotkasten raus.