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

Hallo,
leider gehts es auf Anhieb nicht . Es bringt beim kompilieren Probleme mit der ersten Klammer nach
...int schritt.

int machewarm (const int schritt)
{
  digitalWrite (Relais, HIGH);    
  if (T2 >= 65)

a function-definition is not allowed here before '{' token

    if(T2 > 70){                // Übertemperatur 70

Modus = 3;   }
   }

Wenn das richtig ist, ist es schlecht formatiert.

Wie schnell, schätzt du, läuft weine while-Scheife durch? (Wenige µs )
Wie oft wird darin T2 neu gesetzt ? (Nie)
Was wird in der Variablen zaehler gezählt? (keine Ahnung)

Wenn du noch definierst, wann zaehler jemals wieder rückgesetzt wird,
die while-Scheife einfach weglässt,
und so auch T2 eine Chance gibst, jemals gemessen zu werden,
... könnte es was werden.

![](http://C:\Users\Rainer\Desktop\Neuer Ordner\Regelung ohne 5x Routine.JPG)
So sieht es ohne 5x Routine aus.
Hoffe das Bild läsast sich uploaden.
Gruss Rainer

Hoffe das Bild läsast sich uploaden.

Offensichtlich nicht.
Was willst du überhaupt in einem Bild zeigen? ( Ein Text sagt mehr als verwackelte Bilder )

Ich hab das nochmal...
Jetzt zaehlt der Zaehler rückwärts von 5 nach 0 undzwar NUR wenn der obere Heizpunkt eereicht ist und das Relais abschaltet.
Jetzt sehe ich auch, das Deine relais HIGH-aktiv sind. Benutzt Du Module dafür? Welche?

// Der irgendwann beim Start gesetzt werden
static int zaehler = 5; // Anzahl Heizzyklen
Serial.println (zaehler);
if (zaehler > 0) // geändert von while nach if - sonst ist T2 aussen vor
{
  if (Modus == 1)
  {
    digitalWrite (Relais, HIGH); // Relais an bis maximalTemperatur 65
    if (T2 > 65)                  // MaximalTemperatur 65, Relais aus
    {
      digitalWrite (Relais, LOW);
      Modus = 2;
      zaehler--; // Wenn der obere Punkt erreicht ist runterzählen
    }
  }
  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;
      }
}

michael_x:
Wenn das richtig ist, ist es schlecht formatiert.

und so auch T2 eine Chance gibst, jemals gemessen zu werden,
... könnte es was werden.

Ja und ja.

Hallo Also es geht immer noch nicht...
Der Grundcode läuft sauber, ich wollte das Bild mit dem SerialPlotter zeigen.
Also der Part funktioniert wirklich sauber.
Alles was vorne und hinten zum 5x ausführen dazu kam, hat das Relais bisher zum unstabilen
Schalten geführt.
Ja die Relais sind High aktiv, das habe ich bedacht und geändert.
Der neue Code lässt sich kompileren , aber lässt das Relais wieder undefiniert flattern.

Oje, doch keine Kleinigkeit wie Anfangs gedacht :slight_smile:

    Serial.println(T2);
    
    if(Modus == 1){
      digitalWrite(Relais, HIGH); // Relais an bis maximal Temperatur 65
  
    
    if(T2 > 50){                  // MaximalTemperatur 65, Relais aus
       digitalWrite(Relais, LOW);
       Modus = 2;   }
       }

      else if(Modus == 2){        // Temperaturbereich wo Relais aus bleibt 65 - 45
      if(T2 < 47 and T2 > 40){
      digitalWrite(Relais, LOW);
      }
 
      if(T2 < 40){                // 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;

      }

PS: der Temperaturwechsel geht ja einige paar Sekunden, deswegen ist auch genug zeit um T2 immer sicher zu erfassen.
Im Serialplotter ein sauberes SinusSignal mit den entsprechenden Schwellen.

rainerkol:
Oje, doch keine Kleinigkeit wie Anfangs gedacht :slight_smile:

Weil das nur Schnipsel ist, zurückgreift auf Dinge die hier nicht enthalten sind und damit erschwert wird, was vernünftiges rauszubekommen.

Stell den Gesamtcode rein.
In der Zeit bau ich mal meine Schrittkette mit 5mal heizen und 5 mal kühlen + abkühlen ohne Zaehler. :wink:

sehr gerne.....
Habe auf das wesentliche zusammengefast. Ist nun ein kompleter einsehbarer working Code der im Dauerloop eine schöne Sinus Regelung (Zweipunktregelung macht). Praktisch auf dem Tisch aufgebaut.

Immer noch das Problem, die Regelung soll nur 5x durchlaufen.
Danach kommt ein lange Pasue und dann beginnt es wieder.

[code]
#include  <ESP8266WiFi.h>
#include  <OneWire.h>
#include  <DallasTemperature.h>
#include  "DHT.h"

#define DHTPIN        12                             // GPIO12 (D6) DHT
#define DHTTYPE       DHT22     
#define ONE_WIRE_BUS  14                             // GPIO14 (D5) 1Wire


OneWire           oneWire(ONE_WIRE_BUS);
DallasTemperature T2s(&oneWire);

DHT               dht(DHTPIN, DHTTYPE);

DeviceAddress     SensA     = { 0x28, 0x40, 0x0F, 0x45, 0x92, 0x09, 0x02, 0x0C };    
DeviceAddress     SensB     = { 0x28, 0x4B, 0x34, 0x45, 0x92, 0x17, 0x02, 0x30 };    
DeviceAddress     SensC     = { 0x28, 0x4C, 0x92, 0x45, 0x92, 0x03, 0x02, 0xCD }; 



//......................................................................Variablen festlegen

  float T1;
  float T2;
  float T3;
  float T4;
  float T5;
  const int Relais            = 2;
  int       Modus             = 1;


//_______________________________________________________________________________VOID Setup

void setup()
{
  // Debug console
  Serial.begin(9600);



  T2s.begin();                          // starte 1 Wire
  T2s.setResolution(SensA,  12);      // one wire 12 BIT ADC
  T2s.setResolution(SensB, 12);      // one wire 12 BIT ADC
  T2s.setResolution(SensC,   12);      // one wire 12 BIT ADC  

  pinMode(Relais, OUTPUT);              // Relais   1
  digitalWrite(Relais, LOW);            // Relais   1
  
}


//___________________________________________________________________VOID LOOP

  void loop(){

  // -------------------------------------------------------------------DHT22
  float T5 = dht.readTemperature();
  float H1 = dht.readHumidity();
  
  delay(1000);                                                // 1 Sekunde wait
  
  //--------------------------------------------------------------------1Wire
  T2s.requestTemperatures();  
  float T1 = T2s.getTempC(SensA);         // Variable T1 für SensA  auslesen
  float T2 = T2s.getTempC(SensB);         // Variable T2 für SensB  auslesen
  float T3 = T2s.getTempC(SensC);         // Variable T3 für SensC  auslesen
      if (T1 == -127.00) {T1 = 999;} else {T1 = T1;}    //T1 defekt = 999
      if (T2 == -127.00) {T2 = 999;} else {T2 = T2;}    //T2 defekt = 999
      if (T3 == -127.00) {T3 = 999;} else {T3 = T3;}    //T3 defekt = 999


 // das hier soll 5x mal durchlaufen ___________________________________________________________________
    
    Serial.println(T2);
    
    if(Modus == 1){
      digitalWrite(Relais, HIGH); // Relais an bis maximal Temperatur 50
      
    
    if(T2 > 50){                  // MaximalTemperatur 50, Relais aus
       digitalWrite(Relais, LOW);
       Modus = 2;   }
       }

      else if(Modus == 2){        // Temperaturbereich wo Relais aus bleibt 47 - 40
      if(T2 < 47 and T2 > 40){
      digitalWrite(Relais, LOW);
      }
 
      if(T2 < 40){                // 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;
      }
       // das obige soll 5x mal durchlaufen _______________________________________________________________
       // danach lange Pause.....über delay(10000000) etc....
      
      }

[/code]

rainerkol:
die Regelung soll nur 5x durchlaufen.

Ja.
Aber nicht an dem Punkt, wo Du es eingetragen hast.
Du willst das er nach dem 5.Mal "Heizztemperatur erreicht" aufhört.
Also so wie ich es in meinem Post geschrieben habe,

static int zaehler = 5; // Anzahl Heizzyklen

den static int zaehler an der Stelle raus und vor setup() gesetzt - ohne static.
Mit jedem erfolgreichen Heizzyklus wird der zaehler runtergezaehlt. bis 0.

Dann brauchst kein delay - weil wenn der zaehler 0 ist, ist die Bedingung nicht erfüllt, wird also kein heizen durchgeführt...

Danke, aber jetzt sind wider bei "Schnippsel".
Kannst du es bitte in den letzten Working Code eintragen, sonst drehen wir uns nur im Kreis mit den Schnippseln.
Gruss Rainer

rainerkol:
Kannst du es bitte in den letzten Working Code eintragen, sonst drehen wir uns nur im Kreis mit den Schnippseln.

Gerne!

[code]
#include  <ESP8266WiFi.h>
#include  <OneWire.h>
#include  <DallasTemperature.h>
#include  "DHT.h"

#define DHTPIN        12                             // GPIO12 (D6) DHT
#define DHTTYPE       DHT22
#define ONE_WIRE_BUS  14                             // GPIO14 (D5) 1Wire


OneWire           oneWire(ONE_WIRE_BUS);
DallasTemperature T2s(&oneWire);

DHT               dht(DHTPIN, DHTTYPE);

DeviceAddress     SensA     = { 0x28, 0x40, 0x0F, 0x45, 0x92, 0x09, 0x02, 0x0C };
DeviceAddress     SensB     = { 0x28, 0x4B, 0x34, 0x45, 0x92, 0x17, 0x02, 0x30 };
DeviceAddress     SensC     = { 0x28, 0x4C, 0x92, 0x45, 0x92, 0x03, 0x02, 0xCD };



//......................................................................Variablen festlegen

float T1;
float T2;
float T3;
float T4;
float T5;
const int Relais            = 2;
int       Modus             = 1;
int zaehler = 5; // *** Anzahl Durchläufe

//_______________________________________________________________________________VOID Setup


void setup()
{
  // Debug console
  Serial.begin(9600);



  T2s.begin();                          // starte 1 Wire
  T2s.setResolution(SensA,  12);      // one wire 12 BIT ADC
  T2s.setResolution(SensB, 12);      // one wire 12 BIT ADC
  T2s.setResolution(SensC,   12);      // one wire 12 BIT ADC

  pinMode(Relais, OUTPUT);              // Relais   1
  digitalWrite(Relais, LOW);            // Relais   1

}


//___________________________________________________________________VOID LOOP

void loop() {

  // -------------------------------------------------------------------DHT22
  float T5 = dht.readTemperature();
  float H1 = dht.readHumidity();

  delay(1000);                                                // 1 Sekunde wait

  //--------------------------------------------------------------------1Wire
  T2s.requestTemperatures();
  float T1 = T2s.getTempC(SensA);         // Variable T1 für SensA  auslesen
  float T2 = T2s.getTempC(SensB);         // Variable T2 für SensB  auslesen
  float T3 = T2s.getTempC(SensC);         // Variable T3 für SensC  auslesen
  if (T1 == -127.00) {
    T1 = 999; //T1 defekt = 999
  } else {
    T1 = T1;
  }
  if (T2 == -127.00) {
    T2 = 999; //T2 defekt = 999
  } else {
    T2 = T2;
  }
  if (T3 == -127.00) {
    T3 = 999; //T3 defekt = 999
  } else {
    T3 = T3;
  }


  // das hier soll 5x mal durchlaufen ___________________________________________________________________
  // *** Bist Du Dir ganz sicher?
  // *** Du willst doch "nur" 5x heizen.

  Serial.println(T2);
  if (zaehler > 0) // *** Solange der Zaehler nicht runtergezählt hat, wird der folgende Code ausgeführt
  {
    if (Modus == 1) {
      digitalWrite(Relais, HIGH); // Relais an bis maximal Temperatur 50
      if (T2 > 50) {                // MaximalTemperatur 50, Relais aus
        digitalWrite(Relais, LOW);
        Modus = 2;
        zaehler--; // *** Und hier wird nach beenden der Heizperiode der zaehler decrementiert
      }
    }

    else if (Modus == 2) {      // Temperaturbereich wo Relais aus bleibt 47 - 40
      if (T2 < 47 and T2 > 40) {
        digitalWrite(Relais, LOW);
      }
      if (T2 < 40) {              // 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;
    }
    // das obige soll 5x mal durchlaufen _______________________________________________________________
    // danach lange Pause.....über delay(10000000) etc....

  }
}

Meine Kommentare sind mit ***

Hurra, Hurra, es geht und jetzt verstehe ich das auch noch warum :slight_smile:

Vielen lieben Dank für die Hilfe , Zeit und Mühe !

5 big Stars for "my_xy_projekt"

Liebe Grüsse

rainerkol:
Hurra, Hurra, es geht und jetzt verstehe ich das auch noch warum :slight_smile:

na siehst, einmal Sketch - 2 Postst... Lösung.

Und ja, jetzt komm ich nochmal auf #9 zurück:

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

Und dann kannst gleich noch ein [gelöst] mit reinschreiben.

....alles brav gemacht :slight_smile:
Meine Erste Erfahrung im Forum, super !
Gleich an gute Leute geraten... !
Eine letzte Frage, wo kann ich den "gelöst" Button finden ?
Oder ich schreibe hier: [gelöst]

rainerkol:
Oder ich schreibe hier: [gelöst]

Nicht hier.
Da.
:wink:

Und nu sind die guten Leute wieder lieb...

So , nachdem der Bogen raus ist, noch eine weitere Möglichkeit für die technisch Interessierten.
Der Knackpunkt Zähler jetzt über Switch States :slight_smile:
Der Vorteil, mann kann wie hier z.B.: über Taster starten und danach, nach der Heizroutine noch andre Sachen weitersteuern. oder wieder Reseten etc....

Gefällt mir eigendlich jetzt auch ganz gut ......
Ende Gut alles Gut !

#include  <ESP8266WiFi.h>
#include  <OneWire.h>
#include  <DallasTemperature.h>
#include  "DHT.h"

#define DHTPIN        12                             // GPIO12 (D6) DHT
#define DHTTYPE       DHT22     
#define ONE_WIRE_BUS  14                             // GPIO14 (D5) 1Wire


OneWire           oneWire(ONE_WIRE_BUS);
DallasTemperature T2s(&oneWire);

DHT               dht(DHTPIN, DHTTYPE);

DeviceAddress     SensA     = { 0x28, 0x40, 0x0F, 0x45, 0x92, 0x09, 0x02, 0x0C };    
DeviceAddress     SensB     = { 0x28, 0x4B, 0x34, 0x45, 0x92, 0x17, 0x02, 0x30 };    
DeviceAddress     SensC     = { 0x28, 0x4C, 0x92, 0x45, 0x92, 0x03, 0x02, 0xCD }; 



//......................................................................Variablen festlegen

  float T1;
  float T2;
  float T3;
  float T4;
  float T5;
  const int Relais            = 2;
  int       Modus             = 1;
  int       Relaistate;
  int       counter;

  int switchState       = 0;
  int lastSwitchState   = 2;

//___________________________________________________________________VOID Setup

void setup()
{

  Serial.begin(9600);



  T2s.begin();                          // starte 1 Wire
  T2s.setResolution(SensA,    12);      // one wire 12 BIT ADC
  T2s.setResolution(SensB,    12);      // one wire 12 BIT ADC
  T2s.setResolution(SensC,    12);      // one wire 12 BIT ADC  

  pinMode(Relais, OUTPUT);              // Relais   1
  digitalWrite(Relais, LOW);            // Relais   1

  pinMode(5, INPUT);                    // Start Taste
  
}


//___________________________________________________________________VOID LOOP

  void loop(){

  // -------------------------------------------------DHT22
  float T5 = dht.readTemperature();
  float H1 = dht.readHumidity();
  
  delay(1000);           // 1 Sekunde wait
  
  //--------------------------------------------------1Wire
  T2s.requestTemperatures();  
  float T1 = T2s.getTempC(SensA);        
  float T2 = T2s.getTempC(SensB);        
  float T3 = T2s.getTempC(SensC);         
      if (T1 == -127.00) {T1 = 999;} else {T1 = T1;}    //T1 defekt = 999
      if (T2 == -127.00) {T2 = 999;} else {T2 = T2;}    //T2 defekt = 999
      if (T3 == -127.00) {T3 = 999;} else {T3 = T3;}    //T3 defekt = 999


 //  _____________________5er LOOP______________________________________________
    
    Serial.println(T2);

        if (digitalRead(5) == HIGH) // wenn Taste 5 , dann 5x Heizroutine
        { modus();}
        else {};
        
        if (counter >= 5) {
          digitalWrite(Relais, LOW);
          
        
  }      
  }

 //  ___________________________________________________________________
  void modus() {

    switchState = digitalRead(2);
    if (switchState != lastSwitchState) {  
    if (switchState == LOW) {
       
        delay(100);
        counter = counter +1;
        lastSwitchState = switchState;
        } else {
        counter = counter;
        lastSwitchState = switchState;
        }
        } else {}


      float T1 = T2s.getTempC(SensA);         // Variable T1 für SensA  auslesen
      float T2 = T2s.getTempC(SensB);         // Variable T2 für SensB  auslesen
      float T3 = T2s.getTempC(SensC);         // Variable T3 für SensC  auslesen  
    
      if(Modus == 1){
      digitalWrite(Relais, HIGH); // Relais an bis maximal Temperatur 50
      
    
      if(T2 > 50){                  // MaximalTemperatur 50, Relais aus
       digitalWrite(Relais, LOW);
       Modus = 2;   }
       }

      else if(Modus == 2){        // Temperaturbereich wo Relais aus bleibt 47 - 40
      if(T2 < 47 and T2 > 40){
      digitalWrite(Relais, LOW);
      
      }
 
      if(T2 < 40){                // 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;
      }
      }

rainerkol:
Ende Gut alles Gut !

      if (T1 == -127.00) {T1 = 999;} else {T1 = T1;}    //T1 defekt = 999

if (T2 == -127.00) {T2 = 999;} else {T2 = T2;}    //T2 defekt = 999
      if (T3 == -127.00) {T3 = 999;} else {T3 = T3;}    //T3 defekt = 999

NEIN!
Und ja, ich wollte erstmal abwarten.
Schau in die lib's, die Du verwendest.
Das ist viel zu lesen. Aber spätestens, wenn Dir die Heizung aus geht und Du nicht für Dich erklären kannst warum, dann bist Du wieder hier.

Das ist abgefangen, habe ja gesagt das ich viel weggetan habe um nur den Kern des Problems darzustellen. Die Entstör und Redundazen, dass die Heizung nichts tut was ich nicht will... Sind vorhanden... Alles gut.
Nicht gleich so schwarz und eng sehen.
Es geht mir hier auch um einen anderen Lösungsweg, falls es nicht aufgefallen sein sollte. Ich teile auch gerne meine Erfahrungen und bin über positive Kritik erfreut.... In diesen Sinne