Arduino Forum

International => Deutsch => Topic started by: Diter on Nov 24, 2019, 08:26 pm

Title: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 24, 2019, 08:26 pm
Schönen guten Abend,
Ich bin der Diter bin neu und beschäftige mich seit kurzem mit einem Arduino Pro Micro.

Ich habe schon ein paar Erfahrungen sammeln können aber nun komme ich nicht weiter.
Momentan habe Ich versucht eine Led so zu Schalten das wenn an Pin9 Spannung anliegt die Led aus ist wird diese aber entfernt soll die Led für einen gewissen Zeitraum Leuchten, Sagen wir 1min., ist das möglich oder schon zu lang?

Alles was Ich bis jetzt hinbekommen habe ist das die Led an und aus geht :o
Code: [Select]
int LEDrot = 10;
int Switch = 9;
int SwitchStatus = 0;
int delaytime = 60000;
void setup ()
{


pinMode(LEDrot, OUTPUT);
pinMode(Switch, INPUT); 
}

void loop () {
SwitchStatus=digitalRead(Switch); //Schalterstatus abfragen
if (SwitchStatus == HIGH) // Bei Schalter an
{
digitalWrite(LEDrot, LOW);

 }
if (SwitchStatus == LOW) // Bei Schalter aus
{
digitalWrite(LEDrot, HIGH);
delay (delaytime); 
digitalWrite(LEDrot, LOW);

}
}


Liebe Grüsse
Diter
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: beeblebrox on Nov 24, 2019, 08:36 pm
Genau das hast du auch programmiert.

Ich nehme an wenn du deine Taste einfach fest hälts geht die LED nie aus.
Oh Moment -> bei Taste gedrückt setzt du den Ausgang auf LOW. Wenn du die LED
gegen Masse geschaltet hast geht sie auch bei gedrücktem Taster nicht an.

Wie hast du den Taster angeschlossen ?
Mit Pulldown gegen +5 V ?
Dann stimmt erst mal die Tasterlogig.

Aber was hast du programmiert ?
Wenn der Taster aus ist machst du die LED AN !!!
Und dann machst du sie nach einer Minute wieder aus.

Da der Taster immer noch nicht gedrückt ist geht das Spiel dann von Vorne los.
Wenn du in dem Tasteraus-Zweig bist wird eine Minute lang der Taster nicht mehr
abgefragt weil du den Prozessor mit delay ja eine Minute zum Nichtstun verdonnerst.

Such mal hier nach "Statemaschine" und nach "blink without delay".

So geht das nicht.
Noch mal -> dein Ardunio tut genau das was du beschreibst - das hast du auch programmiert.

Der einfachste Fehler ist noch das du die LED ausmachst wenn du den Knopf drückst.

Ulli
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Nov 24, 2019, 08:41 pm
Hi

Alles unterhalb 49,7 Tage sollte ohne größere Verrenkungen machbar sein, wenn loop() nicht unnötig aus-gebremst wird.

Was willst Du?
- LED AUS, wenn Pin 9 HIGH
- Startzeit merken, wenn Pin 9 von LOW nach HIGH geht (und nur dann)
- LED AN, wenn Pin 9 LOW oder die Startzeit weniger als 10 Minuten vergangen ist

Du hast momentan, daß die LED HIGH geht, gewartet wird, die LED LOW geht.
Wenn jetzt der Taster noch gedrückt ist, geht die LED DIREKT wieder an - der Dunkel-Blitz ist so kurz, daß Du Das nicht sehen kannst.

Verabschiede Dich von delay().
Schaue Dir die Links an, Die combie dort aufgelistet hat:Klick (https://forum.arduino.cc/index.php?topic=646046.msg4370621#msg4370621)

MfG
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: combie on Nov 24, 2019, 08:47 pm
Quote
Schaue Dir die Links an, Die combie dort aufgelistet hat:Klick
Oder dieses Beispiel. (https://forum.arduino.cc/index.php?topic=542332.msg3716132#msg3716132)
Ist zwar nur ein Relais, keine LED, aber das Prinzip sollte passen.
Implementiert, nach der selben Idee, wie hinter den Links ausgebreitet.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 25, 2019, 11:37 am
Ok vielen Dank. Ich werde mich nachher gleich an die Umsetzung machen.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Rentner on Nov 25, 2019, 01:58 pm
Hallo,
es ist ja schon angesprochen worden , du solltest dich noch mal mit dem Thema beschäftigen wie der Taster anzuschliessen ist. Es gibt da zwei Möglichkeiten. Bei beiden Varianten ist darauf zu achten das der Eingang nicht offen in der Luft rumhängt, sondern immer einen definierten Pegel hat. Da ein normaler Taster halt einen Kontakt hat ist der im nicht gedrückten Zustand ja geöffent.

1. Taster mit einem Bein an +5V , das andere Bein am Eingang. Dann ist ein zusätzlicher Pulldown Widerstand erforderlich,(2-10KOhm) Ein Bein ebenfalls am Eingang das andere an GND. Damit hat der Eingang bei offenem Taster 0V über den Widerstand anliegen und bei geschlossenen Taster +5V. Im Sketch dann pinMode(pin,INPUT) verwenden. siehe link (https://www.arduino.cc/en/Tutorial/Button).


2. Taster mit einem Bein am Eingang , das andere Bein an GND angeschlossen. Damit der Pegel des Einganges bei offenen Taster nicht irgendwo in der Luft hängt ist ein Pullup Widerstand erforderlich. Dazu ist im Controller bereits einer eingebaut den man allerdings noch einschalten muß. Dazu im Sketch pinMode(pin,INPUT_PULLUP) verwenden. Bei dieser Variante ist dann allerdings die Funktion invertiert.Bei geöffnetem Taster ist der Eingang H, und bei gerücktem Taster ist der Eingang L. Damit die Logik dann wieder stimmt verwendet man eine Hilfsvariable und ließt den Eingang dann invertiert ein. siehe Beispiel.

Du verwendest in Deinem Sketch delay() um die Zeitverzögerung zu machen. Das kannst Du grundsätzlich machen. Allerdings solltest Du bedenken das bei einem delay() der Programmablauf eine Pause macht und da gewartet wird bist die Zeit abgelaufen ist. Damit passiert nichts mehr, Du kannst nicht mal erkennen ob inzwischen der Taster wieder offen wurde. Wenn Du dann z.B zwei Taster unabhängig voneinander bearbeiten willst , oder eine LED soll z.B blinken, geht das gar nicht auf diese Art. Man verwendet dazu besser millis().

Du solltst dir das Beispiel"BlinkWithoutDelay" ansehen und verstehen. Wenns mit dem Verstehen nicht gleich so klappen will dann suche nach "Nachtwächter".

So jetzt noch das Beispiel zu Thema Taster einlesen.

Code: [Select]

const byte butonpin=2; // Taster schaltet nach GND
const byte led=13;
bool butonstat; // Hilfsvariable

void setup() {
 
pinMode(butonpin,INPUT_PULLUP); // interner Pullup ein
pinMode(led,OUTPUT);
}

void loop() {

//butonstat=digitalRead(butonpin);  // nicht invertiert
butonstat=!digitalRead(butonpin);   // invertiert
digitalWrite(led,butonstat);
}


Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Serenifly on Nov 25, 2019, 02:23 pm
Code: [Select]

int delaytime = 60000;

Den Wertebereich von int solltest du dir auch mal anschauen
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: michael_x on Nov 25, 2019, 04:24 pm
Code: [Select]
void setup() {
  int delaytime = 60000;
  Serial.begin(9600);
  Serial.println(delaytime);
  Serial.println(60000);
}

Ergebnis:
-5536
60000


Selbst bei den Voreinstellungen Warnungen "Alle" und "Ausführliche Meldungen beim Kompilieren" ist kein Gemecker zu sehen.

Auch wenn man in der ersten Zeile 60000L schreibt, ändert sich nichts.

Witzigerweise ergibt
int delaytime = -60000;
warning: overflow in implicit constant conversion [-Woverflow]

(-30000 geht natürlich)

Arduino IDE 1.8.9 für Uno
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: combie on Nov 25, 2019, 04:47 pm
Warnungen sind nicht im C++ Standard vorgesehen.
Sie sind eine Gnade des Compilers.

Automatische Konvertierungen (implizit cast (https://de.wikipedia.org/wiki/Typumwandlung)) allerdings schon.
Die kann man nachlesen und werden auch korrekt befolgt.
In C++ auch Verlustbehaftete.


Oder mit anderen Worten:
Der Programmierer ist für das verantwortlich, was er da anrichtet.

Der Compiler kann nicht zwischen Absicht und Versehen unterscheiden.
Er korrigiert auch keine Dummheiten.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 25, 2019, 06:10 pm
@posmaster-ino
Ja Ich möchte das bei betätigten schalter (GND oder 5V ) das Licht aus ist.
Wird der Taster nun kurzzeitig nicht betätigt so soll die Led für eine Zeit X Leuchten, egal ob der Taster wieder betätigt ist oder nicht. Danach soll sie ausgehen.

Mit dem Code für das Relais konnte Ich jetzt nicht so viel anfangen zumindest ist mir nichts eingefallen.
Statdessen das, aber ich bekomme immer diese Fehlermeldung und Ich erkenne das Problem nicht!
Code: [Select]
Arduino: 1.8.10 (Windows 7), Board: "Arduino Leonardo"

C:\Users\Home -PC\Desktop\arduino-1.8.10\arduino-builder -dump-prefs -logger=machine -hardware C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware -tools C:\Users\Home -PC\Desktop\arduino-1.8.10\tools-builder -tools C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -built-in-libraries C:\Users\Home -PC\Desktop\arduino-1.8.10\libraries -libraries C:\Users\Home -PC\Documents\Arduino\libraries -fqbn=arduino:avr:leonardo -vid-pid=0X2341_0X8036 -ide-version=10810 -build-path C:\Users\HOME-P~1\AppData\Local\Temp\arduino_build_937820 -warnings=none -build-cache C:\Users\HOME-P~1\AppData\Local\Temp\arduino_cache_365958 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino5.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -verbose C:\Users\HOME-P~1\AppData\Local\Temp\arduino_modified_sketch_240127\sketch_nov25a.ino
C:\Users\Home -PC\Desktop\arduino-1.8.10\arduino-builder -compile -logger=machine -hardware C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware -tools C:\Users\Home -PC\Desktop\arduino-1.8.10\tools-builder -tools C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -built-in-libraries C:\Users\Home -PC\Desktop\arduino-1.8.10\libraries -libraries C:\Users\Home -PC\Documents\Arduino\libraries -fqbn=arduino:avr:leonardo -vid-pid=0X2341_0X8036 -ide-version=10810 -build-path C:\Users\HOME-P~1\AppData\Local\Temp\arduino_build_937820 -warnings=none -build-cache C:\Users\HOME-P~1\AppData\Local\Temp\arduino_cache_365958 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino5.path=C:\Users\Home -PC\Desktop\arduino-1.8.10\hardware\tools\avr -verbose C:\Users\HOME-P~1\AppData\Local\Temp\arduino_modified_sketch_240127\sketch_nov25a.ino
Using board 'leonardo' from platform in folder: C:\Users\Home
Using core 'arduino' from platform in folder: C:\Users\Home
Detecting libraries used...
"C:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10810 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR -DUSB_VID=0x2341 -DUSB_PID=0x8036 "-DUSB_MANUFACTURER=\"Unknown\"" "-DUSB_PRODUCT=\"Arduino Leonardo\"" "-IC:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\arduino\\avr\\variants\\leonardo" "C:\\Users\\HOME-P~1\\AppData\\Local\\Temp\\arduino_build_937820\\sketch\\sketch_nov25a.ino.cpp" -o nul
Generating function prototypes...
"C:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10810 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR -DUSB_VID=0x2341 -DUSB_PID=0x8036 "-DUSB_MANUFACTURER=\"Unknown\"" "-DUSB_PRODUCT=\"Arduino Leonardo\"" "-IC:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\arduino\\avr\\variants\\leonardo" "C:\\Users\\HOME-P~1\\AppData\\Local\\Temp\\arduino_build_937820\\sketch\\sketch_nov25a.ino.cpp" -o "C:\\Users\\HOME-P~1\\AppData\\Local\\Temp\\arduino_build_937820\\preproc\\ctags_target_for_gcc_minus_e.cpp"
"C:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\HOME-P~1\\AppData\\Local\\Temp\\arduino_build_937820\\preproc\\ctags_target_for_gcc_minus_e.cpp"
Sketch wird kompiliert...
"C:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10810 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR -DUSB_VID=0x2341 -DUSB_PID=0x8036 "-DUSB_MANUFACTURER=\"Unknown\"" "-DUSB_PRODUCT=\"Arduino Leonardo\"" "-IC:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Users\\Home -PC\\Desktop\\arduino-1.8.10\\hardware\\arduino\\avr\\variants\\leonardo" "C:\\Users\\HOME-P~1\\AppData\\Local\\Temp\\arduino_build_937820\\sketch\\sketch_nov25a.ino.cpp" -o "C:\\Users\\HOME-P~1\\AppData\\Local\\Temp\\arduino_build_937820\\sketch\\sketch_nov25a.ino.cpp.o"
C:\Users\HOME-P~1\AppData\Local\Temp\arduino_modified_sketch_240127\sketch_nov25a.ino: In function 'void loop()':

sketch_nov25a:16:1: error: expected primary-expression before '}' token

 }

 ^

sketch_nov25a:16:1: error: expected ')' before '}' token

sketch_nov25a:16:1: error: expected primary-expression before '}' token

C:\Users\HOME-P~1\AppData\Local\Temp\arduino_modified_sketch_240127\sketch_nov25a.ino: At global scope:

sketch_nov25a:17:1: error: expected unqualified-id before '{' token

 {

 ^

sketch_nov25a:20:1: error: expected unqualified-id before '{' token

 {

 ^

sketch_nov25a:24:1: error: expected unqualified-id before '{' token

 {

 ^

exit status 1
expected primary-expression before '}' token


Code: [Select]
const byte butonpin=9; // Taster schaltet nach GND
const byte led=10;
bool butonstat; // Hilfsvariable
void setup() {
 
pinMode(butonpin,INPUT_PULLUP); // interner Pullup ein
pinMode(led,OUTPUT);
}

void loop() {

//butonstat=digitalRead(butonpin);  // nicht invertiert
butonstat=!digitalRead(butonpin);   // invertiert
if
(digitalWrite(butonpin,butonstat == HIGH);
}
{
 digitalWrite(led,butonstat LOW);
}
{
if
digitalWrite(butonpin,butonstat == LOW);
}
{
digitalWrite(led,butonstat HIGH);
delay (5000);
digitalWrite(led,butonstat LOW);

}
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Serenifly on Nov 25, 2019, 06:17 pm
Formatier deinen Code vernünftig so dass die Klammern korrekt eingerückt sind. Dann erkennst du auch solche Fehler

Ansonsten fehlt bei "if" die eigentliche Bedingung
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: combie on Nov 25, 2019, 06:19 pm
Bitte C++ Grundlagen lernen und auch anwenden.

Tipp:
Das if Statement ist wirklich gut dokumentiert.

Quote
Mit dem Code für das Relais konnte Ich jetzt nicht so viel anfangen zumindest ist mir nichts eingefallen.
Schade eigentlich....
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 25, 2019, 08:57 pm
Den Klammer Fehler habe ich behoben aber es funktioniert nicht wie erhofft :(
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Rentner on Nov 25, 2019, 09:09 pm
Hallo,

da du in Deinem letzten Post ein paar Zeilen von meinem Beispiel übernommen hast, fühle ich mich noch mal angesprochen Dir auf die Sprünge zu helfen. Ich hab jetzt mal mein Beispiel mit einem delay erweitert. :'(  Ich hatte ja bereits geschrieben das das eigendlich nicht der Weisheit letzter Schluss ist. Dennoch !!

Nun es wird ein Flanke benötigt die erkennt das der Taster von betätigt auf nicht betätigt wechselt. Nur dann soll die LED angehen und die Zeit ablaufen. Bleibt der Taster offen soll die LED nach der Zeit wieder ausgehen.

Wenn Du ein bischen vertrauter mit dem syntax geworden bist solltest Du das delay durch millis ersetzen , ist eine schöne Übung.  ;)

Heinz

Code: [Select]

const byte butonpin = 2;// Taster schaltet nach GND
const byte led = 13; // uno interne LED
bool butonstat;
bool lastbutonstat; //hilfsmerker für Flanke

void setup() {
  pinMode(butonpin, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  butonstat = digitalRead(butonpin);
  //butonstat = !digitalRead(butonpin);// invertiert einlesen

  if (butonstat & !lastbutonstat) { // Flanke erkannt
    lastbutonstat = true; // Flankenmerker setzten
    digitalWrite(led, HIGH);
    delay(5000);
    digitalWrite(led, LOW);
  }
  if (!butonstat) lastbutonstat = false; // Flankenmerker zurück
}


Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: beeblebrox on Nov 25, 2019, 09:20 pm
Mal ein Schnellschuss aus der Hüfte :


Code: [Select]

#define LED_OFF 0
#define LED_ON  1
#define LED_GODOWN 2

const int LED = 10;
const int BUTTON = 9;

unsigned long int ledTime = 0;
char LedState = LED_OFF;


void setup()
{
    pinMode(BUTTON,INPUT_PULLUP);
    pinMode(LED,OUTPUT);
}

void loop()
{

   if (! digitalRead(BUTTON))
   {
      if (LedState != LED_ON)
      {
          digitalWrite(LED,HIGH);
          LedState = LED_ON;
      }
   }
   else // Taste nicht gedrückt
   {
       if (LedState == LED_ON)
       {
           LedState = LED_GODOWN;
           ledTime = millis();
       }
       else
       {
           if ( (LedState == LED_GODOWN) && ((millis() - ledTime) >= 60000) )
           {
               digitalWrite(LED,LOW);
               LedState = LED_OFF;
           }
       }
    }
}



Compiliert mit 0 Fehlern.
Das Prinzip sollte klar werden auch wenn ich eventuell da noch einen Bug drin habe.
Kein Delay. Prozessor wird nicht sinnlos angehalten !

Wenn die eine Minute Wartezeit bis zum Abschalten läuft und der Knopf wieder gedrückt wird ist
die Wartezeit vorbei und die LED bleibt an.
Ach so : Die Taste ist natürlich nicht entprellt. Kann sein das du damit nicht viel Spaß hast !

Ulli

Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Rentner on Nov 25, 2019, 09:55 pm
Hallo,

basierend auf #13 mit millis(), ist eigendlich ganz einfach  :)

Heinz


Code: [Select]

const byte butonpin = 2;// Taster schaltet nach GND
const byte led = 13; // uno interne LED
bool butonstat;
bool lastbutonstat; //hilfsmerker für Flanke
unsigned long altzeit;

void setup() {
  pinMode(butonpin, INPUT_PULLUP);
  pinMode(led, OUTPUT);
 
}

void loop() {
  butonstat = digitalRead(butonpin);
  //butonstat = !digitalRead(butonpin);// invertiert einlesen

  if (butonstat & !lastbutonstat) { // Flanke erkannt
    lastbutonstat = true; // Flankenmerker setzten
    altzeit = millis();   // Zeit starten
    digitalWrite(led, HIGH);
  }
  if (!butonstat) lastbutonstat = false; // Flankenmerker zurück

  if (millis() - altzeit > 5000UL) { // led für 5s ein
    digitalWrite(led, LOW);
  }
 
}




Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Nov 25, 2019, 09:59 pm
@Diter
Drücke in der IDE Mal STRG+T - Das rückt den Code auf Klammer-Ebene ein.
Wenn Du dann mehrere Klammern direkt ganz vorne untereinander hast - oder gaaanz unten steht KEINE Klammer ganz vorne - ist wohl was faul.

Auch sind die ganzen Klammern in und um Deine IFs ... äh ... verwirrend - nicht zwingend für mich, für Dich aber mit Sicherheit!
Auch hat ein ; hinter der IF-Abfrage NICHTS verloren - dort ist die IF nämlich zu Ende - die Klammer drunter hat nur den Zweck, daß der Bereich eben vom Rest abgekapselt ist (eigene lokale Variablen z.B.) - mehr aber nicht.

mfG
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 25, 2019, 10:11 pm
Hallo,

wegen den fehlenden Warnungen. Deshalb sollte man nach dem aktuell möglichen Syntax programmieren.
Bsp.
Code: [Select]

int a {60000};

void setup(void) {
  Serial.begin(250000);
}

void loop(void) {
  Serial.println(a);
}
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: michael_x on Nov 26, 2019, 12:20 pm
Quote
Deshalb sollte man nach dem aktuell möglichen Syntax programmieren.
Danke für den Tip. Ja.

  int delaytime {60000};
warning: narrowing conversion of '60000l' from 'long int' to 'int' inside { } [-Wnarrowing]
Ist übrigens keine 600001 sondern 60000L und zeigt, dass das Aufweiten entsprechend dem Standard super funktioniert. 60000 wird (beim Uno/Nano/Mega) übrigens auf long und nicht auf unsigned int aufgeweitet.

Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 26, 2019, 05:14 pm
Hallo,

wie meinst du das mit "wird aufgeweitet"? Missverständnis? Dein Compiler ändert doch nicht etwa eigenmächtig den Datentyp? Die Warnung lese ich wie folgt. Die 60.000, was eigentlich long ist, wird fälschlicherweise in ein int gepresst was nicht rein paßt. Davor wird man gewarnt. from long to int. Wenn man das testet erhält man auch falsche -5536.
Oder habe ich dich falsch verstanden? Soll ja vorkommen.  ;)
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 26, 2019, 08:21 pm
Vielen lieben Dank für eure Hilfe.
Ich habe es nun so gemacht das die Led 5sek an ist und nach dem abschalten 2 sek nichts passiert.
Nun ist es aber so wenn beim einschalten des arduino der Schalter schon HIGH ist, und die Led den durchgehend leuchtet bis der schalter einmal betätigt ist dann funktioniert alles Tadellos.

Wie kann man das Problem Lösen? habe da keinen Ansatz  :smiley-confuse:

Code: [Select]
const byte butonpin = 9;// Taster schaltet nach GND
const byte led = 10; // uno interne LED
bool butonstat;
bool lastbutonstat; //hilfsmerker für Flanke

void setup() {
  pinMode(butonpin, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  butonstat = digitalRead(butonpin);
  //butonstat = !digitalRead(butonpin);// invertiert einlesen

  if (butonstat & !lastbutonstat) { // Flanke erkannt
    lastbutonstat = HIGH; // Flankenmerker setzten
    digitalWrite(led,LOW );
    delay(5000);
    digitalWrite(led, HIGH);
    delay(2000);
  }
  if (!butonstat) lastbutonstat = false; // Flankenmerker zurück
}
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Nov 26, 2019, 08:23 pm
Hi

-den ... + dann ??

Wenn, dann: Lese buttonstate im setup ein und setze lastbuttonstate auch auf Diesen.
So muß der Button erst gelöst werden, bevor beim erneuten Drücken die Flanke erkannt wird.

MfG
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 26, 2019, 10:02 pm
Hallo,

du musst dir die Zeit merken. Dafür gibts millis. Mit den delays wird das alles unbedienbar, weil blockierend.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141 (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 (http://forum.arduino.cc/index.php?topic=423688.0)

deins umgebaut wie es verstanden habe, ansonsten millis verstehen und abändern
Code: [Select]

const byte pinTaster {9};       // Taster schaltet nach GND
const byte pinLed {10};         // uno interne LED

void setup() {
  pinMode(pinTaster, INPUT_PULLUP);
  pinMode(pinLed, OUTPUT);
}

void loop(void) {
  
  bool state = updateTaster(pinTaster);  

  switchLed (pinLed, state, 5000);
}


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

bool updateTaster (const byte pin)                        
{
  static unsigned long last_ms {0};
  static bool state {HIGH};
  
  unsigned long ms {millis() };
  
  if (ms - last_ms >= 30)
  {
    last_ms = ms;
    state = digitalRead(pin);
  }

  return state;
}


void switchLed (const byte pin, bool stateTaster, const unsigned int zeit)
{
  static unsigned long last_ms {0};  
  unsigned long ms {millis() };
    
  if (!stateTaster)
  {
    last_ms = ms;
    digitalWrite(pin, HIGH);
  }

  if (ms - last_ms >= zeit)
  {
    digitalWrite(pin, LOW);
  }
}
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 27, 2019, 09:15 am
warning: narrowing conversion of '60000l' from 'long int' to 'int' inside { } [-Wnarrowing]
Ist übrigens keine 600001 sondern 60000L und zeigt, dass das Aufweiten entsprechend dem Standard super funktioniert. 60000 wird (beim Uno/Nano/Mega) übrigens auf long und nicht auf unsigned int aufgeweitet.
Ja manche Aussagen beschäftigen mich länger. Ich denke ich weiß jetzt wie es gemeint ist. Die 60.000 werden zuerst als long interpretiert (aufgeweitet  :) ) dann mit dem Variablentyp int verglichen, dabei wird festgestellt passt nicht rein und die Warnung generiert.   :smiley-lol:
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 27, 2019, 05:03 pm
@Doc_Arduino
Erst mal vielen dank für deine Hilfe, bin grade dabei deinen Sketch zu verstehen aber er funktioniert in der Praxis nur wie ein Anschaltverzögerung, Weiter habe ich noh nicht durchgeblickt.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 27, 2019, 10:53 pm
Hallo,

bei dir verhält sich mein Bsp. wie eine Einschaltverzögerung?   :o   Das kann nicht sein, weil es eine Ausschaltverzögerung ist, wie ein Hauslicht. Davon abgesehen. Wie soll es sich denn verhalten?
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 28, 2019, 08:24 pm
Sooo, Ich habe da was hinbekommen aber ist es möglich das der sketch nicht wie eine dauerschleife durch läuft sondern nur einmal?
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 28, 2019, 09:35 pm
Habe eine Lösung aber Ich habe ein Klammer Problem und sehe den Fehler nicht :smiley-confuse:
Code: [Select]
#include <Bounce2.h>
int i = 0;
byte Taster_Heizung = 9;               // Taster an Pin 6 gegen Masse
#define Heizung_Pin 10                 // Schaltpin Heizung ein/aus
#define Heizungeinschaltdauer 4000 // maximale Pumpenlaufzeit
#define INPUTMODE INPUT_PULLUP  // INPUT or INPUT_PULLUP
Bounce debouncer2 = Bounce();        // Instantiate a Bounce object Nr.2 ( Taster Heizung )

void setup()  {
  for (int i = 0; i < 3; i++)
  {
    digitalWrite(Heizung_Pin, LOW);        // Schaltpin Heizung aus
    pinMode(Heizung_Pin, OUTPUT);          // Schaltpin Heizung Ausgang

    // digitalen Eingang mit PullUp aktivieren
    pinMode(Taster_Heizung, INPUT);        // setzt Taster Pin als Eingang
    digitalWrite(Taster_Heizung, HIGH);// und aktiviert dessen PullUp Widerstand
    pinMode(Heizung_Pin, INPUTMODE);

    debouncer2.attach(Taster_Heizung);
    debouncer2.interval(30);             // Entprellzeit 30ms für den Taster

  }   // Ende setup


  void loop(void)
  {
    if (i == 0) {
      i++;
      Heizung_schalten();  // Heizung ein- oder ausschalten mittels Taster
      // Ende loop

    }
    /* ------------------------------------------------------------------------------------------------ */


    void Heizung_schalten () {


    }
    boolean stateChanged_2 = debouncer2.update();
    static boolean state_Heizung = LOW;
    static unsigned long millis_now = 0;
    int state_2 = debouncer2.read();

    // wenn LOW Signal vom Taster erkannt, schalte Heizung ein bzw. mit nächsten HIGH wieder aus
    if ( stateChanged_2 && state_2 == HIGH ) {
      if ( state_Heizung == HIGH ) {
        state_Heizung = LOW;                             // Tasterdruck, Heizung einschalten
        millis_now = millis() + Heizungeinschaltdauer;   // maximale Einschaltdauer setzen
      }
      else {
        state_Heizung = LOW;              // erneuter Tasterdruck, Heizung ausschalten
      }
      digitalWrite(Heizung_Pin, state_Heizung);

    }

    {
         // wenn Heizung läuft, dann nach eingestellter Zeit selbst wieder ausschalten
        if (millis() > millis_now)  {
          digitalWrite(Heizung_Pin, HIGH); // ausschalten nach x sec.
          state_Heizung = HIGH;

        }
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 28, 2019, 09:53 pm
Hallo,

das fehlen des Sketches hätte beinahe diplomatische Verwirrungen gestiftet.  :)

Jetzt muss ich aber ernst werden.
Was macht das globale i? Zudem signed. Für die loop Abfrage nicht sinnvoll.
Du weißt wie schnell die loop durchlaufen wird und damit i inkrementiert?
Das würde deine vorherige Frage erklären.
Lass das i weg.

Habe das Offentsichtliche korrigiert, aber ungetestet.
Edit: noch die überflüssige for in setup entfernt

Code: [Select]

#include <Bounce2.h>

const byte Taster_Heizung = 9;               // Taster an Pin 6 gegen Masse
const byte Heizung_Pin = 10;                 // Schaltpin Heizung ein/aus
const unsigned int Heizungeinschaltdauer = 4000; // maximale Pumpenlaufzeit

Bounce debouncer2 = Bounce();               // Instantiate a Bounce object Nr.2 ( Taster Heizung )

void setup()
{
    digitalWrite(Heizung_Pin, LOW);         // Schaltpin Heizung aus
    pinMode(Heizung_Pin, OUTPUT);           // Schaltpin Heizung Ausgang

    // digitalen Eingang mit PullUp aktivieren
    pinMode(Taster_Heizung, INPUT);         // setzt Taster Pin als Eingang
    digitalWrite(Taster_Heizung, HIGH);     // und aktiviert dessen PullUp Widerstand
    pinMode(Heizung_Pin, INPUT_PULLUP);

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


void loop(void)
{
    Heizung_schalten();  // Heizung ein- oder ausschalten mittels Taster
   
} // Ende loop


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


void Heizung_schalten ()
{
  bool stateChanged_2 = debouncer2.update();
  static bool state_Heizung = LOW;
  static unsigned long millis_now = 0;
  bool state_2 = debouncer2.read();

  // wenn LOW Signal vom Taster erkannt, schalte Heizung ein bzw. mit nächsten HIGH wieder aus
  if ( stateChanged_2 && state_2 == HIGH )
  {
    if ( state_Heizung == HIGH )
    {
      state_Heizung = LOW;                             // Tasterdruck, Heizung einschalten
      millis_now = millis() + Heizungeinschaltdauer;   // maximale Einschaltdauer setzen
    }
    else
    {
      state_Heizung = LOW;              // erneuter Tasterdruck, Heizung ausschalten
    }
    digitalWrite(Heizung_Pin, state_Heizung);
  }

  // wenn Heizung läuft, dann nach eingestellter Zeit selbst wieder ausschalten
  if (millis() > millis_now)
  {
    digitalWrite(Heizung_Pin, HIGH); // ausschalten nach x sec.
    state_Heizung = HIGH;

  }
}
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: beeblebrox on Nov 28, 2019, 09:53 pm
Au man !

In der Loop wird nur einmal "HeizungSchalten" aufgerufen und dann nie wieder.
Weil du ja nur bei i==0 da rein gehst und dann nie wieder.

In der Funktione Heizungschalten machst du sofort nach { wieder }
das das der Compiler nicht mag ist kein Wunder.

Ulli
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 29, 2019, 05:54 pm
@Doc_Arduino Also den überholten Sketch habe Ich getestet leider passiert dort beim betätigen des Schalters gar nichts.

@beeblebrox
Ok bin mir aber nun nicht sicher muss das i==0 nun nach unten in den sketck wenn man es so macht?
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 29, 2019, 06:11 pm
Hallo,

ich habe deinen Sketch auch nur soweit korrigiert das er fehlerfrei kompliert. Das bedeutet nicht das er danach funktioniert. Denn ich weiß bis heute nicht was du vor hast. Mein Bsp. der Ausschaltverzögerung hatte leider nicht geholfen.

Wegen dem i. Was soll das denn bewirken? Du erhöhst i von 0 auf 1 und fragst auf Gleichheit 0 ab. Das heißt alles danach wird nie wieder abgearbeitet.

Selbst wenn du auf größer 0 abfragst bringt das nichts.
Dann inkrementierst du in Atmeberaubender Geschwindigkeit i. i ist signed.
https://www.arduino.cc/reference/de/language/variables/data-types/int/ (https://www.arduino.cc/reference/de/language/variables/data-types/int/)
Das heißt wenn i größer 32767 springt es ans negative Ende des Wertebereiches. Nennt sich Überlauf.
Wegen der Abfrage > 0 wird ab dem Zeitpunkt auch nichts nachfolgendes mehr ausgeführt.
Aus meiner Sicht ist i überflüssig wenn du keine Erklärung dafür hast.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 29, 2019, 06:29 pm
Dein Sketch ist so nicht falsch, nur weiß Ich nicht wie ich es am besten ändere so das wenn der Taster nicht mehr gedrückt ist das Relais anschaltet und nach einer gewissen zeit wieder aus. Habe es schon mit millis probiert aber irgendwas mache ich Falsch. Bei mir ist es so wenn der Taster nicht gedrückt ist dann ist das Relais immer aktive.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 29, 2019, 07:17 pm
Hallo,

dann musst du nur die Logik entsprechend abändern.
Wie schaltet dein Taster?
Wie schaltet dein Relais?
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 29, 2019, 07:30 pm
Gedacht war das der Taster (Pin 9) im nicht betätigten zustand 60sec.
den Pin 10 ansteuert (Pin 10 Steuert das Relais) nach abfaul der Zeit soll der Pin wieder auf LOW geätzt werden und erst beim nächsten Neustart des Arduino wieder Starten ,wenn der Taster nicht betätigt ist.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Nov 29, 2019, 07:36 pm
Hi

Diese Aussage ist noch nicht Eindeutig.
Gilt dieses 10 Sekunden leuchten NUR beim Einschalten?
Also:
Start
Ist Pin NICHT gedrückt, dann 10 Sekunden leuchten
danach ganz normal den Sketch abarbeiten ...

Spielt danach der Button noch eine Rolle?
Oder anders: WAS willst Du wirklich? Was soll's werden, wenn's groß ist?

Erkläre mir den Ablauf so, wie Du Diesen Deiner Oma erklären würdest.
Wenn Sie Deinen Ausführungen folgen kann, sollten wir hier damit auch keine Probleme haben.
Rubber_duck_debugging (https://en.wikipedia.org/wiki/Rubber_duck_debugging)
(gibt's auch in Deutsch, dort dann links unten auf DEUTSCH klicken)

MfG
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Tommy56 on Nov 29, 2019, 07:36 pm
@Diter: Evtl. solltest Du die Fragen, die Dir gestellt werden auch verstehend lesen. Ebenso das, was Du schreibst vor dem Absenden. Das verbessert die Kommunikation.

Wann Deine Zeit abfault und wann Deine Pins auf LOW geätzt werden war jedenfalls nicht gefragt.

Gruß Tommy
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 29, 2019, 07:53 pm
Also Ich hoffe es ist so für alle verständlich.

Der Arduino ist eingeschaltet, und wenn nun der Taster betätigt ist dann soll nichts passieren.
Wird der Taster aber nun losgelassen dann soll das Relais (Pin 10) für 60sec eingeschaltet werden.
Wenn nun diese 60sec abgelaufen sind soll es wieder abschalten, und erst wenn der Arduino neu gestartet wird wieder Funktionieren.

Pin9 (der Taster) ist ein Schwimmer der bei zu geringen Wasserstand die Pumpe über Pin10 (das Relais) einschalten soll.  Ich hoffe Ich habe es jetzt verständlich erklärt, es war nicht meine Absicht euch zu verwirren oder so, Tut mir leid.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Tommy56 on Nov 29, 2019, 07:57 pm
Wenn Du endlich mal die Fragen von Doc_Arduino aus #33 beantworten würdest, könntest Du schon viel weiter sein.

Gruß Tommy
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: beeblebrox on Nov 29, 2019, 07:57 pm
Aber warum soll der Arduino denn immer wieder (und von wem) abgeschaltet werden ?

Ulli
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 29, 2019, 08:14 pm
Hallo,

ich versuche das einmal zu übersetzen.

Also wird das eine Pumpensteuerung, die immer wenn der Schwimmer schaltet für 60s pumpen soll?
Füllstand unterschritten --> 60s pumpen?
Alles andere mit Arduino ein- und ausschalten macht keinen Sinn in meinen Augen.

Die anderen Fragen wiederhole ich.
Wie schaltet der Schwimmer?
Wie schaltet die Pumpe? Ich nehme an High aktiv laut obiger Aussage? Widerspricht aber der Aussage das mein Bsp. Sketch nicht wie gewünscht funktioniert.

Tipp. Überlege und formuliere vollständig in Ruhe die nächsten Antworten.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 29, 2019, 08:59 pm
Der Schwimmer ist, so lange genug Wasser da ist, geschlossen und es besteht eine Verbindung zwischen Pin 9 und GND, ist die Verbindung unterbrochen bei zu geringem Wasserstand soll Pin 10 für z.b. 60sec angesteuert werden und nach Ablauf der Zeit wieder ausgehen.

Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 29, 2019, 09:17 pm
Hallo,

genau damit hättest du gleich rausrücken können. Jetzt klingt das logischer und der Arduino selbst muss nicht ausgeschalten werden, denn er soll ja den Schwimmer überwachen und die Pumpe steuern.
Ich denke mal nach.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Nov 29, 2019, 09:50 pm
Hi

Da ich gerade im Nachbar-Thread geschrieben habe, daß es hier eher selten fertige Sketche als Belohnung für's Aussitzen gibt, bleibt der 39-Zeiler (incl. 10 Leerzeilen oder Kommentare), Der die Funktionalität zeigen sollte, erst Mal bei mir.

Fangen wir langsam an - wie würde der Sketch aussehen, wenn der Schwimmer die Pumpe direkt (ganz ohne Nachlaufzeit) steuern sollte?

MfG

*Edit*
39-Zeiler (statt 35) - Hinweis auf diesen Thread im Sketch hinzugefügt
Tip(p): digitalWrite(Pumpe,digitalRead(Schwimmer)); könnte fast schon klappen
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Tommy56 on Nov 29, 2019, 10:37 pm
Tip(p): digitalWrite(Pumpe,digitalRead(Schwimmer)); könnte fast schon klappen
Da hast Du aber keine Hysterese drin.
Tip = Trinkgeld
Tipp = Hinweis

Du solltest Dich entscheiden.

Gruß Tommy
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 29, 2019, 11:34 pm
Hallo,

wie kann man mit einem Schwimmer eine Hysterese einarbeiten?

Noch eine Frage.
Der Schwimmer schaltet ja irgendwann wieder um während des pumpens.
Ab wann sollen die 60s zählen?
Sofort oder erst wenn der Schwimmer sagt voll?
Wären dann entweder sturr 60s oder 60s nachpumpen wenn voll.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 30, 2019, 12:10 am
Also der Schwimmer kann nur an oder aus quasi ein taster oder schalter und wenn der betätigt wird soll halt für eine gewisse zeit bsp 60sec die pumpe laufen.

Da es noch ein versuchs aufbau ist sollte halt auch nur einmal durchlaufen, dan halt wieder beim neu Start.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 12:44 am
Hallo,

gut, dann auf die ganz einfache Art und Weise.
Wenn der Arduinopin vom Schwimmer "LOW" sieht passiert nichts.
Wenn er "HIGH" sieht dann laufen einmalig xx Sekunden bis zum Reset.

Code: [Select]

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

const byte pinSchwimmer = 9;      // zu GND verbunden wenn geschlossen, unterbrochen wenn ausgelöst
const byte pinPumpe = 10;
bool safety = false;
unsigned long einschaltzeitPumpe;

void setup()
{
  pinMode(pinSchwimmer, INPUT_PULLUP);
  pinMode(pinPumpe, OUTPUT);

  if (digitalRead(pinSchwimmer) )    
  {
    einschaltzeitPumpe = millis();  
    digitalWrite(pinPumpe, HIGH);
  }
  else
  {
    safety = true;
  }
}

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


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

void schaltePumpe (const unsigned long zeit)
{
  if (millis() - einschaltzeitPumpe >= zeit)
  {
    digitalWrite(pinPumpe, LOW);
    safety = true;
  }
}
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 30, 2019, 01:28 am
Hi, Ja vom Prinzip so ähnlich wie zu Anfang gemacht, aber leider ohne Funktion.
Wenn Ich den Pin 9 an GND lege und den Arduino Starte ist das Relais für die Pumpe schon permanent betätigt und schaltet auch nicht ab :/
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Nov 30, 2019, 01:35 am
Hi

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

MfG
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 30, 2019, 09:08 am
Das habe Ich schon getestet dann ist der effect umgedreht immer aus.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 10:38 am
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.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Nov 30, 2019, 10:51 am
Hi
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 :)

MfG
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 11:54 am
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.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 30, 2019, 01:40 pm
Quote
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
(http://[URL=https://www.bilder-upload.eu/bild-bf5aa4-1575117119.jpg.html][IMG]https://www.bilder-upload.eu/thumb/bf5aa4-1575117119.jpg)[/URL][/img]

Hier einmal der Versuchsaufbau Pin 9 Liegt gegen GND, Arduino wurde eingeschaltet Pin9 hat 0V und das Relais ist betätigt!
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 30, 2019, 01:53 pm
(https://www.bilder-upload.eu/bild-eb7f00-1575117720.jpg.html)

Hier jetzt hoffentlich das Bild.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 02:06 pm
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.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 02:17 pm
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?
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 30, 2019, 02:54 pm
(https://www.bilder-upload.eu/bild-eb7f00-1575117720.jpg.html)

Hier hoffentlich das Bild.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 30, 2019, 02:59 pm
Noch ein versuch :smiley-confuse:

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.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 03:35 pm
(https://forum.arduino.cc/index.php?action=dlattach;topic=649965.0;attach=335394)
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 03:42 pm
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?
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Nov 30, 2019, 03:58 pm
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.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 04:22 pm
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 (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 (http://forum.arduino.cc/index.php?topic=423688.0)
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Nov 30, 2019, 05:37 pm
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;                    
  }
}
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Nov 30, 2019, 07:29 pm
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
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Dec 28, 2019, 06:27 pm
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;
  }   
}
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Rentner on Dec 28, 2019, 07:04 pm
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
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Dec 28, 2019, 07:31 pm
 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.
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Doc_Arduino on Dec 28, 2019, 07:46 pm
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)  {


Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: postmaster-ino on Dec 28, 2019, 09:08 pm
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
Title: Re: Led bei Tasten druck an und nach Verzögerung aus.
Post by: Diter on Dec 28, 2019, 09:40 pm
@postmaster-ino
Ja genau das meinte.
Entprellen Fliegt raus, OK.