Aktion im Loop einmalig ausführen

Guten Morgen,

Ich habe da mal eine Frage und zwar möchte Ich das eine Action nur einmalig durchgeführt wird.
Hintergrund ist dieser, Ich habe einen Motor, wenn dieser läuft, überwacht der Arduino die Temperatur.

Vom Aufbau her ist es so das der Arduino über einen NTC in der GND Leitung eingeschalten wird wenn das Kühlwasser seine 30-35° Grad erreicht hat und dann mit einem Sensor mist.

Nun soll beim abschalten ein Relais eine Lüfter für eine definierte Zeit Laufen lassen dies soll aber nur ein mal passieren wehrend der Arduino läuft.

Kann Ich das so lösen?

int Taster = 2; // EB input
int e = 0;
int e_previous = LOW; // Ändern Sie den Anfangswert nach Belieben
int g = 0;

void setup() {

  pinMode(Taster, INPUT);

}

void loop() {

  e = digitalRead(Taster);

  if (e == LOW)
  {
    if (e_previous != Hige) { //sein Teil wird einmal ausgeführt
      digitalWrite(Taster, HIGH);
      e_previous = LOW; // Dies verhindert, dass dieses Innere erneut ausgeführt wird
    }
  }
}

Hier der Sketch für den Lüfter.

#include <Bounce2.h>

byte Taster_Fan = 9;               // Taster an Pin 9 gegen Masse
#define Fan_Pin 10                 // Schaltpin Fan ein/aus
#define Faneinschaltdauer 40000    // maximale Lüfterlaufzeit
Bounce debouncer2 = Bounce();        // Instantiate a Bounce object Nr.2 ( Taster Fan )
void setup()  {
 
  digitalWrite(Fan_Pin, LOW);        // Schaltpin Fan aus
  pinMode(Fan_Pin, OUTPUT);          // Schaltpin Fan Ausgang
     
  // digitalen Eingang mit PullUp aktivieren 
  pinMode(Taster_Fan, INPUT);        // setzt Taster Pin als Eingang
  digitalWrite(Taster_Fan, HIGH);    // und aktiviert dessen PullUp Widerstand

  debouncer2.attach(Taster_Fan);
  
 
}   // Ende setup


void loop(void) {

   Fan_schalten();  // Fan einschalten mittels Taster
     
}   // Ende loop


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


void Fan_schalten ()
{
  boolean stateChanged_2 = debouncer2.update();
  static boolean state_Fan = LOW;
  static unsigned long millis_now = 0;
  int state_2 = debouncer2.read();
 
  // wenn LOW Signal vom Taster erkannt, schalte Fan ein bzw. mit nächsten LOW wieder aus
  if ( stateChanged_2 && state_2 == HIGH ) {
    if ( state_Fan == HIGH ) {
      state_Fan = LOW;                             // Tasterdruck, Fan einschalten
      millis_now = millis() + Faneinschaltdauer;   // maximale Einschaltdauer setzen
      }
      else {
      digitalWrite(Fan_Pin, state_Fan);
     
  }
 
  // wenn Lüfter läuft, dann nach eingestellter Zeit selbst wieder ausschalten
  if (millis() > millis_now)  {
       digitalWrite(Fan_Pin, HIGH);      // ausschalten nach x sec.
       state_Fan = HIGH;

  }   
  }
}

LG

Hallo,

eigendlich kannst Du fast alles machen.

ich glaube aber du hast da was zusammen kopiert was nicht wirklich Sinn macht. Warum soll das nur einmalig ablaufen ? willst Du für den nächsten Vorgang des "Arduino" den neu starten ? Soll der Lüfter mit einem Taster eingeschaltet werden ? Warum steht das so nicht in Deiner Bechreibung ?

zu dem ersten Sketch :

was soll da passieren ?

Du deffinierst eine Variable int e_previous = LOW , soll das nun ein integer sein oder ein bool ?

vermute es soll eine Flankenauswertung werden

zum 2. Teil

der stammt hier aus einem paralell Post von gestern , so richtig optimal wird der auch nicht sein fü dein Vorhaben.

ich mach dir einen Vorschlag. Arbeite ein paar Beispiele aus der IDE durch. schau dir millis() blinkWithoutDelay und den Nachtwächter an . Versuche deine Aufgabe vernünftig zu beschreiben , in einer Art Prorgramablauf. Je genauer das wird um so besser. Letztlich kannst Du dann jede Textzeile in Code umsetzen. Als strukturiertes Hilfsmittel kannst Du auch noch mit einer Programmstruktur arbeiten die als Ablaufsteuerung, Schrittkette, State Mashine angelegt ist.

Heinz

Driv3r:
Ich habe da mal eine Frage und zwar möchte Ich das eine Action nur einmalig durchgeführt wird.

void loop() {
  static bool once {0};
  if (!once++) Serial.println("Eimalig");
}

Gruß Fips

@Rentner
Also der Ablauf ist so das der Motor Startet und irgendwann die 30°Grad erreicht sind. Dann schaltet der NTC und der Arduino Startet. Solange der Motor läuft ist ein Relais Aktive welche Pin 9 ( Taster) von GND trennt,
schaltet man den Motor nun ab, schaltet auch das Relais gegen masse ,der Lüfter soll dann über den Arduino eingeschaltet werden. Da das Kühlwasser ja irgendwann die 30°Grad unterschreitet schaltet auch der Arduino dann ab und beim nächsten start geht es dann wieder von vorne los.

Ja Ich habe mich an dem Sketch bedient weil es mir ganz hilfreich erschien und fast zu dem Paste was mir vorschwebt :smiley:

Was gibts gegen den guten alten 2 Punktregler einzuwenden?

Dann schaltet der NTC

NTC schalten nicht.

schaltet auch das Relais gegen masse

Sehe kein Relais.

In der #4 Beschreibung fehlt die "definierte Zeit", welche im Eingangsposting noch wichtig war..
Das hast du dir jetzt anders überlegt?

Quote
Dann schaltet der NTC
NTC schalten nicht.

Nicht so kleinlich bitte ... man weis was gemeint ist.

schaltet auch das Relais gegen masse
Sehe kein Relais.

Ich versteh dicht nicht !...

Ich bin für alles offen, Zweipunktschaltung ist nichts ein zu wenden.

Hallo,

bist du Driv3r gleich Diter?
Oder haste das nur von dem kopiert?

Wie komme ich darauf?
Weil damit solcher Mist wie

millis_now = millis() + Faneinschaltdauer;   // maximale Einschaltdauer setzen
...
...
// wenn Lüfter läuft, dann nach eingestellter Zeit selbst wieder ausschalten
if (millis() > millis_now)
{
 ...
}

verschleppt wird. Funktioniert bei einem Werteüberlauf nicht sauber.

2 Punktregelung kann man auch Hysterese nennen, wenn du damit mehr anfangen kannst. Du prüfst ob dein Temperaturwert über oder unter einem Schwellwert liegt und startest dann entsprechende Aktionen. Liegt er dazwischen machst du nichts.

Driv3r:
man weis was gemeint ist.

Is klar, nur weil du weißt, was du meinst, soll ich auch wissen, was du meinst.

Driv3r:
Nicht so kleinlich bitte

Och...
Dummerweise halte ich Schaltungsentwicklung und die Programmiererei für eine pingelige Angelegenheit.
Ist ist ok, wenn du das nicht so kleinlich abhandeln möchtest.

Driv3r:
Ich versteh dicht nicht !...

OK, ich sehe schon, mir scheint, wir kommen so nicht zusammen.

Driv3r:
@Rentner
Also der Ablauf ist so das der Motor Startet und irgendwann die 30°Grad erreicht sind. Dann schaltet der NTC und der Arduino Startet. Solange der Motor läuft ist ein Relais Aktive welche Pin 9 ( Taster) von GND trennt,
schaltet man den Motor nun ab, schaltet auch das Relais gegen masse ,der Lüfter soll dann über den Arduino eingeschaltet werden. Da das Kühlwasser ja irgendwann die 30°Grad unterschreitet schaltet auch der Arduino dann ab und beim nächsten start geht es dann wieder von vorne los.

Ja Ich habe mich an dem Sketch bedient weil es mir ganz hilfreich erschien und fast zu dem Paste was mir vorschwebt :smiley:

Entweder ist die Anwendung eine Super-Sicherheits-Anwendung wo bestimmte Aktionen durch andere Hardwaremäßig gesperrt sein müssen oder die Funktion des Projekts einfach zu verkompliziert.

Mir erschließen sich keine Gründe um den Arduino erst in einem bestimmten Punkt einzuschalten bzw den Taster erst bei einer gewissen Bedingung scharf zu stellen. Was soll der Taster denn bewirken? Wer steurt den Motor? Wieso soll das alles nur einmal passieren? Soll das alles auch im Sommer bei 35°C im Schatten funktionieren? Wie bekommt der Arduino mit, daß der Motor abgeschaltet wurde? Wie ist die Spannungsversorgung des Arduino realisiert?

Zu Deinem ersten Sketch:
Was ist "hige"?

"digitalWrite(Taster, HIGH);" schaltet den internen Pullupwiderstand ein. Was soll das bewirken?

Ich erwarte schon Antworten auf die Fragen wenn es Dir ernst ist Antworten zu bekommen.
Grüße Uwe

Doc_Arduino:
Hallo,

bist du Driv3r gleich Diter?

@Driv3r gleich Diter
Es ist sehr unsympatisch mit 2 Usernamen im Forum present zu sein.

Das tue ich zwar auch, aber nur weil dieser meiner User Global-Moderator Status hat, den ich für die Moderation brauche, der andere Moderatorstatus nur im deutschen Forumsteil hat und den die Verantwortlichen auf Anfrage nicht auf normalen User zurückstufen könnten. Ich wollte als Fragenbeantworter nicht als Moderator erscheinen, sondern als normaler User. Wie gesagt geht das leider nicht. Auch wirst Du mich mit diesem User nur als Moderator auftreten sehen, nicht als Fragenbeantworter.

In Deinem Fall ist dieser Doppeluser aber unsympatisch.
Grüße Uwe

Also um nun alle Missverständnisse weg zu räumen.

@Doc: Ja hatte Ich schon geschrieben das Ich mir das aus dem Thema kopiert hatte, Als Ich hier auf dem Bord etwas rumgesucht hatte dachte Ich das Ich es eventuell etwas umbauen könnte um es für mich nutzen zu können.

@ uwefed
Der Motor arbeitet nicht in einem PKW sondern für eine Hydraulikanlage und hat seine eigne Motorsteuerung.

Der Arduino ist an einen 12v auf 5v Konverter angeschlossen.

Warum 30° , weil ich keinen anderen NTC zur Hand hatte und und wollte ja das der Arduino auch nach abschalten des Motors noch Läuft um den Lüfter für die Kühlung ein zu schalten.

Wie er mit bekommt das der Motor nicht läuft:
Ich dacht das Ich es über ein Relais mache welches wenn der Motor Läuft mit 12v bestromt wird und in dem zustand geöffnet ist, Schaltet man den Motor an schliest das Relais und der Taster pin ,Wie auch immer man ihn nennen will, ist dann gegen Masse geschalten. Daraufhin soll dann der Lüfter geschalten werden der dann eine Zeit x Läuft und dann nach abschaltet und erst beim nächsten mal erst wieder arbeitet.

Wie lange usw er Laufen soll muss ich noch rum Probieren.

Ich hoffe das Ich nun alle Ungereimtheiten aus dem weg schaffen konnte

Lg

Hallo,

die Rückfrage wegen dem digitalWrite kann ich beantworten. Kann die Verwirrung darüber verstehen, weil wir das schon sehr lange nicht mehr so schreiben. Jedenfalls gehört das vorherige pinmode und digitalwrite zusammen.

// alte Schreibweise
pinMode(Taster_Fan, INPUT);        // setzt Taster Pin als Eingang
digitalWrite(Taster_Fan, HIGH);    // und aktiviert dessen PullUp Widerstand

oder

// aktuelle Schreibweise
pinMode(Taster_Fan, INPUT_PULLUP);        // setzt Taster Pin als Eingang und aktiviert den Pullupwiderstand

@ Driv3r:
überlege dir einmal eine Funktion wie so eine Hysterese Programmtechnisch aussehen könnte

Driv3r:
@Rentner
Also der Ablauf ist so das der Motor Startet und irgendwann die 30°Grad erreicht sind. Dann schaltet der NTC und der Arduino Startet. Solange der Motor läuft ist ein Relais Aktive welche Pin 9 ( Taster) von GND trennt,
schaltet man den Motor nun ab, schaltet auch das Relais gegen masse ,der Lüfter soll dann über den Arduino eingeschaltet werden. Da das Kühlwasser ja irgendwann die 30°Grad unterschreitet schaltet auch der Arduino dann ab und beim nächsten start geht es dann wieder von vorne los.

Ja Ich habe mich an dem Sketch bedient weil es mir ganz hilfreich erschien und fast zu dem Paste was mir vorschwebt :smiley:

Bitte sei mir nicht böse , verstanden hab ich das immer noch nicht. :neutral_face:

Mal langsam zum mitdenken.

Also der Motor hat seine eigene Steuerung, hast Du noch später geschrieben. Er wird über ein Reials angesteuert an das Du Dich über einen freien Kontakt mit mit pin 9 verbindest, was macht der Taster da noch und wie ?. Die 30 Grad werden durch den Motor von unten / oben ? angefahren.

Der NTC schaltet bei 30 Grad irgendwie die Versorgungsspannung des "Arduino" ein, der startet. Über den Pin9 kann er nun feststellen das der Motor ein ist. Nun soll er über Pin 10 einen Lüfter eingeschaltet ? Ist das ebenfalls der obige Motor oder ganz was anderes. Irgendwie wird das Kühlwasser jetzt aber dadurch kälter, vermutlich durch den Lüfter ? und wenn dann die 30Grad unterschritten werden wird dem Arduino wieder der Strom geklaut.(ganz schlecht) Am Anfang hattest Du noch eine deffinierte Zeit drin, wann soll die jetzt laufen und was soll sie machen ? Ist das eine Mindestlaufzeit, geht ja wohl nicht wenn dem Arduino vorher der Strom geklaut wird.

Sorry das ist so das was ich mit Deiner Beschreibung verstanden habe, und glaube mir ich hab mir Mühe gegeben.

Vermutlich heist deine technische Lösung "Zeitrelais mit aus Ausschaltverzögerung", es kann aber auch ein Hystereseschalter sein. Ich weiß es nicht, weil ich nicht verstanden habe was Du uns sagen willst. Eigendlich glaube ich noch das Du selbst auch noch nicht verstanden hast was Du eigendlich willst, jedenfalls nicht mit der erforderlichen Systmatik. Vermutlich geht es aber nicht nur mir so. So werden wir dir vermutlich leider nicht helfen können.

Du schreibst später noch es ist eine Hydraulik Steuerung. Ich rate jetzt mal Der Motor ist eine Hyraulik Pumpe, die hat einen Kühler(Wärmetauscher) zum Kühlen des Hydrauliköls, daran ist ein Lüfter der bei einer bestimten Temperatur eingeschaltet werden soll. Wenn der Lüfter das Öl nun abgekühlt hat kann er wieder abgeschaltet werden. Damit das beim Schaltpunkt nicht ständig ein und ausschaltet soll eine Mindestlaufzeit verwendet werden um damit einen Hyterese zu erreichen. Aber das ist wirklich nur geraten.

Heinz

Vielen dank für eure Mühe Ich versuche es echt euch so zu erklären das es verständlich ist, Für mich ist es das. Vom Prinzip ist es richtig was du schreibst aber Ich habe das Gefühl es wird zu kompliziert gedacht.

Es ist eig. ganz simpel von der Technik her.
Ja man kann es sicherlich auch irgendwie mit einem Zeit Relais machen.

Ich versuche es noch mal aber bitte nicht so viel darüber nach denk was wehre wenn es sommer währe oder so, Bitte nehmt es mir nicht Böse aber ich denke diese Faktoren kann man hinter noch berücksichtigen.

Der NTC schaltet bei 30 Grad irgendwie die Versorgungsspannung des "Arduino" ein, der startet.

Der NTC Schaltet bei ca. 30° durch, gegen Masse.

Er wird über ein Reials angesteuert an das Du Dich über einen freien Kontakt mit mit pin 9 verbindest, was macht der Taster da noch und wie ?

Über ein ganz normales 12v Relais welches bei Laufenden Motor Pin9 vom Arduino gegen Masse Schaltet solange dies der Fall ist soll der Arduino nichts machen. Ich habe es nur Taster genant eig. ist damit das 12v Relais gemient.

Nun soll er über Pin 10 einen Lüfter eingeschaltet ?

Wenn Ich den Motor nun abschalte hat er über 90° Wassertemperatur, Jetzt ist das 12v Relais Strom los und schaltet Pin9 die Masse weg was nun das Zeichen für den Arduino ist Pin 10 anzusteuern welcher ein Relais Schaltet. Das Relais soll dann den Lüfter zur Kühlung Schalten. Weil wenn der Motor aus ist und die Mechanische Wasserpumpe nicht mehr läuft steigt die Temperatur noch mal ein ganzes Stück an.
Um dem nun entgegen zu wirken soll der Lüfter nun eine gewisse zeit laufen um ihn auf 50° oder so runter zu kühlen. Wenn der Motor dann seine 30° erreicht Schaltet auch der Aruino ab.

Bitte nehmt es mir nicht Böse aber ich denke diese Faktoren kann man hinter noch berücksichtigen.

Das nennt man Salamitaktik.

Den Programmierer zwingt es dazu, das ganze Konzept wieder über den Haufen zu werfen, genau dann, wenn er meint fertig zu sein, und sich erschöpft zurücklehnt. Das ist dann das Maximum an Frustration, was man aus so einer mini Ablaufsteuerung raus holen kann.

Ok,
wenn ich mal annehme daß der NTC kein NTC sondern ein Thermostat ist der einen Wechslerkontakt hat;
wenn der Kontakt des Thermostaten sich als Taster verkleidet
wenn mal nicht Hochsommer ist
wenn Die 12 V nur da sind um das Relais anzusteuern der mit dem Motor Ein und Ausschaltet.
wenn eine zweite 12V Stromversorgung da ist um auch bei ausgeschaltenem Motor die Teile zu versorgen
wenn es wirklich eine Nachkühlung braucht denn im normalen Betrieb scheint der Motor keine extra Kühlregelung zu brauchen
wenn
Dann haben Deine Fragen Sinn.

Wir fragen so genau weil der Fragesteller sich oft in eine Lösung verrannt hat und durch genaue Kenntnis des Projekts und der Begleitumstände andere, bessere Lösungen ergeben.

Ich sage Dir aber auch wenn Du so darauf beharrst, daß wir nicht alles wissen müssen / sollen /dürfen bzw wir bestimmte sachdiehnliche Fragen nicht stellen düren, mir die Lust meine Freizeit für Antworten Deinem Projekt betreffend zu opfern abhanden gekommen ist.

Grüße Uwe

Rentner:
Du schreibst später noch es ist eine Hydraulik Steuerung. Ich rate jetzt mal Der Motor ist eine Hyraulik Pumpe, die hat einen Kühler(Wärmetauscher) zum Kühlen des Hydrauliköls, daran ist ein Lüfter der bei einer bestimten Temperatur eingeschaltet werden soll. Wenn der Lüfter das Öl nun abgekühlt hat kann er wieder abgeschaltet werden. Damit das beim Schaltpunkt nicht ständig ein und ausschaltet soll eine Mindestlaufzeit verwendet werden um damit einen Hyterese zu erreichen. Aber das ist wirklich nur geraten.

Heinz

Soweit ich verstanden habe soll der Arduino erst nach dem Ausschalten des Motors aktiv werden.
Also sobald die Wärmezufuhr in das Sytem beendet ist.
Uwe

Ich sage Dir aber auch wenn Du so darauf beharrst, daß wir nicht alles wissen müssen / sollen /dürfen bzw wir bestimmte sachdiehnliche Fragen nicht stellen düren, mir die Lust meine Freizeit für Antworten Deinem Projekt betreffend zu opfern abhanden gekommen ist.

Ich sage nicht das ihr nicht alles wissen dürft aber es gibt ja nicht mehr wie das was Ich versuche hier zu erklären und Ich hätte nicht gedacht das es solche Komplikationen geben würde, das Tut mir wirklich leid Ich möchte schon das wir alle Spaß daran haben und nicht das Solche Konflikte entstehen.

Ich bin halt kein Programmierer woher auch dann würde Ich ja nicht Fragen. Das was Ich weis habe Ich mir so nach und nach beigebracht.

Was ich kann ist 12v - 24v Pkw bzw LKW Elektrik, reparieren Diagnosen Stellen und instand setzen.
Aber wenn es ums Programmieren geht habe Ich wenn überhaut MINImalste Kenntnisse und bin auf Hilfe angewiesen.

Würdest Du als KFZ-LKW Elektriker mit den Infos, die hier stehen etwas sinnvolles machen?

Grüße Uwe

Hallo,

Also noch mal ganz einfach, eine Lösung für Minimalisten. Wenn der Eingang an Pin9 auf Low wechselt soll der Ausgang an Pin10 eingeschaltet werden. Gleichzeitig wird eine Zeit gestartet, wenn die abgelaufen ist wird der Ausgang wieder abgeschaltet. Das war´s eigendlich. Der Arduino wird in deinem Fall mit dem Termostat bei >30 Grad eingeschaltet, das hat aber eigendlich nichts mit der Aufgabenstellung zu tun, dient nur dazu das bei <30Grad alles ausgeschaltet ist. Der Ausgang muss mit positiver Logik arbeiten, da ja wenn der Arduino stromlos ist ( Temp <30) auch Lüfter aus sein soll.

Man könnte es einfach so sagen : Eine Impulszeit am Ausgang Pin10 gestartet mit der negativen Flanke am Eingang Pin9.

Flanke auf Low erkennen ( Motor war ein und schaltet aus)
wenn Flanke erkannt
startzeit auf millis() setzen
Pin 10 einschalten

wenn millis() - startzeit > laufzeit ist (Zeitangabe in ms)
Pin 10 abschalten

das sollte ja eigendlich reichen, jedenfalls erst mal so wie ich das jetzt verstanden habe. Jetzt kannst Du ja mal versuchen das zeilenweise in Code umzusetzen. Ansonsten nimm ein Zeitrelais.

Heinz