Verständnisfrage zu Countdown mit millis

Hallöchen

Ich möchte gerne einen genauen Countdown, der von einer im Sketch definierten Zeit runter zählt.
Ich hatte mich zwar zuerst gefreut, als ich die Bibliothek CountUpDownTimer.h gefunden hatte, jedoch läuft die nicht synchron zu millis, sondern langsamer und unregelmäßig, also muss ich doch selbst Hand anlegen.

Es soll die Zeit runter gezählt werden, solange die Temperatur in einem bestimmten Bereich liegt. Ich werde also millis zählen lassen, solange ich innerhalb der Hysterese bin. Bei Erreichen einer Sekunde diese von der eingestellten Zeit dekrementieren und bei Erreichen von "0" die Heizfunktion beenden.
Parallel dazu soll die gesamte Laufzeit (auch mit millis) ebenfalls angezeigt werden, das funktioniert bereits.

Ist diese Überlegung richtig oder verrenne ich mich da in was und es geht anders besser bzw. einfacher?

LG
Friedrich

Verstehe dein Problem nicht.....

Weiß aber nicht, ob es an deinen Worten liegt, oder meinem begrenzten Auffassungsvermögen.

Aber was ich weiß:
Je klarer die Worte, desto leichter lassen sie sich in ein Programm fassen.

(deleted)

Probieren wir es so:

int zeit 1h 10m 20s = 4220s

temp1 = 20°C
temp2 = 40°C

if ((sensor > temp1) && (sensor < temp2))
millis zählen
1000 millis = 1s
zeit = zeit - 1s
zeige zeit am LCD
sobald zeit == 0
aus

ist es so klarer oder noch verwirrender?

LG
Friedrich

Du zeigst einen (Irr?)Weg...
Aber nicht das, was du erreichen willst.

buffalo64:
iist es so klarer oder noch verwirrender?

Hallo Friedrich,
warum zeigt Du nicht einfach deinen Sketch. Dann kann man was dazu sagen.

buffalo64:
ist es so klarer oder noch verwirrender?

kommt drauf an.
Da Du noch was vergessen hast, verwirrt es.

Sketch kompiliert - ungetestet unkommentiert, da Du schon länger bei bist und eigentlich wissen solltest, wie man Fragen stellt.

int zeit  = 4220;
int sektick = 1000;
int temp1 = 20;
int temp2 = 40;
int sensor;
const int outputPin = 13;
unsigned long lastmillis;

void setup()
{
  // put your setup code here, to run once:
  digitalWrite (outputPin, LOW);
  pinMode (outputPin, OUTPUT);
}

void loop()
{
  if ((sensor > temp1) && (sensor < temp2)&& !digitalRead(outputPin))
  {
    digitalWrite (outputPin, HIGH);
    lastmillis = millis();
  }
  if (digitalRead(outputPin))
  {
    if (millis() - lastmillis >= sektick)
    {
      zeit--;
      // hier LCD aufrufen
      sektick = sektick + 1000;
    }
    if (zeit <= 0)
    {
      digitalWrite (outputPin, LOW);
      sektick = 1000;
      zeit = 4220;
    }
  }
}

Hallo,

du musst nicht extra eine Zähler bauen. Nutze millis dafür ganz normal. Bilde die Zeitdifferenz wie immer und vergleiche sie mit deinem Intervall. Wenn die Zeit vorbei ist wird irgendwas gemacht. Also alles wie bisher. Wenn du während der Wartezeit einen Sekunden-Countdown sehen möchtest, dann nimmst du wieder diese Zeitdifferenz die du eh schon vergleichst, teilst diese durch 1000 und hast deinen Sekundenzähler mit der Restwartezeit.

Moin's,

Doc_Arduino:
du musst nicht extra eine Zähler bauen. Nutze millis dafür ganz normal. Bilde die Zeitdifferenz wie immer und vergleiche sie mit deinem Intervall. Wenn die Zeit vorbei ist wird irgendwas gemacht. Also alles wie bisher.

Das sehe ich auch so - siehe meinen Sketch oben.

Wenn du während der Wartezeit einen Sekunden-Countdown sehen möchtest, dann nimmst du wieder diese Zeitdifferenz die du eh schon vergleichst, teilst diese durch 1000 und hast deinen Sekundenzähler mit der Restwartezeit.

Dazu braucht es aber eben auch einen Ausgangswert, ab dem abwärts gezählt wird.

Natürlich könnte "zeit" auch als lokale Variable initialisiert werden und ggfls. ein %1000 den Sekundentick auslösen, aber ich sehe damit nicht die Bedingung des TO auf Genauigkeit erfüllt und den entscheidenen Unterschied zu meiner Variante.

Kannst Du mir den Unterschied zu meinem Kurzvorschlag - und wo ich den ändern sollte - erläutern?

(deleted)

Danke,
@combie, dachte, ich hätte es beschrieben. Es ist manchmal schwer, etwas zu beschreiben, dass es wer anderer versteht, wenn es im eigenen Kopf klar ist.
@MicroBahner, es gibt von meiner Seite aus noch keinen Sketch, darum die Frage, ob ich mit meiner Überlegung richtig bin, damit ich nicht ins Leere laufe.
@my_xy_projekt, das verstehe ich jetzt nicht, was du damit meinst, wie man Fragen stellt. Aber jedenfalls danke für dein Beispiel, ich sehe es mir durch, wie ich es anpassen kann. Nur zur Klarstellung: ich wollte keinen Code abstauben, sondern eine Bestätigung oder Korrektur für meine Grundüberlegung.
@Peter-CAD-HST, sorry (siehe Antwort an combie), wenn die Bedingung nicht erfüllt ist, soll der Countdown einfach stehen bleiben und weiterlaufen, sobald die Temperatur wieder im Bereich ist.

LG
Friedrich

buffalo64:
, das verstehe ich jetzt nicht, was du damit meinst, wie man Fragen stellt.

Naja - eine kurze Beschreibung, was Du ausmachen willst wäre hilfreich gewesen. Viellciht wäre das EIN Ereignis auch ne Hilfe.
Ich hab mich mal auf mein Bauchgefühl verlassen und den PIN der OnboardLED des UNO genommen - den kannst erstmal nehmen um zu testen, was der Code macht - wobei das eigentlich selbsterklärend ist.
Später den PIN nur am Anfang ändern und schon kannst nen Relais damit steuern etc....

ich wollte keinen Code abstauben, sondern eine Bestätigung oder Korrektur für meine Grundüberlegung.

Pff. Selbst wenn, wäre es mir egal - ich muss ja nich.
Aber mit dem Schnipsel lässt sich das besser erklären, als hätte ich geschrieben:

Du musst einen Status setzen und solange der gesetzt ist runterzählen, wenn Du in der Zeit unabhängig von der Eingangsbedingung den Ausgang betätigen möchtest.
Und wenn Du fertig runtergezählt hast den Ausgang betätigen, damit den Status zurücksetzen und Variablen wieder in Ausgangszustand bringen.
Bitte achte darauf nicht millis()-lastmillis>=1000 zu verwenden, da Laufzeit bedingte Abweichungen sich summieren.

Ich denke jetzt ist auch klar, was der Sketch macht.
:wink:

Also ich habe bisher immer noch nicht verstanden, für was das ganze gut sein soll.

(deleted)

Peter-CAD-HST:
ich tippe auf ein Niedergargerät mit eigener Temperaturregelung aber ohne Zeitsteuerung.
Wer hat noch einen Tipp? :slight_smile:

Bei NT sind 20-40 zu wenig.
Ich hätte eher auf irgendwas mit Belüftung getippt.
Für ne Hanfplantage fehlt mir aber die Beleuchtungssteuerung. Deren Laufzeiten sind länger.

Na mal sehen, was bei rauskommt...

@my_xy_projekt, sorry, dachte nicht, dass das EIN Ereignis nicht so wichtig ist. Wichtig ist für mich ja nur, dass der Countdown läuft, sobald die Temperatur passt. Zu Testzwecken nehme ich statt der Temperatur einen Taster, der Countdown soll beim drücken zählen, wenn er offen ist, stehen bleiben. Das reicht mir mal zum simulieren. In meinem Sketch wird das Programm per Taster gestartet, die Temperatur wird bis zu einer bestimmten Temperatur vorgeheizt und danach beginnt die eigentliche Heizperiode, die zeitlich erfasst werden soll. Mit der ganzen Fehlerauswertung, verschiedenen LCD Anzeigen etc. bin ich jetzt mal auf 541 Zeilen. Hatte befürchtet, dass es dadurch unübersichtlich wird und die eigentliche Frage untergeht.
@ElEspanol, ich möchte, wenn die Temperatur (aus einer Heizfunktion erfasst) in einem bestimmten Bereich ist (Bsp. zwischen 20 und 40°C) einen Countdown laufen lassen, ist die Temperatur außerhalb, soll der Countdown stehen bleiben und weiterlaufen, sobald die Temperatur wieder innerhalb ist. Bei Ablauf des Countdowns soll die Heizfunktion nicht mehr ausgeführt werden, im Prinzip ist der Sketch dann beendet und ist in einer Endlosschleife, wobei er ENDE anzeigt.

Nix Hanf oder sonstiges, es soll ein Wärmebehandlungsgerät für Bienen werden (Stichwort Varroamilbe). Ich bin mir meiner Verantwortung den Bienen gegenüber bewusst, werde sicher nix am lebenden Bien ausprobieren, dass nicht vorher ausgiebigst und unter Realbedingungen (Leerwaben) getestet ist und weiß, dass diese Behandlungsart umstritten ist. Ich will von der Chemie weg.

Hallo,

ich habe folgendes verstanden. Solange die Temperatur in einem gültigen Bereich liegt, soll noch ein Counter runtergezählt werden. Die Temperatur muss für eine bestimmte Zeit in einem gültigen Bereich liegen damit irgendwas abgeschalten wird.
Zudem habe ich verstanden das die Wartezeit nicht gleich der Anzeigezeit ist. Meinetwegen möchte er 10s die Temperatur auf Stabilität überwachen. Aber davon nur die restlichen 5s als Counter angezeigt bekommen.

Mein Gedanke war, da man sowieso ständig

millis - lastmillis > interval

abfragt, verwendet man die Differenz millis - lastmillis für alles weitere mit. Damit bleibt alles syncron zu millis und man hat keine zusätzliche Abweichung.

diff = millis - lastmillis;
if (diff >= interval)
{
  ...
}

diff weiterverwenden

Wenn dann diff irgendwann eine weiteres Limit unterschritten hat, z.Bsp. angenommene 5s, dann startet der Anzeige Countdown mit diff/1000.

@ my_xy_projekt:
Deinen Code vermag ich jetzt noch nicht beurteilen. Ist nicht böse gemeint. Der wird sicherlich funktionieren. Obs wirklich im Detail so ist wie vom TO gewünscht, dazu müßte der TO nochmal was schreiben. Dann kann man Bsp. Code posten oder den Code vom TO erstmal sichten und abändern wenn möglich.

@ TO:
Bienen. Da wird sich combie aber freuen. Das 'bie' steht für Bienen.
Du möchtest die gesamte Wartezeit als Countdown sehen?

buffalo64:
Nix Hanf oder sonstiges, es soll ein Wärmebehandlungsgerät für Bienen werden (Stichwort Varroamilbe).

Ah, jetzt ist der Groschen bei mir gefallen. Das Thema hatten wir schon öfter.

Das nennt sich unter anderem “Bienensauna”. Unter dem Begriff findet man hier im Forum auch einiges.

Gruß, Jürgen

@Doc_Arduino, nein, ich zeige zwei Zeiten an, einmal die Gesamtlauf seit Start der Behandlung, und einmal den Countdown, der nur die wirksame Zeit (innerhalb des Temperaturbereiches) anzeigt. Im Prinzip könnte es auch eine Art Stoppuhr sein, aber dann muss ich umrechnen, wie lange es noch dauert. Ein Countdown ist leichter lesbar (im Betrieb dann).
@Katsumi_S, den genannten Begriff habe ich vermieden, da es ein fertiges Produkt mit dieser Bezeichnung gibt und ich keinen Rechtsstreit anzetteln will.

Ich bin nicht sehr gut im Programmieren (habt ihr sicher schon mitbekommen ;)), ich arbeite eine Funktion nach der anderen ab, suche, ob es bereits Codeschnipsel gibt, die ich verwenden kann etc., momentan bin ich eben dabei, den Countdown zu realisieren. Eins ergibt das andere.

Erstmal...
Du darfst im privaten alles nachbauen, was du willst.
Erst wenn du damit auf den Markt gehst, greifen Marken und Patentrecht.

Auch solche Sätze sind unproblematisch:

Ich möchte ein Teil bauen, welches sich wie
die bekannte Bienensauna einsetzen lässt

Der Vorteil ist ganz klar, alle wissen was gemeint ist, und wir haben keine 18 Postings mit wildem rumgeeiere.

z.B. wie Doc_Arduino schon anmerkte, hängt mein Herz schon ein wenig an den Bienen.
Aber hier hat mich das rumeiern abgestoßen.

Jetzt zum Programm:

momentan bin ich eben dabei, den Countdown zu realisieren.
Du brauchst keinen Countdown.
millis() liefert dir schon einen Upcounter, der reicht hier völlig aus.

Einzig die Anzeige, die soll sowas zeigen...
Aber das ist eine rein darstellende Maßnahme.

Was du aber benötigst, das ist min. ein endlicher Automat.
Sowas wie ein "Fenster Komparator" mit Hysterese in Software nachgebildet.