Hallo,
Ich möchte, wenn die Bedingung für eine if-Abfrage erfüllt ist, den aktuellen Zeitpunkt ausgeben lassen, und zwar einmalig, also keine weitere Aktualisierung. Kann mir einer da helfen?
Hallo,
Ich möchte, wenn die Bedingung für eine if-Abfrage erfüllt ist, den aktuellen Zeitpunkt ausgeben lassen, und zwar einmalig, also keine weitere Aktualisierung. Kann mir einer da helfen?
nutzi:
Hallo,Ich möchte, wenn die Bedingung für eine if-Abfrage erfüllt ist, den aktuellen Zeitpunkt ausgeben lassen, und zwar einmalig, also keine weitere Aktualisierung. Kann mir einer da helfen?
Bitte nicht so wie in dem Nachbarthread zum Display.
Setze eine Variable auf false.
In Deinem if-Statement prüfst Du UND-Verknüpft ob die Varaiable false ist und setzt sie bei Ausführung des Codes auf true. Dann ist die Bedingung im if-Statement in Zukunft nicht mehr erfüllt.
Setze eine Variable auf false.
In Deinem if-Statement prüfst Du UND-Verknüpft ob die Varaiable false ist und setzt sie bei Ausführung des Codes auf true. Dann ist die Bedingung im if-Statement in Zukunft nicht mehr erfüllt.
Der erste Satz heißt natürlich "Setze eine Variable auf false, wenn deine Bedingung nicht erfüllt ist". Das ganze wird auch gern Flankenerkennung genannt.
michael_x:
Der erste Satz heißt natürlich "Setze eine Variable auf false, wenn deine Bedingung nicht erfüllt ist".
Dann sollte der Satz besser heissen:
Für die einmalige Ausführung des if-Statement benutze zusätzliche eine boolsche Variable, die UND-Verknüpft mit dem (und deren Inhalt geändert wird im ausführbaren Teil des) if-statement.
Theoretisch ginge ja auch:
boolean Zeit_noch_nicht_ausgegeben=true;
if (zeit==Parameter && Zeit_noch_nicht_ausgegeben)
{boolean Zeit_noch_nicht_ausgegeben = false.}
(absichtlich keine Codetags)
#include <Streaming.h>
void einSchuss(const bool bedingung, Print &ziel, const char *meldung)
{
static bool scharf {true};
if(not scharf) goto ende;
if(not bedingung) goto ende;
ziel << meldung << endl;
scharf = false;
ende:;
}
void setup()
{
Serial.begin(9600);
Serial << "Start: "<< __FILE__ << endl;
}
void loop()
{
einSchuss(millis()>10000,Serial,"Hier könnte deine Zeit stehen: 14Uhr30");
}
@Combie, Du interpretierst "einmalig" als "einmalig nach Reset des Arduino".
Vielleicht meint @nutzi "einmalig nach Eintreten der Bedingung (und wieder, wenn die Bedingung erneut wahr wird)"
Vielleicht ist auch wirklich "einmalig" gemeint. Das wird dann schwierig, auch was "den aktuellen Zeitpunkt" und "ausgeben" angeht.
nutzi:
Kann mir einer da helfen?
Das ist die eigentliche Frage.
@Combie, Du interpretierst "einmalig" als "einmalig nach Reset des Arduino".
Natürlich: Das ist das einzige "einmalig" was mir so einfällt.
Alle anderen "einmalig" sind doch eher mehrmalig.
Man könnte den erfolgten "einmal Schuss" auch im EEPROM hinterlegen, dann rührt da auch kein Reset mehr dran.
... dann können wir Das auch lassen ... zur aller größten Not behaupten wir, daß Das halt schon war ...
Informationen ... und das Fehlen von Ihnen
nutzi:
den aktuellen Zeitpunkt ausgeben lassen, und zwar einmalig, also keine weitere Aktualisierung
combie:
Alle anderen "einmalig" sind doch eher mehrmalig.
Immer wieder ein Problem in der Beschreibung:
erstmalig != einmalig
Ich würde einmalig (nach Start) in setup() als Letztes unterbringen.
Erstmalig erinnert mich an das Autorennspiel und das erste durchfahren im Rundenzähler.
Hallo,
wie Du eventuell bereits mitbekommen hast, ist Deine Frage nicht ganz eindeutig. Dennoch eine eindeutge Antwort , die Dir aber vermutlich aber nicht weiter hilft. Was meinst Du mit "aktuellen Zeitpunkt ausgeben lassen" ? millis() ?
Sorge einfach dafür das Deine If Abfrage einmal dann erfüllt ist wird wenn Du es möchtest. Dazu kann man in der if Abfrage beliebige Bedingungen logisch verknüpfen. Wenn Du das nicht willst kannst Du auch zwei if Abfragen hintereinander machen.
z.B
if (bedinung1==1 && bedingung2==1){
Serial.print(millis());
}
if (bedingung1==1){
if (bedingung2==1){
Serial.print(millis());
}
}
Heinz
if (noch_nicht_gemacht==true){
//mache was;
noch_nicht_gemacht=false;
}
... oder anders herum ... dann täte ich Das aber 'schon_gemacht' nennen
Streiten wir uns nicht.
Bis zu einer erklährenden Beitrag von nutzi hat es keinen Sinn hier weiter zu diskutieren.
Grüße Uwe
Ich meine das so:
Eine if-Bedingung wird zum Beispiel 4200 ms nach Programmstart erfüllt. Dann soll ausgegeben werden: 4200.
Wird die Bedingung nach 7000 ms erneut erfüllt, sollen die 4200 überschrieben werden mit 7000.
Ja, das ist doch ein einfacher Zustandsautomat.
Was hindert dich?
nutzi:
Ich meine das so:Eine if-Bedingung wird zum Beispiel 4200 ms nach Programmstart erfüllt.
[...]
Wird die Bedingung nach 7000 ms erneut erfüllt,
Das sind zwei.
Also nicht EINMALIG!
Beschreib doch mal richtig, was Du vor hast. Das stochern im Nebel macht es nicht leichter Dir zu folgen.
my_xy_projekt:
Das sind zwei.
Also nicht EINMALIG!Beschreib doch mal richtig, was Du vor hast. Das stochern im Nebel macht es nicht leichter Dir zu folgen.
Einmalig insofern, dass die Zeit nicht mitlaufen soll, sondern ab da der Zeitpunkt angezeigt wird.
combie:
Ja, das ist doch ein einfacher Zustandsautomat.Was hindert dich?
Was ist ein Zustandsautomat? Das hindert mich.
Erster Treffer bei DuckDuckGo - Wikipedia, Endlicher Automat.
Denke, Du wirst wohl eher eine bekanntere Suchmaschine benutzen - benutze Sie!
MfG
nutzi:
Einmalig insofern, dass die Zeit nicht mitlaufen soll
Das geht nicht.
Die Zeit läuft immer mit.
Zu jedem Durchlauf der Bedingung hat sich die Zeit geändert.
Dabei kann die Basis sein (keine abschliessende Aufzählung): eine Funktion wie millis(), irgendwas aus RTC, manchmal auch NTP, oder ggfls auch GPS, und wer will auch aus GSM.
Du hast noch nicht beschrieben, was Du vorhast.
Dein if wäre - nach meinem bisherigen Kenntnisstand - eine Bedingung, die "immer mal wieder eintritt" und Du möchtest eine Zeit ausgeben.
Das wäre dann zum Beispiel:
Beginne mit x=0
Hier beginne dich im Kreis zu drehen
Addiere zu x 1 dazu
Wenn x eine Primzahl, sage mir die aktuelle Zeit
Hier schliesst sich der Kreis - beginne von vorn
Und jetzt die Fragen:
Was willst DU als Zeit ausgegeben haben?
Welche Bedingung(en) MÜSSEN erfüllt sein.
Ich würd gerne helfen, aber das ist momentan recht schwer, da ich nicht weiss, was das Ziel ist.
my_xy_projekt:
Ich würd gerne helfen, aber das ist momentan recht schwer, da ich nicht weiss, was das Ziel ist.
Ich habs nochmal gelesen...
Kann es sein, das Du eine [Zeit] auf einem Display ausgibst und die Ausgabe nur dann geändert werden soll, wenn die Bedingung eingetreten ist?
Also:
erste Primzahl gefunden - Ausgabe: 4000 (ms)
Hi
Eigentlich ist's doch ganz einfach
if (bedingung==true){ //ist die Bedingung erfüllt?
if(ausgegeben==false){ //wenn 'ausgegeben' false ist (noch nicht ausgegeben), dann?
ausgabe(); //Ausgeben
ausgegeben=true; //und Das auch merken
}
}else{
ausgegeben=false; //wenn die Bedingung NICHT erfüllt ist, wird die Ausgabe wieder 'scharf' geschaltet
}
Was ist an dieser Logik so schwer?
MfG