Hilfe bei einer Zweitpunktregelung mit nur 5 facher Ausführung, 1 Wire & Relais

Hallo nochmal, kann mir jemand helfen.
Ich finde trotz gesendeten Post meinen Topic nicht im Forum.
Woran kann das ligen?
Lg

Dann hast du den evtl. gelöscht und nicht gepostet.

rainerkol:
Ich finde trotz gesendeten Post meinen Topic nicht im Forum.

Da Du erst einen Post abgesetzt hast, kannst evtl. versuchen in Deinem Profil unter "shosw Drafts" einen temporär abgespeicherten entwurf zu finden.

Hallo nochmal, liebe Arduino Gemeinde.
Ich habe glaub meinen Post nicht richtig abgesendet und deswegen nochmal :confused:.

Also ich habe Probleme bei der Umsetzung einer Anforderung. Meine Ideen und Kenntnisse mit Millis, delay do while, brachten keinen tollen Erfolg.

Vielleicht hat jemand von euch eine saubere Lösung dazu ohne viele Delays, da ich Blynk benutze.

Ich beschreibe mal auf das Wesentliche.
Arduino Pro Micro, 1x Relais, 1x Heizfolie, 1x 1wire Tempsensor.

Was genau brauche ich als Routine:

Start :
Schalte das Relais bis eine Temperatur von 45 Grad erreicht ist.

Das Relais geht aus und bleibt aus bis die Temperatur auf 40 Grad abgefallen ist.

Dann schaltet das Relais wieder bis 45 Grad erreicht sind.

Das ganze soll sich 5x wiederholen.

Nach der 5 ten Wiederholung soll das Relais ausbleiben bis die Temperatur auf 25 abgefallen ist.

Danach alles wieder von neuen...

Ich habe so eine Vorstellung mit if else und integrierter for I Schleife, bekomme es aber nicht sauber gelöst.

Für Vorschläge und Ideen bin ich offen und freue mich jetzt schon auf eure Unterstützung.

Lg
Rainer

Bitte vorab:
Nicht soviele Leerzeilen schreiben. danke.

rainerkol:
Start :
Schalte das Relais bis eine Temperatur von 45 Grad erreicht ist.
Das Relais geht aus und bleibt aus bis die Temperatur auf 40 Grad abgefallen ist.
Dann schaltet das Relais wieder bis 45 Grad erreicht sind.
Das ganze soll sich 5x wiederholen.
Nach der 5 ten Wiederholung soll das Relais ausbleiben bis die Temperatur auf 25 abgefallen ist.
Danach alles wieder von neuen…
Ich habe so eine Vorstellung mit if else und integrierter for I Schleife, bekomme es aber nicht sauber gelöst.
Für Vorschläge und Ideen bin ich offen und freue mich jetzt schon auf eure Unterstützung.

Na dann mal herzlich willkommen.
Das ist kein Hexenwerk - machen hier viele jeden Tag :wink:
Zähler auf 0
Start
Zähler < 5
ja:
wenn oberer Grenzwert nicht erreicht mache an
prüfe regelmässsig ob oberer Grenzwert erreicht
wenn ja
mache aus
prüfe regelmässig, ob unter Grenzwert erreicht
(und ausgemacht wurde)
wenn ja:
Zähler hochsetzen
von vorn beginnen.
nein:
las auskühlen

Und jetzt die Frage:
Neustart automatisch oder auskühlen lassen und die Bienen nur manuell erneut schwitzen lassen?

Hallo, ein liebes Danke für die erste Antwort. Ja so stelle ich mir das vor. Mit Neustart dann. Ein kleines Script auf dem ich aufsetzen könnte wäre sehr hilfreich und SUPER.
LIEBE Grüsse.

rainerkol:
Ein kleines Script auf dem ich aufsetzen könnte wäre sehr hilfreich und SUPER.
LIEBE Grüsse.

Bienensauna?
Wenn ja, dann ist das Dein Stichwort für die Suche. Da gab es einen Thraed, der schon länger her ist - aktuell war die letzten tage auch was dazu.

Wenn nicht, dann musst mit Grundsätzlichem anfangen. Da Du bedingt millis brauchst, lese die Nachtwächtererklärung

und blinkwithoutdelay unter Datei Beispiele digital

Dann hast Du Deine Zeitbasis.
Für Deinen Zähler brauchst Du eine Schleife. geht mit "for", würde ich aber drauf verzichten, weil Du in der Zeit nichts anderes machen kannst.
Besser manuell über Bedingungen (if / else)

Sag mal ob ich richtig lag.

Hallo, ja der Bienengedanke lässt aufkommen. Ist aber nicht ganz richtig. Ist eher ne kleine heizungsteuerung zum definierten heizen, aushärtennund entspannen. Ich habe es der Einfachheit auf das wesentliche runtergebrochen.
Das mit Millis und und for I schleifen oder Abfolge mit delay hab ich schon so durch, alles nicht so elegant und sehr holprig.

Ich würde mich mich über ein paar Zeilen code freuen, wo eine elegante Lösung entsteht ohne Tot-Zeit wie durch delay oder for I ensteht.
Magst du mir eine Basis Script aufstellen. Feinheiten und test kann ich ja dann übernehmen und Feedback geben. Liebe Grüsse.

.... Wobei ich denke millis gar nicht mehr zu nutzen, da ja der schaltgeber immer der Temperaturwert ist.
Grüsse

rainerkol:
Das mit Millis und und for I schleifen oder Abfolge mit delay hab ich schon so durch, alles nicht so elegant und sehr holprig.

Es wird besser, wenn öfter gemacht.

Ich würde mich mich über ein paar Zeilen code freuen, wo eine elegante Lösung entsteht ohne Tot-Zeit wie durch delay oder for I ensteht.
Magst du mir eine Basis Script aufstellen.

Also so hat das auch noch keiner gemacht.
Auftragsarbeiten kannst Du im internationalen Thread aufgeben.

Hier aus meiner Sammlung einen Rumpf.
Da ist schon alles drin, den brauchst nur noch mit Leben ausfüllen.
Nicht fragen wie!

// Forumsketch - Rumpf schrittkette

enum {warten, heizen, kuehlen};

const byte einpin = 2;
const byte led = LED_BUILTIN;

int mache = warten;

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start...."));
  pinMode(einpin, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

int machewarm(const int schritt)
{
  /*
      Mache Relais an, wenn Temperatur unter 40
      mache Relais aus über 45
      wenn 5x durchgelaufen
      schritt++
  */
  return schritt;
}
int machekalt(const int schritt)
{
  /*
     wenn temp <25
     schritt++
  */
  return schritt;
}

void schrittkette()
{
  switch (mache)
  {
    case warten:
      {
        // wartet auf das Tastendruck zum Start
        if (!digitalRead(einpin))
        {
          mache = heizen;
        }
        heartbeat(1000);
        break;
      }
    case heizen:
      {
        mache = machewarm(mache);
        heartbeat(500);
        break;
      }
    case kuehlen:
      {
        mache = machekalt(mache);
        heartbeat(250);
        break;
      }
    default:
      { 
        heartbeat(0);
        break;
      }
  }
}
void loop()
{
  schrittkette();
  if (mache > kuehlen) mache = warten; // Du willst ja wieder von vorn anfangen.
}

void heartbeat(const unsigned long intervall)
{
  static unsigned long lastmillis = millis();
  if (millis() - lastmillis > intervall)
  {
    digitalWrite(led, !digitalRead(led));
    lastmillis = millis();
  }
}

[edit]
Und dann pass mal im ersten Post die Betreffzele an - da versteht niemand, was Du willst

Hallo,
wie gesagt ich bin Neuänfänger und wollte niemand auf die Füße treten.
Das scheine ich nun getan zu haben.
Aus der ersten Anwort leitete ich ab, das mein Vorhanden einfach und mehrfach genutzt wird.
"Das ist kein Hexenwerk - machen hier viele jeden Tag"
Deswegen auch die naheliende Frage nach einem Beispielscript zum aufbauen und verstehen.
Nur eine Frage, aber das daraus eine Auftragsarbeit werden soll finde ich weit hergezogen und
verunsichert mich doch. Das war nicht in meinem Sinne. Sorry.

Ich bedanke mich trotzdem für die Versuche mir zu helfen, schade finde ich , dass ich jetzt einen Rumpf habe mit dem ich anfagen kann zu arbeiten, aber nichts mehr fragen darf. Das ist sehr schade.
Wie soll ich als Anfänger was dazulernen, wenn ich manche Sachen nicht kombieren kann, die Einzelbeispiele aber funktionieren. Fragen soll ich ja nicht mehr. Ich bin deswegen schon bischen traurig.

Aber Danke trotzdem..... Einen Versuch war es Wert, erste Erfahrungen in einem Forum zu machen.
Ich hätte auch mein Script hochladen können zum gemeinsam verbessern, aber so muss ich wohl weiter alleine
Versuche machen.

Liebe Grüße Rainer

Deswegen auch die naheliende Frage nach einem Beispielscript

Ist für dich sicher naheliegend, aber meist gilt bei solchen Fragen: Suchen und prüfen ist erheblich mühsamer als "mal eben machen".

Hier beliebt ist: Zeig deinen Versuch, beschreibe genau was daran nicht so geht wie gedacht und versuche, die Antworten zu verstehen und Nachfragen ernst zu nehmen.

Die Chance ist groß, dass du so doch ein fertiges xy-Projekt bekommst

Hallo, ja so denke ich mir das,
wie Poste ich meinen Code, sodas er im Feld hier formatiert ist ?
Gruss Rainer

rainerkol:
Ich bedanke mich trotzdem für die Versuche mir zu helfen, schade finde ich , dass ich jetzt einen Rumpf habe mit dem ich anfagen kann zu arbeiten, aber nichts mehr fragen darf.

Habe ich das geschrieben?

nur noch mit Leben ausfüllen.
Nicht fragen wie!

Das hat auch seinen Grund, denn wenn Du in den Code schaust, stehts da schon drin.
Ein klein wenig miusst Du schon selbst dazu tun, sonst hätte ich den Sketch auch komplett schreiben können.
Ich kenne Deinen Kenntnisstand nicht - alle anderen hier vermutlich auch nicht.

Dir hilft es nicht, wenn Dir was Fertiges vorgesetzt wird und Du das nicht verstehst.
Wenn Du etwas nicht verstehst, stell Fragen. Die zu beantworten ist Sinn der Vorlage.
Sonst hätte ich mir den Rumpf sparen können und 30 Zeilen Kommentarcode schreiben können.

rainerkol:
wie Poste ich meinen Code, sodas er im Feld hier formatiert ist ?

In der IDE einfach auf BEARBEITEN - Für Forum kopieren.
Und hier mit der rechten Maustaste einfügen.
Bitte vor dem Kopieren mit STRG-T den Code formatieren.

Du benutzt das Symbol </> in der Editorleiste.
Grüße Uwe

    if(Modus == 1){
      digitalWrite(Relais, HIGH);
  
    
    if(T2 > 65){                  // MaximalTemperatur 65
       digitalWrite(Relais, LOW);
       Modus = 2;   }
       }

      else if(Modus == 2){        // Temperaturbereich wo Relais LOW bleibt 65 -45
      if(T2 < 65 and T2 > 45){
      digitalWrite(Relais, LOW);
      }
 
      if(T2 < 45){                // Temperaturbereich bis wohin Temperatur ganz abfallen kann
      Modus = 1;
      }
 
      if(T2 > 70){                // Übertemperatur 70
      Modus = 3;   }
      }

      else if(Modus == 3){
      digitalWrite(Relais, LOW);   
      Modus = 2;
      }

Also ich habe es jetzt mit mehreren Modi gemacht, das funktioniert auch gut.
Schaltet definiert an und aus an den Schwellen.
Der Auszug anbei.
T2 ist der Tempsensor,Relais = Relais.
Die Temperaturschwellen habe ich mal höher gesetzt zum probieren.

Wo ich nun die Probleme habe und nichts so wirklich funktioniert ist:
Das Teilscript hier im Post soll 5 mal durchlaufen werden und dannach was anderes gemacht werden.

Ich habe diesen Script bis jetzt vesucht mit Counter, for I oder do while “einzupacken”
Das bekomme ich nicht hin.

DIe Frage die jetzt offen bleibt, ist, wie lasse ich diesen Block 5 mal laufen und dannach kommt was anderes.
Liebe Grüsse Rainer

rainerkol:
DIe Frage die jetzt offen bleibt, ist, wie lasse ich diesen Block 5 mal laufen und dannach kommt was anderes.

Wenn Du mir nen Moment lässt, bau ich das noch in den Ansatz von mir.

Ansonsten so mein Vorschlag:

static int zaehler = 0;
while (zaehler < 5)
{
  if (Modus == 1)
  {
    digitalWrite (Relais, HIGH);
    if (T2 > 65)                  // MaximalTemperatur 65
    {
      digitalWrite (Relais, LOW);
      Modus = 2;
    }
  }
  else
    if (Modus == 2)        // Temperaturbereich wo Relais LOW bleibt 65 -45
    {
      if (T2 < 65 and T2 > 45)
      {
        digitalWrite (Relais, LOW);
      }
      if (T2 < 45)                // Temperaturbereich bis wohin Temperatur ganz abfallen kann
      {
        Modus = 1;
      }
      if (T2 > 70)                // Übertemperatur 70
      {
        Modus = 3;
      }
    }
    else
      if (Modus == 3)
      {
        digitalWrite (Relais, LOW);
        Modus = 2;
      }
  zaehler++;
}
static int zaehler = 0;
Serial.println(zaehler);
while (zaehler < 5)
{

    if(Modus == 1){
      digitalWrite(Relais, HIGH); // Relais an bis maximalTemperatur 65
  
    
    if(T2 > 65){                  // MaximalTemperatur 65, Relais aus
       digitalWrite(Relais, LOW);
       Modus = 2;   }
       }

      else if(Modus == 2){        // Temperaturbereich wo Relais aus bleibt 65 - 45
      if(T2 < 65 and T2 > 45){
      digitalWrite(Relais, LOW);
      }
 
      if(T2 < 44){                // Temperaturbereich bis wohin Temperatur ganz abfallen kann
      Modus = 1;
      }
 
      if(T2 > 70){                // Übertemperatur 70
      Modus = 3;   }
      }

      else if(Modus == 3){
      digitalWrite(Relais, LOW);   
      Modus = 2;

      zaehler++;
       }
      }
      delay(100000);

Hallo,
habe es gerade probiert.
Es geht leider nicht.
Die Regelung macht nun undefinierte Dinge…schnelles an - aus, ganz anderst als ohne die “5x” Routine

Ein ähnliches Verhalten hatte ich mit for I usw. auch…
Sobald die "5x " Routine wieder weg ist, läuft es sauber.

Noch eine Idee ?
Grüsse Rainer

rainerkol:
Ein ähnliches Verhalten hatte ich mit for I usw. auch…
Sobald die "5x " Routine wieder weg ist, läuft es sauber.

Ausser dem Zaehler brauchst die Statusvariable um das umschalten zu verhindern… Ich schau nochmal

Noch eine Idee ?

Ich hab mal aus der holen Hand zwei Funktionen so gemacht, wie ich es mir denke.
Ersetze die und bau Deine globalen Variablen sowie das Setup der PINs ind den Rumpf und probier mal aus.

int machewarm (const int schritt)
{
  digitalWrite (Relais, LOW);    // Relais ist LOW aktiv also jetzt EIN
  if (T2 >= 65)                  // obere Grenztemperatur erreicht?
  {
    digitalWrite (Relais, HIGH); // Heizung AUS
    schritt = kuehlen;           // nächster Schritt
  }
  return (schritt);
}

int machekalt (const int schritt)
{
  static int zaehler = 0;
  if (T2 < 45)   // Wenn die Temperatur wieder höher sein soll
  {
    zaehler++;   //
    schritt = heizen;
  }
  if (zaehler >= 5)
  {
    zaehler = 0;
    schritt = warten;
  }
  return schritt;
}