Problem mit einem Taster

Guten Abend an Alle,
Ich bin ein Arduino Anfänger und brauche Eure Hilfe.
Ich habe einen Sketch zusammen gestellt, der soweit funktioniert aber…,
ich möchte einen Taster sperren bzw. deaktivieren, so dass er nur einmal auslöst,
das kriege ich nicht hin.

Anbei die Funktion.

Mit einem Taster (Taster gedrückt und gehalten) schalte ich eine Pumpe ein.
Mit einem Sensor überwache ich den Druck.
Sobald die Pumpe den Druck erreicht hat, schaltet sie sich ab.
Wenn der Taster weiterhin gedrückt gehalten wird, fällt der Druck unter den Schwellenwert ab und die Pumpe startet erneut, das möchte ich verhindern.
Danke im Voraus
Col

Button_versuche.ino (1.49 KB)

Hallo,

da muss jetzt reine Logik ins Spiel und der Taster muss entprellt werden.
a) Taster entprellen mit millis()
Theseus erklärt millis()
GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung

b) nicht retriggerbares Monoflop programmieren
Überlege dir welche Signaländerungen wann erfolgen und auf welche du reagieren möchtet und auf welche nicht.

c) die Bounce2 Lib könnte dir dabei helfen

ich möchte einen Taster sperren bzw. deaktivieren, so dass er nur einmal auslöst,

Mir scheint:
Du möchtest "endliche Automaten" bauen.

Hi

Und ggf. nicht in logischen Pegeln, sondern in Flanken (Pegel-ÄNDERUNGEN) denken.

... wenn Pumpe aus UND Taster von 0->1, DANN Pumpe an
... wenn Druck erreicht, DANN Pumpe aus

MfG

Vielen Dank für die Hinweise. Ich versuche es zu lösen. Momentan komme ich nicht weiter.
Gruß
Col

Colargol:
Vielen Dank für die Hinweise. Ich versuche es zu lösen. Momentan komme ich nicht weiter.
Gruß
Col

Dann setze deinen Sketch in Code-Tags hier ins Forum.
Dann können alle den Sketch besser lesen, auch die Mobilisten.
Und du hast sicher mehr Helfer.

Hallo,
ich habe die Datei angehängt.
Gruß
Col

test-fix.ino (1.83 KB)

Das mit dem verstehenden Lesen musst Du noch üben. Hotsystems hat Dir doch klar gesagt, wie der Sketch eingebunden werden soll.

Hier nochmal mit einer Anleitung:

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *). So ist er auch auf portablen Geräten lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

int ledRot = 5;
int ledBlau = 6;
int potPin = A0;
int latchPin = 9;
int clockPin = 8;
int dataPin = 10;
int buttonPin = 2;
int buttonPin2 = 3; 
int leds = 0;
int buttonState = 0;
#define DELAYTIME  5000 // 5 sec
unsigned long tasterMoment;


void setup() {
  
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(ledRot, OUTPUT);
  pinMode(ledBlau, OUTPUT);
}
void loop() {
  buttonState = digitalRead(buttonPin);

  int reading  = analogRead(potPin);
  int numLEDSLit = reading / 114;  //1023 / 9
  leds = 0;
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.0 / 1023.0);

  for (int i = 0; i < numLEDSLit; i++)
  {
    bitSet(leds, i); 
}
 if (digitalRead(buttonPin2) == HIGH) // Taster 2
   {digitalWrite(ledRot, LOW);
    digitalWrite(ledBlau, LOW);}
 {
  if (digitalRead(buttonPin) == HIGH && voltage <= 4.0)
   {digitalWrite(ledRot, HIGH);
    digitalWrite(ledBlau, HIGH);}
    
  else if (digitalRead(buttonPin) == HIGH && voltage >= 4.0)
   {digitalWrite(ledRot, LOW);
    digitalWrite(ledBlau, LOW);}
    
  else{
   digitalWrite(ledBlau, LOW);}
   
   
  if(digitalRead(buttonPin) && voltage <= 4.0)
  { 
    tasterMoment= millis();
    digitalWrite(ledRot, HIGH);
  }   
  if (millis() - tasterMoment >= DELAYTIME) 
  {
    digitalWrite(ledRot, LOW);
  }
 } 
 updateShiftRegister();
}

 
void updateShiftRegister()
{
   digitalWrite(latchPin, LOW);
   shiftOut(dataPin, clockPin, MSBFIRST, leds);
   digitalWrite(latchPin, HIGH);
}

Hallo,

wozu ist der zweite Taster da , dann gibts da 2 LED aber keinen Motor. Wie hast Du die Taster angeschlossen ?

bool flag ;
void setup() {
  // put your setup code here, to run once:


  pinMode(pin, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  if (digitalRead(taster) == HIGH && !flag) { // Flanke erkennen
    flag = true;
    delay(10); // entprellen sollte hier mal so erlaubt sein
    // hier Motor einschalten
  }

  if (digitalRead(taster)) == LOW) flag = 0; // Reset Hilfsmerker


  }

Hallo,
die rote LED ist ein Magnetventil, die blaue LED ist der Motor. Der zweite Schalter lässt den Druck ab.
Die Taster sind mit Pulldown Widerstand angeschlossen.

Hi

Warum nennt man dann den Motor nicht Motor?
const byte pinMotor=12;
Wow - Da wird wohl der Motor mit gesteuert ... was ein Zufall !1ELF11
STRG+T in der IDE rückt den Code auf Klammerebene ein - please try this at home
Ohne einen einzigen halbwegs sinnvollen Kommentar ist der Sketch ... ein Sketch ... halt ohne größeres Interesse, Den zu zerpflücken.

So, wie war nun das Problem, was ist gewünscht, was passiert statt Dessen, was wurde bisher dagegen unternommen, wie lief's?

MfG

Hallo,

ok die Lösung hast Du bekommen must sie halt noch richtig einbauen. Es beruht darauf das Du dir merkst das der Taster gedrückt wurde , das macht die Variable flag. Einschalten kannst Du nur dann wenn Flag LOW ist und das ist nur dann der Fall wenn der Taster mal aus war.

Heinz

Erstmal besten Dank für die Hilfe.
Heinz, ich versuche gerade Dein Code einzubauen, bis jetzt ohne Erfolg.
Das soll genau so funktionieren, wie Du beschrieben hast.
Gruß
Col

Hallo,

bevor du dich verrennst, schreibst du dir einen kleinen Sketch der nur einen Taster mittels millis() entprellt und wenn gedrückt LED13 leuchtet. Siehe beide Links in Beitrag #1. Das wäre Übung 1.

Colargol:
Wenn der Taster weiterhin gedrückt gehalten wird, fällt der Druck unter den Schwellenwert ab und die Pumpe startet erneut

Bin zwar auch neu bei der Arduino Programmierung, aber ich verstehe erstmal nicht wieso ein Schalter, der, wenn er gedrückt ist, eine Bedingung dafür dass die Pumpe arbeitet erfüllt, und dabei Druck aufbaut, für Druckabfall verantwortlich sein soll?

Taster an && Sensor sagt brauche noch Druck= Pumpe pumpt
Taster an && Sensor sagt habe genug Druck=Pumpe geht aus (und bleibt auch aus, auch wenn ich weiter den Taster drücke

Oder etwa nicht?

Warum verwendest du zum zitieren die Code-Tags ?

Danke. So besser(?).

AGKAGKAGK:
Danke. So besser(?).

Ja, so ist es super.
Danke

Taster an && Sensor sagt brauche noch Druck= Pumpe pumpt
Taster an && Sensor sagt habe genug Druck=Pumpe geht aus (und bleibt auch aus, auch wenn ich weiter den Taster drücke

Oder etwa nicht?

Lese noch mal die Frage!

Male eine Zustandstandsdiagramm.
(gilt für den TE und für dich)