Go Down

Topic: Led bei Tasten druck an und nach Verzögerung aus. (Read 1 time) previous topic - next topic

Doc_Arduino

#60
Nov 30, 2019, 03:35 pm Last Edit: Nov 30, 2019, 03:37 pm by Doc_Arduino
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#61
Nov 30, 2019, 03:42 pm Last Edit: Nov 30, 2019, 03:49 pm by Doc_Arduino
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?
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Diter

HEY... Ich habe es hin bekommen mit dem andren Sketch :)
 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  :)  :)   

Code: [Select]
#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.

Doc_Arduino

#63
Nov 30, 2019, 04:22 pm Last Edit: Nov 30, 2019, 04:23 pm by Doc_Arduino
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
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

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.

Code: [Select]

// 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;                    
  }
}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

postmaster-ino

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:
Code: [Select]

//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
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Diter

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 :D   

Code: [Select]
#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;
  }   
}

Rentner

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

Diter

 Ach  :smiley-grin: das Savety hat keine Bedeutung mehr... Hat der Kompilierer garnicht beanstandet  :smiley-roll-blue: 

Quote
Warum steht der Wert für max Pumenlaufzeit auf 500ms , stammt das noch vom Testen
Ja die Zeit ist nur Zum Testen gewesen.


Quote
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.

Doc_Arduino

Hallo,

viel gelernt bzw. das Richtige abgeschaut haste leider nicht.   :smiley-confuse:

Sieht alles wild zusammengeschustert aus.

Weil man mit einem Schwimmerschalter keine Hysterese programmieren kann, bleibt einem nur die Möglichkeit die Signaländerungen des Schwimmerschaltes über einen längeren Zeitraum zu detektieren, also schauen ob das nur ein Impuls war, Wasserwelle im Behälter, oder ob der neue Signalpegel länger anliegt um das daraus zu folgern das er jetzt wirklich sicher "geschalten" hat. Kann mit größer 30ms Debounce klappen. Ansonsten Detekt-Funktion erstellen.

Ich weiß auch nicht warum du das hier immer wieder rauskramst. Hundertmal wurde es anders (richtig) gezeigt. Funktioniert bei einem Werteüberlauf nicht sauber.
Code: [Select]

millis_now = millis() + Pumpeneinschaltdauer
...
if (millis() > millis_now)  {


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

postmaster-ino

Hi

WAS soll der Sketch machen?
Ich werde jetzt nicht den Thread erneut durchlesen und Dann Deinen aktuellen Sketch mit Meinem aus #65 vergleichen.
Davon ab ist noch nicht Mal klar, ob meine Umsetzung Deiner Vorstellung überhaupt entsprochen hat.

Nun denn - die Pumpe läuft, wenn der Schwimmer 'unten' ist und läuft nicht, wenn der Schwimmer 'oben' ist.
Soweit korrekt?
Du möchtest Nun, daß die Pumpe nicht mit jeder Welle, Die durch den Behälter wandert, an und aus geht?!?
Warum schreibst Du Das dann nicht?
Auch brauchst Du das Entprellen hier in keinster Weise - wenn die Abschalt-Bedingung - auch nur für den Bruchteil einer Sekunde - erkannt wird, hat die Pumpe AUS zu gehen - nicht erst, nachdem der Arduino darüber meditiert hat, ob der Kontakt noch zwölf Mal auf gegangen ist.
Du willst hier nicht einen Mehrfach-Impuls auf Einen reduzieren, Du willst nur den eigentlichen Impuls - und zwar JEDEN davon.
So, die Pumpe ist aus gegangen, der Schwimmer sagte nämlich soeben 'Wasser voll'.
Sobald der Schwimmer 'VOLL' sagt, nullst Du eine Zähl-Variable.
Wenn der Schwimmer 'NICHT VOLL' sagt (und eine Sekunde um ist), zählst Du diese Variable um 1 hoch.
Wenn diese Variable >=60 ist, startest Du die Pumpe.

Fertig
Mehr ist's nicht

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Diter

@postmaster-ino
Ja genau das meinte.
Entprellen Fliegt raus, OK.

Go Up