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.
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 )
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.
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.