Button bestimmte Zeit gedrückt

hi,

ich steh grad auf dem schlauch.
hätte mal jemand ein codebeispiel wie ich eine button abfrage ob er 3 sek am stück gedrückt wird?

ich hätte gerne etwa:

-button 3 sek. gedrückt
-programm start
-lese analogwert
-speichere auf sd
-widerhole das bis butoon 3 sek. lang gedrückt.

irgendwie fällt mir das grade schwer(schon ne weile her das ich c++ in der schule hatte..)

mfg

Hast du die Basics und entsprechenden Beispiele schon durch?

Tipp:

  • prüfen, ob Button gedrückt
  • wenn gedrückt Zeit merken (millis) und Statusvariable setzen
  • wenn Button wieder losgelassen Statusvariable sofort zurücksetzen (keine 3 Sekunden gedrückt)
  • nach 3 Sekunden nachschauen, ob Button immer noch gedrückt
  • wenn immer noch gedrückt mache dieses, jenes und anderes

wenn gedrückt Zeit merken (millis) und Statusvariable setzen

Wenn nicht gedrückt, Zeit merken.
Wenn Zeit länger als 3 Sec, tuwas().
Denn so braucht es keinen Status.
Den brauchts erst, um tuwas() Wiederholungen zu unterbinden.

im prinzip stell ich mir das so vor:

while(button = HIGH)
{
delay(3000)
set i = 1
}

while(i=1)
{
readvalue(spannung)
write(spannung).sd
}

nur wie bekomme ich nebenher ein pogramm zum laufen das i zurücksetzt?

Probier das doch mal aus.

hm, ich denke das wird nicht hinhaun.

ich korrigiere nochmal kurz oben:

while(button = HIGH)
{
delay(3000)
set i = 1
}

while(i=1)
{
readvalue(spannung)
write(spannung).sd
delay(50)
}

ich will alle 50ms schreiben,
kann also am ende der schleife kein delay von 3000 ms einfügen.

So wird das nix. Lies und beantworte bitte Post #1

kann also am ende der schleife kein delay von 3000 ms einfügen.

Meines Erachtens nach, solltest du komplett auf delay() verzichten.

delay() ist in einem solchen Fall immer schlecht. Versuche es mit einer Funktion, die den gedrückt - Status des buttons in einer statischen Variablen speichert. Diese Funktion rufst du aus loop() auf und reagierst entsprechend.

bool dreiSekundenGedrueckt() {
  // Diese Variable wird nur beim ersten Durchgang auf 0 gesetzt, danach bleibt ihr Wert erhalten
  static unsigned long startZeit = 0;

  // Wenn die Taste in diesem Moment nicht gedrückt ist, kann sie auch nicht seit 3 Sekunden gedrückt sein
  // Die startZeit wird in diesem Fall auf 0 zurück gesetzt
  if (!digitalRead(8)) {
    startZeit = 0; 
    return false; 
  }

  // Wenn die Startzeit 0 ist, war die Taste vorher noch nicht gedrückt
  // Wir setzten die Startzeit und geben false zurück
  if (startZeit == 0) {
    startZeit = millis();
    return false;
  }

  // Die Taste ist schon längere Zeit gedrückt
  // Gib zurück, ob schon 3 Sekunden vergangen sind
  return (millis() - startZeit >= 3000);
}

Gruss
René

Library Clickbutton oder OneButton nutzen ist auch eine Lösung.

Das würde ich auch sagen. Ist recht einfach die Libary.

clickbutton und oneklick muss ich mir noch anschaun.

dreiSekundenGedrueckt() gibt 1 zurück wenn der button länger als 3 sek gedrückt war,
ansonsten 0 wenn ich das richtig sehe.

ich hänge irgendwie daran wie ich mit dem einen status einmal an und einmal auschalten kann.
bei:

int statusAN =0

loop()

if (digitalRead(buttonPin1)=HIGH)
{
statusAN = 1
}

if (digitalRead(buttonPin2)=HIGH)
{
statusAN = 0
}

kann ich das programm ja einfach solange durch eine while schleife lauen lassen bis der andere knopf gedrückt wird.
wie ich das mit einem knopf hinbekomme versteh ich im moment noch nicht.

Es ist doch eigentlich ganz einfach:

Statusvariablen(Boolean) sind Taste und Unterprogramm

loop
{
Wenn keine Taste gedrückt speichere aktuelle millis() in altmillis und Taste=false
Wenn millis()-altmillis>3000 und Taste=false dann Taste=true, Unterprogramm=!Unterprogramm (!=logisches nicht)
Wenn Unterprogramm=true dann Aufruf Unterorogramm
}

Taste sorgt dafür, dass zwischen an und abschalten des Unterprogramms einmal der Taster losgelassen werden muss. Unterprogramm schaltet zwischen an und aus um, bei jedem Tastendruck länger als 3sec…

combie:
Wenn nicht gedrückt, Zeit merken.
Wenn Zeit länger als 3 Sec, tuwas().
Denn so braucht es keinen Status.
Den brauchts erst, um tuwas() Wiederholungen zu unterbinden.

Da unsere Beiträge gerne übersehen werden, hier ein weiterer zum Übersehen:

const byte ledPin = 13;
const byte tasterPin = 2;
unsigned long aktMillis, altMillis;
unsigned int zeit = 3000;
bool zustand = false;
bool aenderung;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(tasterPin, INPUT_PULLUP);
}

void loop() {
  aktMillis = millis();
  if (digitalRead(tasterPin) == LOW) {
    if ((aktMillis - altMillis >= zeit) && aenderung) {
      aenderung = false;
      zustand = !zustand;
      digitalWrite(ledPin, zustand);
    }
  } else {
    aenderung = true;
    altMillis = aktMillis;
  }
  if (zustand) machWas();
}

void machWas() {
  // Analogwert lesen
}

Dieser Vorschlag hat Optimierungspotential.

danke, werd mich mal durch alles durcharbeiten