Led bei Tasten druck an und nach Verzögerung aus.

Hi

Etwas mitarbeiten darfst Du hier aber durchaus auch.
Was passiert, wenn Du dem Relais-Pin statt HIGH LOW anbietest?

MfG

Das habe Ich schon getestet dann ist der effect umgedreht immer aus.

Hallo,

das kann doch langsam alles nicht mehr wahr sein.

Wenn der Pin 9 auf GND liegt, also Schwimmerschalter geschlossen, dann soll nichts pumpen. Richtig?

Dann wäre dein Relais "low" aktiv. So wie das viele Relaisboards machen.
Dann musste wie postmaster schreibt die Logik umdrehen.
Also das High/Low der beiden Zeilen
digitalWrite(pinPumpe, xxx)
vertauschen.

Wenn du dann schreibst es ist damit immer aus, dann ist das doch genau das was du wolltest.
Signal auf GND ... es pumpt nicht.
Legste das Signal auf High, pumpt es für 60s nach Reset.

Ansonsten hätte ich jetzt eine Spannungsmessung von dir.

Welche Spannung liegt am Pin 9 wenn nicht gepumpt werden soll?
Welche Spannung liegt am Pin 9 wenn gepumpt werden?

Welche Spannung muss am Relais anliegen damit die Pumpe nicht läuft?
Welche Spannung muss am Relais anliegen damit die Pumpe läuft?

Ansonsten drehen wir uns nur im Kreis. Dann wäre ich auf Grund der Fliehkraft raus.

Hi

Doc_Arduino:
Ansonsten drehen wir uns nur im Kreis. Dann wäre ich auf Grund der Fliehkraft raus.

DER ist gut, der Tag fängt schon Mal amüsant an :slight_smile:

MfG

Hallo,

ich habe jedesmal neu versucht die Schaltlogik zu verstehen. Jedesmal dachte ich jetzt ist alles klar. Jedesmal war es erneut falsch. Entweder ist die Beschreibung nicht schlüssig oder ich weiß langsam nicht weiter. Gefühlt sind alle Logikänderungen mittlerweile "durchprobiert". Letzte Chance sind eindeutige Messungen. Ansonsten hätte Diter genügend Ansätze um eine eigene Lösung zu erarbeiten. Ich denke ja immer noch das nur ein Logikfehler/Beschreibungsfehler in der Kommunikation steckt. Erstmal abwarten würde ich sagen.

Welche Spannung liegt am Pin 9 wenn nicht gepumpt werden soll? // = 0V
Welche Spannung liegt am Pin 9 wenn gepumpt werden? // = 4,1V

Welche Spannung muss am Relais anliegen damit die Pumpe nicht läuft? //es solten 0V anleigen.
Welche Spannung muss am Relais anliegen damit die Pumpe läuft? // momentan liegen 4,2V an und somit ist das Relais betätigt

Hier einmal der Versuchsaufbau Pin 9 Liegt gegen GND, Arduino wurde eingeschaltet Pin9 hat 0V und das Relais ist betätigt!

Hier jetzt hoffentlich das Bild.

Hallo,

häng das Bild als Anhang ran, ich verlinke es dann.

Bzw. als Anhang anhängen, Beiträg absenden, rechte Maustaste auf den Anhang, Link kopieren, Beiträg modifizieren wählen und als Bild (Symbol in der Leiste) einfügen. Etwas umständlich ich weiß, geht aber nicht anders. Dafür bleibt das Bild immer erhalten solange du es nicht bewußt entfernst.

Hallo,

Deine Spannungsmessung entspricht genau meinem letzten Sketch.
Beides, der Pin vom Schwimmer und das Relaissteuersignal sind demzufolge High aktiv.
Genau wie du es beschreibst.
Hast du vielleicht am Relais Öffner und Schließer verwechselt?

Diter:

Hier hoffentlich das Bild.

Noch ein versuch :confused:

Aber warum ist das Relais den Permanent betätigt?
Solange der Pin9 gegen GND liegt und der Schlater geschlossen ist soll das Relais doch gar nicht arbeiten.

Hallo,

dann ist das Relais doch low aktiv. Obwohl wir das auch schon hatten.
Messe bitte nochmal den Schaltpin vom Arduino am Arduino welches zum Relais führt.
Welche Spannung hat der wenn die Pumpe aus ist?

Noch anders gefragt. Wenn der Relaissteuereingang nicht angeschlossen ist, ist dann das Relais angezogen (Pumpe läuft) oder nicht? Die Pumpe hängt am Schließer oder Öffnerkontakt?

Irgendwo hier muss ein Logikfehler drin stecken.

Edit:
Noch einfacherer Test. Klemme ein Kabel am Relaissteuereingang an. Mit dem anderen Ende wechselt du sachte zwischen GND und 5V am Arduino. Vorsichtig, keinen Kurschluss machen. Mit welcher Spannung reagiert das Relais/Pumpe wie gewünscht?

HEY... Ich habe es hin bekommen mit dem andren Sketch :slight_smile:
Und zwar arbeitet es jetzt so: Arduino Startet, Pin9 liegt gegen GND das Pumpen Relais ist nicht betätigt.
Wasserstand zu gering, Taster ist offen Relais Arbeitet Zeit xxxsec, Taster Schliesst wieder das Relais Arbeitet weiter bis Zeit xxxsec abgelaufen ist. So danach passiert nichts weiter, ausehr der Wasserstand sinkt und dann beginnt alles von vorne :slight_smile: :slight_smile:

#include <Bounce2.h>

byte Taster_Pumpe = 9;               // Taster an Pin 6 gegen Masse
#define Pumpe_Pin 10                 // Schaltpin Pumpe ein/aus
#define Pumpeneinschaltdauer 500    // maximale Pumpenlaufzeit
Bounce debouncer2 = Bounce();        // Instantiate a Bounce object Nr.2 ( Taster Pumpe )
bool safety = false;
void setup()  {
 
  digitalWrite(Pumpe_Pin, LOW);        // Schaltpin Pumpe aus
  pinMode(Pumpe_Pin, OUTPUT);          // Schaltpin Pumpe Ausgang
     
  // digitalen Eingang mit PullUp aktivieren 
  pinMode(Taster_Pumpe, INPUT);        // setzt Taster Pin als Eingang
  digitalWrite(Taster_Pumpe, HIGH);    // und aktiviert dessen PullUp Widerstand

  debouncer2.attach(Taster_Pumpe);
  debouncer2.interval(30);             // Entprellzeit 30ms für den Taster
 
}   // Ende setup


void loop(void) {

   Pumpe_schalten();  // Pumpe ein- oder ausschalten mittels Taster
     
}   // Ende loop


/* ------------------------------------------------------------------------------------------------ */


void Pumpe_schalten ()
{
  boolean stateChanged_2 = debouncer2.update();
  static boolean state_Pumpe = LOW;
  static unsigned long millis_now = 0;
  int state_2 = debouncer2.read();
 
  // wenn LOW Signal vom Taster erkannt, schalte Pumpe ein bzw. mit nächsten LOW wieder aus
  if ( stateChanged_2 && state_2 == HIGH ) {
    if ( state_Pumpe == HIGH ) {
      state_Pumpe = LOW;                             // Tasterdruck, Pumpe einschalten
      millis_now = millis() + Pumpeneinschaltdauer;   // maximale Einschaltdauer setzen
      }
      else {
        safety = true;              // erneuter Tasterdruck, Pumpe ausschalten
      }
      digitalWrite(Pumpe_Pin, state_Pumpe);
     
  }
 
  // wenn Pumpe läuft, dann nach eingestellter Zeit selbst wieder ausschalten
  if (millis() > millis_now)  {
       digitalWrite(Pumpe_Pin, HIGH);      // ausschalten nach x sec.
       state_Pumpe = HIGH;
       safety = true;
  }   
   
}

Jetzt Fragt sich nur noch wie Ich den Sketch erstmal nur auf einen Durchlauf begrenzen kann.

Hallo,

ich bin etwas sprachlos. Erstmal schön das es vorläufig funktioniert.
Aber.
Das Verhalten war von Anfang an mein Anliegen. Nur hast du ständig die Anforderungen geändert.
Das Problem lag also nur in der falschen Logik wie mehrfach vermutet.
Dein Programm ist zudem leider wild zusammengeschustert.
Jetzt haste wieder wilde pinMode Settings und defines sprichwörtlich reingekloppt.
Die Variable safety kannste rausnehmen, die fragst du nie ab.
Deine Kommentare sind zu oft falsch.
Es wird zudem spätestens nach 49 Tagen ein Problem zeigen wegen falscher Überlaufauswertung mit deiner Zeit.

Ich weiß nicht wie alt du bist und ob dir der Einstieg schwer fällt. Nur solltest du dringend die richtige Anwendung mit millis verstehen. Entweder aus den Beispielen oder du versuchst das hier zu verstehen.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0

Hallo,

ich habe mich nochmal hinraffen lassen. Deine Beschreibung zum Schaltverhalten des Schwimmers war auch falsch.
Am Ende sind Schwimmer und Relais beide low aktiv.
Das korrigiert wäre wie folgt.

// https://forum.arduino.cc/index.php?topic=649965.30

const byte pinSchwimmer = 2;              // schaltet gegen GND
const byte pinRelais = 28;
bool safety = false;                      // zusätzliche Sicherheitsstufe gegen Wiedereinschalten
unsigned long einschaltzeitRelais;

void setup()
{
  pinMode(pinSchwimmer, INPUT_PULLUP);
  digitalWrite(pinRelais, HIGH);          // Relais ist "low" aktiv
  pinMode(pinRelais, OUTPUT);
  
  if (!digitalRead(pinSchwimmer))         // Schwimmer ist "low" aktiv
  {
    einschaltzeitRelais = millis();    
    digitalWrite(pinRelais, LOW);         // einschalten
  }
  else
  {
    safety = true;
  }
}

void loop(void)
{
  if (!safety)
  {
    schaltePumpe(3000);
  }
}


// ****** Funktionen ******

void schaltePumpe (const unsigned long zeit)
{
  if (millis() - einschaltzeitRelais >= zeit)
  {
    digitalWrite(pinRelais, HIGH);
    safety = true;                     
  }
}

Hi

Wenn bei Dir zumindest schon Mal ein Anfangs-Erfolg zusammen gekommen ist - warst Du nicht ganz untätig.
Glückwunsch schon Mal bis hier hin.
Meine Version dazu sieht so aus:

//Foren-Sketch
//Nachlaufzeit für Pumpe über Schwimmerschalter
// https://forum.arduino.cc/index.php?topic=649965.msg4388679#msg4388679

//vom Anwender einzustellen
const boolean AN = HIGH;      //Wert für Pumpe AN (also HIGH oder LOW eintragen)
const boolean WASSEROK = LOW; //Wert für Sensor Wasser ist ok (dito)
// Es muß ein externer Pull-Widerstand verbaut werden
const byte pinPumpe = 3;      //wo hängt die Pumpe dran
const byte pinSchwimmer = 6;  //und wo der Schwimmer
const uint32_t nachlaufzeit = (uint32_t)60 * 1000; //Nachlaufzeit in ms
// =========== wird automatisch 'generiert' - die Gegenteile zu oben
const boolean AUS = !AN;
const boolean WASSERNOK = !WASSEROK;

boolean nachlauf, pumpe;  //Zustände, Die ich mir merken will
uint32_t lastmillis;      //letzte Schaltzustand

void setup() {
  pinMode(pinPumpe, OUTPUT);
  pinMode(pinSchwimmer, INPUT); //bei Schwimmer gegen GND kann INPUT_PULLUP benutzt werden
}

void loop() {
  if (digitalRead(pinSchwimmer) != WASSEROK) {
    digitalWrite(pinPumpe, AN);   //wenn Wasserstand unterschritten, Pumpe an
    pumpe = true;
  } else {
    if (pumpe == true && nachlauf == false) { //wenn genügend Wasser UND Pumpe AN, dann ab in die Nachlaufzeit
      nachlauf = true;
      lastmillis = millis();  //Startzeit für Nachlauf
    }
  }
  if (nachlauf == true && millis() - lastmillis >= nachlaufzeit) {
    pumpe = false;  //Ist die nachlaufzeit aktiv UND bereits vorbei? -> Abschalten
    nachlauf = false;
    digitalWrite(pinPumpe, AUS);
  }
}

Der Sketch verwendet 1044 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 15 Bytes (0%) des dynamischen Speichers, 2033 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Ungetestet, sollte aber Deinem Ablauf entsprechen und außerdem leicht auf Deine Pegel abzuändern sein.

MfG

Schönen guten Abend,

Ich habe es nun geschafft den Versuchsaufbau in die Realität um Zusätzen.
Was sonst immer so gut geklappt hab ist in der Praxis doch ganz anders.

Der Sketch funktioniert an sich und macht das was er soll aber es gibt da ein Problem mit der Pumpe,
aber der Schwimmer reagiert nach dem befüllen so empfindlich das die Pumpe wieder angesteuert wird und dann gibt es ein Problem :o nun Dachte das man den Taster Pin 9 nach Betätigung und nachdem er die Pumpe für x Sek. angesteuert hat erstmal für 1min deaktiviert ist bis sich das Wasser beruhigt hat.

Aber das was Ich probiert habe hat bis jetzt nicht funktioniert.
Ich hoffe wir bekommen es wieder so gut zusammen hin :smiley:

#include <Bounce2.h>

byte Taster_Pumpe = 9;               // Taster an Pin 6 gegen Masse
#define Pumpe_Pin 10                 // Schaltpin Pumpe ein/aus
#define Pumpeneinschaltdauer 500    // maximale Pumpenlaufzeit
Bounce debouncer2 = Bounce();        // Instantiate a Bounce object Nr.2 ( Taster Pumpe )
bool safety = false;
void setup()  {
 
  digitalWrite(Pumpe_Pin, LOW);        // Schaltpin Pumpe aus
  pinMode(Pumpe_Pin, OUTPUT);          // Schaltpin Pumpe Ausgang
     
  // digitalen Eingang mit PullUp aktivieren
  pinMode(Taster_Pumpe, INPUT);        // setzt Taster Pin als Eingang
  digitalWrite(Taster_Pumpe, HIGH);    // und aktiviert dessen PullUp Widerstand

  debouncer2.attach(Taster_Pumpe);
  debouncer2.interval(30);             // Entprellzeit 30ms für den Taster
 
}   // Ende setup


void loop(void) {

   Pumpe_schalten();  // Pumpe ein- oder ausschalten mittels Taster
     
}   // Ende loop


/* ------------------------------------------------------------------------------------------------ */


void Pumpe_schalten ()
{
  boolean stateChanged_2 = debouncer2.update();
  static boolean state_Pumpe = LOW;
  static unsigned long millis_now = 0;
  int state_2 = debouncer2.read();
 
  // wenn LOW Signal vom Taster erkannt, schalte Pumpe ein bzw. mit nächsten LOW wieder aus
  if ( stateChanged_2 && state_2 == HIGH ) {
    if ( state_Pumpe == HIGH ) {
      state_Pumpe = LOW;                             // Tasterdruck, Pumpe einschalten
      millis_now = millis() + Pumpeneinschaltdauer;   // maximale Einschaltdauer setzen
      }
      else {
        safety = true;              // erneuter Tasterdruck, Pumpe ausschalten
      }
      digitalWrite(Pumpe_Pin, state_Pumpe);
     
  }
 
  // wenn Pumpe läuft, dann nach eingestellter Zeit selbst wieder ausschalten
  if (millis() > millis_now)  {
       digitalWrite(Pumpe_Pin, HIGH);      // ausschalten nach x sec.
       state_Pumpe = HIGH;
       safety = true;
  }   
}

Hallo,
Mach es doch einfach so das die Pumpe mindestens z.B 30s aus sein muss um neu starten zu können, dann sollte es doch passen. Oder hab ich was falch verstanden. Wozu dient die Variable savety ?

Warum steht der Wert für max Pumenlaufzeit auf 500ms , stammt das noch vom Testen ?

Heinz

Ach :grin: das Savety hat keine Bedeutung mehr... Hat der Kompilierer garnicht beanstandet :roll_eyes:

Warum steht der Wert für max Pumenlaufzeit auf 500ms , stammt das noch vom Testen

Ja die Zeit ist nur Zum Testen gewesen.

Mach es doch einfach so das die Pumpe mindestens z.B 30s aus sein muss um neu starten zu können

Ja so hatte Ich mir das auch vorgestellt aber Ich habe da nichts gescheites hinbekommen.