Solarüberschuss für Warmwasserbereitung verwenden

Hallo,

ich möchte einen Teil meines Überschusses der Solaranlage zur Warmwasserbereitung nutzen.

Es ist eine Erweiterung meines Projekts https://forum.arduino.cc/t/deye-hybridwechselrichter-uber-modebus-rtu-schalten/1354001

Das Auslesen der Leistung in Watt am Einpeisepunkt funktioniert schon mal, der Zahlenwert ist ein “int” von +11000 bis -11000.

+für Netzentnahme, - für Netzeinspeisung

Der Leistungssteller wird stufenlos über den I2c- Bus angesteuert, das funktioniert auch.

Jetzt weis ich nicht wie der Code aussehen muß, um beides zu verbinden. Es gibt ja immer ein Rückkopplung,

Ist z.B. int Netz = -1000 und ich stelle den Heizstab auf 1000W, dann ist im nächsten Scetchdurchlauf int Netz = 0 , der heizstab wieder auf 0W, er schaltet also mit jedem Scetchdurchlauf hin und her.

Du musst die differenz zum berechnen nutzen. Wenn du null zurück bekommst darfst du auch nur Null ändern

Da hast du doch deinen Fehler selbst klar bescrieben.
Wenn du 0 ins Netz einspeist, aber der Heizstab 1000 W zieht, ist das doch genau dein Sollzustand.
Ich denke, das ist, was auch @wwerner in #2 gesagt hat.
Wenn ins Netz x eingespeist wird, solltest du den Heizstab auf (aktuell + x) stellen, nicht auf x.
Wenn aus dem Netz x bezogen wird, sollte die Leistung des Heizstabs um x reduziert werden (sofern möglich :wink: )

Oder vieleicht klarer gesagt.

Wenn Du zb 1000W Überproduktion hast und den Heizstab auf 1000W stellst, ist die Gesamtprodultion also Produktion Leistungszähler minus Heizleistung.
Also -1000 dann schaltest Du 1000W Heizung und die Produktion wird als 0 gelesen. Wenn Du nun 1000 wegzählst bekommst Du wieder -1000 und somit die 1000W Heizung weiterhin sinnvoll bleibt.
Eine Überlegung ist es wert wie Du die Regelung der Heizleistung machst. Ob Du bei jeder kleinsten Änderung der Produktion bzw des eigenem Verbrauchs auch die Heizleistung neu einstellst oder dies in Stufen mit einer Zeitlichen Verzögerung machst.

Grüße Uwe

Danke für die Antworten, das müßte doch funktionieren?

Das Intervall müßte ich noch testen

uint16_t Heizstab = 2000;       //maximale Leistung Heizstab in Watt
uint16_t Heizleistung = 0
int Volt_Watt = 0;              //Spannung pro Watt
int Netz = 0;                   // Wert am Einspeisepunkt
uint16_t Ausgangsspannung = 0;

void loop() {

  Volt_Watt(10 / Heizstab);  

  Netz = -Netz;                           //Vorzeichenumkehr
  Heizleistung = Netz + Heizleistung;
  
  Ausgangsspannung = Netz * Volt_Watt;    //Ausgabe Steuerspannung 0-10V

  delay(....);
}

war Quatsch…

Na, ja, nicht wirklich. Was ist volt watt? Wo kommt netz her? Es fehlt die Prüfung dass die Leistung nicht kleiner Null wird und nicht größer 2000 Watt

Da ich keinerlei Code von Dir sehe und auch sonst irgendwie alles äussert geheim ist:
Hier mein Vorschlag

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming
const int8_t heizLeistungAus = 0;
const int16_t heizLeistungMax = 2000;    // maximaler einstellbarer Wert
const int16_t heizLeistungMin = 500;     // Mindestwert ab dem geheizt wird
const int16_t minWattSwitch = 100;       // Hysteresewert, für hoch-/runterschalten
const uint32_t timeHysSwitch = 60000;    // Zeit / Hysterese um flattern zu vermeiden

int16_t heizLeistung;           // aktueller Heizwert
int16_t einspeisepunkt;         // aktueller Messwert
uint32_t lastPlusTime;          // Merker, wann das letzte mal positiver Wert
uint32_t lastMinusTime;         // Merker, wann das letzte mal negativer Wert

void setup()
{
  Serial.begin(115200);
  Serial << (F("\r\nStart...\r\n")) << endl;
}

void loop()
{x();}

void x()
{
  uint32_t aktTime = millis();
  einspeisepunkt = getDataFromDeye();                    // holt die Daten via Modbus und übergibt von -11000 bis +11000

  if (einspeisepunkt < 0)                                // Es wird Leistung aus dem Netz bezogen
  {
    // Es muss lange genug Zeit zwischen letztem positiven und aktuellem negativen Messwert vergangen sein!
    if ((aktTime - lastPlusTime) > timeHysSwitch)        // Es ist lange genug
    {
      heizLeistung -= abs(einspeisepunkt);               // setzt die Heizleistung herab Achtung! einspeisepunkt ist negativ!
      // alternativ: heizLeistung += einspeisepunkt;
    }
  }

  if (einspeisepunkt > 0)
  {
    if ((aktTime - lastMinusTime) > timeHysSwitch)
    { heizLeistung += einspeisepunkt; }
  }

  // Merker für Zeithysterese setzen
  if (einspeisepunkt >= 0)
  { lastPlusTime = aktTime; }

  if (einspeisepunkt <= 0)
  { lastMinusTime = aktTime;}

  if (heizLeistung < heizLeistungMin)
  { heizLeistung = 0; }
  else if (heizLeistung > heizLeistungMax)
  { heizLeistung = heizLeistungMax;}

  setHeizLeistung();
}

uint16_t getDataFromDeye()
{
  int16_t watt = 1000;
  return watt;
}

void setHeizLeistung()
{
  // Hier schreibe die Heizwerte via I2C
}

Die Zugfahrt hoffentich sinnvoll genutzt und genügend Kommentare drin.
Es ist ein wenig Logik, sollte aber ersichtlich sein was es werden soll.
Es kompiliert Fehler- und Warnungsfrei.

Eine Begrenzung nach oben oder unten ist nicht nötig
Das war vieleicht zuviel, etwas kürzer:




uint16_t Heizleistung = 0
int Netz = 0;             // Wert am Einspeisepunkt +11000 bis -11000
                          // der Wert kommt aus einem anderen Teil des Sketches     


void loop() {

  
  Netz = -Netz;                           //Vorzeichenumkehr
  Heizleistung = Netz + Heizleistung;
  
  

  delay(....);
}

my_xy_projekt

Danke für Deine Mühe, aber das übersteigt meine Kenntnisse.

Mit deinem Code kann man nichts machen. Der ist einfach nur sinnlos. Aber wenn du meinst das es so geht, dann mache es so.

Dann frag ich mich, wie Du den Rest hinbekommen hast. Raten?
Egal.
Das wird nix mehr. Nur eines noch:

Ich rate Dir ganz dringend von Deinem delay ab!
Du bekommst nicht mit, wenn die Komponente in der Zeit die Richtung wechselt.

Während Deiner einmaligen Messung kommt 1Watt Überschuss raus und für die Zeit des delay ein Bezug.

Herzichen Glückwunsch: Du heizt Deinen Speicher Stundenlang mit Netzstrom.