Poolwasser mit der Sonne aufheizen.

Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Admin »

Hier habe ich mal einen Mitschnitt alle 5 Minunten von etwa 14:00 Uhr bis 17:00 Uhr
Die zwei Linien sind immer die Trennen zum nächsten Mitschnitt. Also der 5 Min. Sprung.
Es scheint doch zu funktionieren. Fast unten am Ende im rot markierten habe ich Fett markiert, wo es Übergänge ziwschen über 50% und direkten 50% gab. Da sieht man die Reaktion des Programmes an der PumpenDrehzahl. Wenn es nur noch 50% Batterie Leistung oder auch weniger sind, wird die Pumpenleistung auf PWM 150 zurück genommen. Wenn es wieder mehr als 50% Batterieleistung sind, wird die Pumpe wieder auf die Soll-Leistung hochgeregelt. Also alles gut. Habe ich mich gestern wohl getäuscht.
:(oo):
Grün Markiert. Unten kurz vor dem Roten Bereich. Die Pumpen-Drehzahl ist nicht mehr Vollgas, weil die TeperaturDifferenz unter der Eingestellten SollDifferenz ist.

Hier noch die Erklärung der angezeigten Werte:
Drehzahl Pumpe Istwert - Sollwert, angezeigt in PWM. 255 ist Vollgas.
Temperatur Poolwasser im Moment
Temperatur Solarwasser (Also Temperatur des aufgeheizten Wassers vom Dach zurück in den Pool) auch im Moment.
Tempdif = Differen vom Wasser Pool aufs Dach <-> zum Wasser Dach zurück in den Pool.
Soldif = ist eingestellte Differenz ab wo die Pumpe Vollgas laufen soll
--------------------------------------------------------------------------------------------------------------------
Panel= Was das Panel bei der Sonne Momentan liefert.
Akku= Wie der Ladezustand des Akkus Momentan ist.
---------------------------------
Drehzahl Pumpe = 220 - 255
Temp Pool = 18.94
Temp Solar = 31.56
Tempdif = 12.63 Soldif = 2
---------------------------------
Panel 36.69V 1.93A 71.05W
Akku 14.21V 5.00A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 18.94
Temp Solar = 28.25
Tempdif = 9.31 Soldif = 3
---------------------------------
Panel 28.30V 1.52A 43.02W
Akku 13.32V 3.23A 82%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 18.94
Temp Solar = 27.12
Tempdif = 8.19 Soldif = 3
---------------------------------
Panel 34.70V 1.85A 64.33W
Akku 13.66V 4.71A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 18.94
Temp Solar = 26.81
Tempdif = 7.88 Soldif = 3
---------------------------------
Panel 37.03V 2.02A 75.03W
Akku 14.13V 5.31A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.00
Temp Solar = 27.12
Tempdif = 8.13 Soldif = 3
---------------------------------
Panel 30.53V 0.90A 27.66W
Akku 13.11V 2.11A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.00
Temp Solar = 27.44
Tempdif = 8.44 Soldif = 3
---------------------------------
Panel 35.79V 1.80A 64.63W
Akku 13.90V 4.65A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.00
Temp Solar = 26.62
Tempdif = 7.63 Soldif = 3
---------------------------------
Panel 34.58V 1.94A 67.31W
Akku 13.85V 4.86A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.12
Temp Solar = 28.19
Tempdif = 9.06 Soldif = 3
---------------------------------
Panel 36.75V 2.01A 74.16W
Akku 14.29V 5.19A 94%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.19
Temp Solar = 28.44
Tempdif = 9.25 Soldif = 3
---------------------------------
Panel 33.35V 1.89A 63.15W
Akku 13.85V 4.56A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.12
Temp Solar = 26.19
Tempdif = 7.06 Soldif = 3
---------------------------------
Panel 33.98V 0.98A 33.57W
Akku 13.27V 2.53A 75%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.19
Temp Solar = 27.62
Tempdif = 8.44 Soldif = 3
---------------------------------
Panel 38.25V 1.88A 72.01W
Akku 14.26V 5.05A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.25
Temp Solar = 28.31
Tempdif = 9.06 Soldif = 3
---------------------------------
Panel 36.35V 1.94A 70.75W
Akku 14.18V 4.99A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.37
Temp Solar = 28.62
Tempdif = 9.25 Soldif = 3
---------------------------------
Panel 35.34V 1.94A 68.90W
Akku 14.12V 4.88A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.37
Temp Solar = 27.69
Tempdif = 8.31 Soldif = 3
---------------------------------
Panel 35.68V 1.98A 70.68W
Akku 14.25V 4.96A 71%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.31
Temp Solar = 25.37
Tempdif = 6.06 Soldif = 3
---------------------------------
Panel 31.64V 0.99A 31.53W
Akku 13.03V 2.42A 72%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.25
Temp Solar = 24.94
Tempdif = 5.69 Soldif = 3
---------------------------------
Panel 31.06V 0.99A 30.76W
Akku 12.98V 2.37A 69%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.25
Temp Solar = 24.81
Tempdif = 5.56 Soldif = 3
---------------------------------
Panel 32.62V 0.82A 27.04W
Akku 12.94V 2.09A 97%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.37
Temp Solar = 27.56
Tempdif = 8.19 Soldif = 3
---------------------------------
Panel 35.31V 1.97A 69.88W
Akku 14.09V 4.96A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.37
Temp Solar = 27.12
Tempdif = 7.75 Soldif = 3
---------------------------------
Panel 37.07V 1.83A 67.96W
Akku 14.16V 4.80A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.44
Temp Solar = 27.69
Tempdif = 8.25 Soldif = 3
---------------------------------
Panel 36.32V 1.92A 69.82W
Akku 14.28V 4.89A 100%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.44
Temp Solar = 25.62
Tempdif = 6.19 Soldif = 3
---------------------------------
Panel 30.99V 0.69A 21.40W
Akku 12.97V 1.65A 69%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.37
Temp Solar = 24.75
Tempdif = 5.38 Soldif = 3
---------------------------------
Panel 30.13V 0.77A 23.23W
Akku 12.91V 1.80A 67%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.37
Temp Solar = 24.37
Tempdif = 5.00 Soldif = 3
---------------------------------
Panel 30.17V 0.97A 29.43W
Akku 12.91V 2.28A 67%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.37
Temp Solar = 24.81
Tempdif = 5.44 Soldif = 3
---------------------------------
Panel 31.88V 1.03A 32.86W
Akku 12.99V 2.53A 70%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.37
Temp Solar = 24.50
Tempdif = 5.13 Soldif = 3
---------------------------------
Panel 33.00V 0.83A 27.58W
Akku 12.89V 2.14A 66%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.31
Temp Solar = 24.06
Tempdif = 4.75 Soldif = 3
---------------------------------
Panel 32.00V 0.72A 23.09W
Akku 12.83V 1.80A 64%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.31
Temp Solar = 23.94
Tempdif = 4.63 Soldif = 3
---------------------------------
Panel 33.69V 0.72A 24.50W
Akku 12.83V 1.91A 64%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.31
Temp Solar = 23.75
Tempdif = 4.44 Soldif = 3
---------------------------------
Panel 32.63V 0.47A 15.65W
Akku 12.73V 1.23A 60%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.31
Temp Solar = 23.37
Tempdif = 4.06 Soldif = 3
---------------------------------
Panel 14.15V 0.66A 9.36W
Akku 12.65V 0.74A 57%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.25
Temp Solar = 23.44
Tempdif = 4.19 Soldif = 3
---------------------------------
Panel 14.04V 0.48A 6.81W
Akku 12.62V 0.54A 56%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.25
Temp Solar = 22.87
Tempdif = 3.63 Soldif = 3
---------------------------------
Panel 13.91V 0.28A 4.02W
Akku 12.57V 0.32A 54%
---------------------------------
---------------------------------
Drehzahl Pumpe = 255 - 255
Temp Pool = 19.19
Temp Solar = 22.19
Tempdif = 3.00 Soldif = 3
---------------------------------
Panel 13.90V 0.24A 3.39W
Akku 12.56V 0.27A 53%
---------------------------------
---------------------------------
Drehzahl Pumpe = 206 - 206
Temp Pool = 19.19
Temp Solar = 21.87
Tempdif = 2.69 Soldif = 3

---------------------------------
Panel 23.40V 0.40A 9.43W
Akku 12.58V 0.75A 54%
---------------------------------
---------------------------------
Drehzahl Pumpe = 212 - 206
Temp Pool = 19.12
Temp Solar = 21.75
Tempdif = 2.63 Soldif = 3
---------------------------------
Panel 13.93V 0.38A 5.40W
Akku 12.57V 0.43A 53%
---------------------------------
---------------------------------
Drehzahl Pumpe = 202 - 202
Temp Pool = 19.12
Temp Solar = 21.69
Tempdif = 2.56 Soldif = 3
---------------------------------
Panel 13.88V 0.30A 4.25W
Akku 12.52V 0.34A 52%
---------------------------------
---------------------------------
Drehzahl Pumpe = 150 - 199
Temp Pool = 19.12
Temp Solar = 21.56
Tempdif = 2.44 Soldif = 3
---------------------------------
Panel 13.84V 0.08A 1.12W
Akku 12.52V 0.09A 50%
---------------------------------
---------------------------------
Drehzahl Pumpe = 170 - 199
Temp Pool = 19.06
Temp Solar = 21.56
Tempdif = 2.50 Soldif = 3
---------------------------------
Panel 13.80V 0.17A 2.37W
Akku 12.49V 0.19A 51%
---------------------------------
---------------------------------
Drehzahl Pumpe = 150 - 195
Temp Pool = 19.06
Temp Solar = 21.50
Tempdif = 2.44 Soldif = 3
---------------------------------
Panel 13.79V 0.20A 2.87W
Akku 12.50V 0.23A 50%

---------------------------------
---------------------------------
Drehzahl Pumpe = 150 - 195
Temp Pool = 19.06
Temp Solar = 21.31
Tempdif = 2.25 Soldif = 3
---------------------------------
Panel 13.68V 0.03A 0.49W
Akku 12.43V 0.04A 50%
---------------------------------
Bernhard - Fony
Beiträge: 73
Registriert: Mo 12. Jun 2023, 17:49
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Bernhard - Fony »

Kleine Denkfehler machen oft Probleme, woher kenne ich das bloß :roll:
Muss mal dein PRG genauer anschauen.
Bernhard - Fony
Beiträge: 73
Registriert: Mo 12. Jun 2023, 17:49
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Bernhard - Fony »

Hmm schetze hier ist der Fehler

Code: Alles auswählen

  if ((prozent > 60) && ((tempdif / 10) > P2))
    {
      Solldrehzahl = Drehzahlmax;
    }
     analogWrite(RPWM, Drehzahl);  //? ???
    analogWrite(LPWM, 0);
    Sekundenablauf04 = millisekunden;
  }
Um die Drehzahl bestimmen wird das Kombi Solldrehzahl, Drehzahlmax, Drehzahl öfters im Durchlauf vergleicht, mach doch eine Ausnahme und schreibe

Code: Alles auswählen

analogWrite(RPWM, Drehzahlmaxl); 
Meine so:
Ist ab Zeile 313 bis 318

Code: Alles auswählen

 if ((prozent > 60) && ((tempdif / 10) > P2))
  {
     analogWrite(RPWM, Drehzahlmax);
  }
   analogWrite(LPWM, 0);
Bernhard - Fony
Beiträge: 73
Registriert: Mo 12. Jun 2023, 17:49
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Bernhard - Fony »

Code: Alles auswählen

 pinMode(RPWM, OUTPUT);              // PWM Pumpensteuerung
  pinMode(LPWM, OUTPUT);              // PWM Pumpensteuerung
Das verstehe nicht was ist was, welsche pumpe ist das?
Ich schreibe jetzt mir immer Kommentare, ist mir schon Passiert das habe vergessen was ist was, in alten Programmen, auch wenn ich die Altlasten ;) anfasse wird kommentiert sofort.
Bernhard - Fony
Beiträge: 73
Registriert: Mo 12. Jun 2023, 17:49
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Bernhard - Fony »

Code: Alles auswählen

const unsigned char One_Wire_Bus = 2;
Sollte nicht normaler Byte sein?
Ein Pin ist doch kein Zeichen.
Wenn irgend wann der Compiler sich ändert nimmt er das nicht an.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Admin »

Die Drehzahl über die Solldrehzahl einstellen ist in dem Programm der richtige oder "normale Weg". Dann wird überprüft, ob Sollalt größer Solldrehzahl ist, wenn ja wird einfach die neue Solldrehzahl übernommen. Ist aber die Solldrehzahl größer als Sollalt, dann wird die Drehzahl langsamm erhöht, in Zehnerschritten. Denn ich hatte vorher einen 10 Ampere Solar-Regler, der hat es nicht verkraftet, wenn ich die Pumpe von 0 auf 255 in einem Schritt beschleunigt habe. Das Problem habe ich bei dem 20A Regler nicht mehr, aber habe es jetzt so belassen, weil ich ja nicht weiß, was der Bastler, der es nachbauen will, für einen Regler hat, also wieviel Strom er zur Verfügung hat.
Nur wenn ich als Entlastung der Batterie die Pumpe langsammer laufen lasse, oder sogar ganz abschalte, greife ich direkt auf "Drehzahl" zu. Das ist diese "Ausnahme". Da das direkt vor der Übergabe an den Motorregler ist, kann das immer für Pumpe langsam, oder auch für aus sorgen, egal was das Programm will. Das ist so eine Art Notlauf, weil die Batterie zur Neige geht. Wenn ich die Pumpe wieder auf Vollgas fahren will, Weil die Batterie wieder Power hat, mache ich das wieder über die Solldrehzahl, wo wieder langsam Gas gegeben wird, also das ist schon alles OK.

LPWM lasse ich immer auf "0", weil das der Rückwärtslauf ist. Und die Pumpe Rückwärts ist nicht so gut. Das könnte ich eigentlich auch löschen. Werde ich auch machen.

Aber

Code: Alles auswählen

"const unsigned char One_Wire_Bus = 2;
ist tatsächlich Schwachsinn. Das habe ich von irgendwo einfach kopiert und ungesehen übernommen :(o): :(o):
Ich habe es oben im Programm gleich geändert auf:

Code: Alles auswählen

#define One_Wire_Bus 2  // Sensor auf Pin 2
Da muss ich mal einige Programme von mir kontrollieren, wo ich diesen Unsinn überall einfach übernommen habe.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Admin »

Also diesen Mist mit:

Code: Alles auswählen

const unsigned char One_Wire_Bus = 2;
Habe ich schon in einem DS18B20 Testprogramm gemacht. Und da ich einige Teile wie eben "DallasTemperature" immer kopiere, durch viele Programme immer falsch weiterkopiert. :(o): Und da es funktioniert, obwohl es Schwachsinn ist, habe ich es nie gemerkt. :(o):

Habe jetzt mal zurückverfolgt. Den Fehler schleppe ich jetzt schon seit 26.05.2021 mit :oops: :oops: Da habe ich ein paar Grundprogramme oder Musterprogramme erstellt, die ich zum schnellen zusammen - kopieren verwende. Da war diese Zeile noch auskommentiert, aber schon vorhanden. Wo diese Zeile herkommt, keine Ahnung :???:

Franz :eek:
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Admin »

Bernhard - Fony hat geschrieben: Sa 29. Jul 2023, 19:01

Code: Alles auswählen

 pinMode(RPWM, OUTPUT);              // PWM Pumpensteuerung
  pinMode(LPWM, OUTPUT);              // PWM Pumpensteuerung
Das verstehe nicht was ist was, welsche pumpe ist das?
Ich schreibe jetzt mir immer Kommentare, ist mir schon Passiert das habe vergessen was ist was, in alten Programmen, auch wenn ich die Altlasten ;) anfasse wird kommentiert sofort.
Das ist die Pumpe vorwärts über PWM, und die Pumpe rückwärts über PWM. Wenn man die Pumpe falsch angeschossen hat, könnte man den "Drehzahl" Wert einfach auf den anderen PWM Eingang geben, dann läuft die Pumpe wieder richtig. :(oo): Deshalb habe ich das im Programm belassen. Eine Tauchpumpe rückwärts ist natürlich nicht so gut, weil sie dann kein Wasser einsaugen kann, also auch keine Kühlung hat. Man sollte also die Pumpe in einen Eimer mit Wasser stellen, und von der Steuerung einschalten lassen. Dann kommt entweder sofort das Wasser oben rausgeschossen, dann stimmt die Richtung, oder eben nicht, dann sofort ausschalten und umpolen, oder den anderen Eingang am Motor-Treiber benutzen. Eben den RPWM oder den LPWM.
Bernhard - Fony
Beiträge: 73
Registriert: Mo 12. Jun 2023, 17:49
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Bernhard - Fony »

Habe ich schon in einem DS18B20 Testprogramm gemacht. Und da ich einige Teile wie eben "DallasTemperature" immer kopiere, durch viele Programme immer falsch weiterkopiert. :(o): Und da es funktioniert, obwohl es Schwachsinn ist, habe ich es nie gemerkt. :(o):
Du bist nicht der einziger :lol: mache auch so, spart viel Zeit und Denken :)
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Poolwasser mit der Sonne aufheizen.

Beitrag von Admin »

So jetzt ist das ganze eigentlich fertig. Ich habe auch die erste Programm-Version über Beta hinaus. Die Anzeige habe ich nochmal überarbeitet. In der oberen Zeile ist jetzt nicht mehr so unwichtiges Zeug wie "Pool-Solarheizung", sondern der aktuelle Ladezustand des Akkus.
.
Solarheizung02_08_23.jpg
Solarheizung02_08_23.jpg (704.69 KiB) 401 mal betrachtet
Und das aktuelle Programm ist:

Code: Alles auswählen

// Arduino Pool_Solarheizung_Pumpensteuerung mit MPPT Kontrolle
#include <OneWire.h>
#include <DallasTemperature.h>
#include "Wire.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//###########################################################################
//-------------------------------------MPPT Regler Deklaration---------------
/*************************************
   Für Uno wird SoftwareSerial benutzt
**************************************/
#include <SoftwareSerial.h>
SoftwareSerial tracerSerial(9, 8); // RO, DI  Pins drehen wenn nicht funktioniert
/**********************************************
    Ich verwende  einen MAX485-kompatiblen RS485-Transceiver.
  Rx/Tx ist mit der seriellen Schnittstelle der Hardware an "Serial" verbunden.
  Die Pins "Data Enable" und "Rec3eiver Enable" sind wie folgt beschaltet:
 ********************************************************/
#include <ModbusMaster.h>

#define MAX485_DE      7 // DE und RE dürfen am einen Pin hängen 
#define MAX485_RE_NEG  7

// instantiate ModbusMaster object
ModbusMaster node;

int prozent = 0;
float akkuVolt = 0;
float akkuAmpere = 0;
float pvwat = 0;
float pva = 0;
float pvv = 0;
unsigned long currentMillis = 0;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}
unsigned long previousMillis = 0;
const long intervall = 60000;// Daten werden alle 60 Sek ausgelesen
//------------------------------------MPPT Regler Deklaration Ende-----------
//###########################################################################
//-----Motortreiber----
const byte RPWM = 10;
const byte LPWM = 11;
//-------Potis---------
const byte Poti1 = A0;
const byte Poti2 = A1;
//-------Taster--------
byte Tasterstatur = 0;
const byte Taster = 4;// Display einschalten !!
//-------Merker--------
byte Pumpe = 0;
int P1 = 0;
int P2 = 0;
byte Pool = 1; // Hier 1 oder 2 tauschen mit Solar, wenn Sensoren vertauscht
byte Solar = 2; // Hier 1 oder 2 tauschen mit Pool, wenn Sensoren vertauscht
int Drehzahl = 0;
int Solldrehzahl = 0;
int Sollalt = 10;
byte Anfahren = 0;
int Drehzahlmin = 150;
int Drehzahlmax = 255;
unsigned long millisekunden = 0;
//-------------------------------Zeiten---------------------------------------
unsigned long Sekundenablauf01 = 0;      // Messung Potis und Ausgabe Display
const unsigned long Pausezeit01 = 1000;
//------------------------------------------------------------------------------
unsigned long Sekundenablauf02 = 0;      // Display nach Zeit ausschalten
const unsigned long Pausezeit02 = 60000 * 15;
//------------------------------------------------------------------------------
unsigned long Sekundenablauf03 = 0;      //Serial Werte Ausgabezeit
const unsigned long Pausezeit03 = 60000 * 5;
//------------------------------------------------------------------------------
unsigned long Sekundenablauf04 = 0;      // Werte für Pumpe und Pumpe ansteuern
const unsigned long Pausezeit04 = 30000; //Alle 30 Sekunden Daten für Pumpe
//------------------------------------------------------------------------------
#define One_Wire_Bus 2  // Sensor auf Pin 2
OneWire oneWire(One_Wire_Bus);
DallasTemperature sensoren (&oneWire);
int Anzahl_Sensoren = 0;
int is = 0; // Zähler für die Sensoren
int ia = 0; // Zähler für die Adressstellen 0-7
int Sensor = 0;
float temppool = 0;
float tempsolar = 0;
float tempdif = 0;
DeviceAddress tempDeviceAddress; // Für die Adressausgabe
int numberOfDevices; // Für die Adressausgabe
//##########################################################################
//################################  Setup ##################################
//##########################################################################
void setup() {
  Wire.begin();
  sensoren.begin();
  Serial.begin(9600);
  lcd.begin();
  lcd.backlight();
  //##########################################################################
  //-----------------------------------MPPT Setup-----------------------------
  tracerSerial.begin(115200); // Modbus Kommunikation mit 115200 Baud
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  digitalWrite(MAX485_RE_NEG, 0);// Init in receive mode
  digitalWrite(MAX485_DE, 0);
  // Tracer xxxxAN Modbus slave ID 1
  node.begin(1, tracerSerial);  // Begin der Verbindung mit Tracer
  // Rückrufe ermöglichen es uns, den RS485-Transceiver korrekt zu konfigurieren
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  //-------------------------------MPPT Setup Ende--------------------------
  //##########################################################################
  lcd.setCursor (0, 1);
  lcd.print (F("Soll"));
  lcd.setCursor (10, 1);
  lcd.print (F("Ist"));
  lcd.setCursor (0, 2);
  lcd.print (F("Soll"));
  lcd.setCursor (10, 2);
  lcd.print (F("Ist"));
  lcd.setCursor (0, 3);
  lcd.print (F("Soll      Ist"));
  // Anzahl der Sesoren ermitteln-------------------------------------
  Anzahl_Sensoren = sensoren.getDeviceCount();
  // Ermitteln der Sensor-Adressen------------------------------------
  for (is = 0; is < Anzahl_Sensoren; is++)
  {
    if (sensoren.getAddress(tempDeviceAddress, is))
    {
      Serial.println ();
      printAddress(tempDeviceAddress);
    }
  }
  //-----------Aus-/Eingänge einrichten-------------------------------------
  pinMode(RPWM, OUTPUT);              // PWM rechts Pumpensteuerung
  pinMode(LPWM, OUTPUT);              // PWM links Pumpensteuerung
  pinMode(Poti1, INPUT);              // Pool Solltemperatur
  pinMode(Poti2, INPUT);              // Differenz Solltemperatur
  pinMode(Taster, INPUT_PULLUP);      // Taster Display einschalten
  //Display einschalten
  Sekundenablauf02 = millisekunden;
}
// Ausgabe der Sensor-Adressen
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t ia = 0; ia < 8; ia++)
  {
    if (deviceAddress[ia] < 16)
    {
      Serial.print("0"); //ist die Hex Adresse kleiner 16 dann erste Stelle eine "0"
    }
    Serial.print(deviceAddress[ia], HEX);
  }
  Serial.println();
}
//###########################################################################
//################################## LOOP ###################################
//###########################################################################
void loop()
{
  millisekunden = millis();
  //--------------------------Display Lichtkontrolle -------------------------
  Tasterstatur = digitalRead(Taster);
  if (Tasterstatur == LOW)
  {
    lcd.backlight();
    Sekundenablauf02 = millisekunden;
  }
  if (millisekunden - Sekundenablauf02 >= Pausezeit02) // Dislay Zeit abgelaufen?
  {
    lcd.noBacklight();
  }
  //--------------------------Display Licht kontrolle Ende-------------------
  //#########################################################################
  //-------------------------Daten auswerten und aufs Display----------------
  if (millisekunden - Sekundenablauf01 >= Pausezeit01) // Eine Sekunde abgelaufen?
  {
    P1 = analogRead (Poti1);
    P1 = map(P1, 0, 1023, 0, 40); // -------Solltemperatur Einstellung-------
    P2 = analogRead (Poti2);
    P2 = map(P2, 0, 1023, 0, 10); // -------Solldiffderenz Einstellung-------
    lcd.setCursor (5, 1);
    lcd.print (P1);
    lcd.print (F("  "));
    lcd.setCursor (5, 2);
    lcd.print (P2);
    lcd.print (F("  "));
    lcd.setCursor (5, 3);
    lcd.print (Solldrehzahl);
    lcd.print (F("  "));
    lcd.setCursor (14, 3);
    lcd.print (Drehzahl);
    lcd.print (F("  "));
    Sekundenablauf01 = millisekunden;
    // -------------------------Temperatur Sensoren Auswerten---------------------------
    //Temperaturen Aulesen
    sensoren.requestTemperatures();

    // Hier werden die Temp-Sensoren ausgelesen und aufs Display gebracht
    if (Sensor < 2)
    {
      Sensor ++;
      float temperatur = sensoren.getTempCByIndex(Sensor - 1);
      if (Sensor == Pool)
      {
        tempsolar = temperatur; // -----------Temperatur Messung 1------------------
      }
      if (Sensor == Solar)
      {
        temppool = temperatur - 1; // -----------Temperatur Messung 2------------------
        //--------------------------------------Temperatur aufs Display----------------
        lcd.setCursor (14, 1);
        lcd.print (temppool);
        lcd.print (F(" "));
        tempdif = (tempsolar * 10) - (temppool * 10); //---Themperatur Differenz----
        if (tempdif < 0)
        {
          tempdif = 5;
        }
        lcd.setCursor (14, 2);
        lcd.print (tempdif / 10);
        lcd.print (F(" "));
      }
    }
    // ---Alle Sensoren ausgelesen? Dann für nächste Messungen auf Null Stellen---
    if (Sensor == Anzahl_Sensoren)
    {
      Sensor = 0;
    }
  }
  //-------------------------Daten auslesen und Aufs Diplay Ende------------------
  //##############################################################################
  // ------Daten für Pumpensteuerung auswerten und an Pumpe übergeben-------------

  if (millisekunden - Sekundenablauf04 >= Pausezeit04) // 30 Sekunden abgelaufen?
  {
    /*
       Prüfen ob Solartemperatur zum Anlauf der Pumpe sinnvoll ist, obwohl noch
       keine Differenz-Temperatur vorhanden ist, da die Schläuche noch nicht mit
       Wasser gefüllt sind. Wenn genug Wärme am Dach vorhanden ist, wird Differenz
       einfach vorausgesetzt und die Pumpe angefahren. Sind dann die Schläuche
       gefüllt, ist die Differenz höher und ist kein Thema mehr.
    */
    if ((tempsolar > 28) && (tempdif < 10))
    {
      tempdif = 10;
    }
    /*
       Geht die Temperatur am dach wieder zurück und die Differenz ist immer
       noch unter ein Grad, dann wird der Anlauf wieder abgebrochen.
    */
    if ((tempsolar < 26) && (tempdif < 10))
    {
      tempdif = 0;
    }
    //-------------Solldrehzahl aus Temperaturdifferenz ermitteln--------------
    Solldrehzahl = map(tempdif, 10, 40, 150, 255);
    if (Solldrehzahl > Drehzahlmax)
    {
      Solldrehzahl = Drehzahlmax;
    }
    else
    {
      if (Solldrehzahl < Drehzahlmin)
      {
        Solldrehzahl = Drehzahlmin;
      }
    }
    // Ist gemessene tempdif gleich/größer Solldifferenz, dann Max Drehzahl
    if (tempdif >= (P2 * 10))
    {
      Solldrehzahl = Drehzahlmax;
    }
    //------------------Pumpen Ansteuerung------------------------------------
    // Gibt es keine brauchbare TemperaturDifferenz mehr, dann Pumpe auf PWM 0
    if (Anfahren == 0)
    {
      if (tempdif < 10) //---Temp.Differenz kleiner 1 Grad, dann Pumpe aus----
      {
        Solldrehzahl = 0;
      }
      // Ist aber die Wunsch-Temperatur +2 erreicht, dann keine Solar Unterstützung mehr
      if ((temppool > (P1 + 2)) && (tempdif > 20))
      {
        Solldrehzahl = 0;
      }
      // Ist Solldrehzahl erreicht ? Dann Drehzahl auf die Solldrehzahl einstellen
      if (Solldrehzahl < Sollalt)
      {
        Drehzahl = Solldrehzahl;
        Sollalt = Solldrehzahl;
      }
    }
    // Ist Solldrehzahl nicht erreicht dann Drehzahl um 10 erhöhen
    if ((Solldrehzahl > Sollalt) && (tempdif > 13))
    {
      if (Drehzahl < 120)
      {
        Drehzahl = 130;
      }
      Drehzahl = Drehzahl + 10;
      // Wenn über Max, dann die Drehzahl auf Maxdrehzahl anpassen
      if (Drehzahl > Drehzahlmax)
      {
        Drehzahl = Drehzahlmax;
      }
      Sollalt = Drehzahl;
      Anfahren = 1;
    }
    else
    {
      Anfahren = 0;
    }
    /*
      Hier wird geprüft, ob die Batterie noch genug Leistung hat.
      Ist sie schon schwach geht die pume auf weniger Leistung zurück.
      Das ist dann Drehzahl "150", also PWM Wert 150.
      Ist die Batterie schon sehr leer, geht die Drehzahl auf "0", dass
      die Batterie nicht zu tief enladen wird. Dann wird nur noch
      Leistung für die CPU benötigt.
    */
    if ((prozent <= 50) && (prozent > 0) && (tempdif > 12))
    {
      Drehzahl = 150;
    }
    if ((prozent <= 35) && (prozent > 0))
    {
      Drehzahl = 0;
    }
    /*
       Ist die Leistung der Batterie wieder im grünen Bereich und die
       TemperaturDifferenz des Wassers wieder hoch genug, ist davon
       auszugehen, dass wieder genug Sonne vorhanden ist, und somit
       die Pumpe wieder mit Vollgas betrieben werden darf.
    */
    if ((prozent > 60) && ((tempdif / 10) > P2))
    {
      Solldrehzahl = Drehzahlmax;
    }
    analogWrite(RPWM, Drehzahl); // PWM für Pumpe Vorwärts
    analogWrite(LPWM, 0); //Hier muss immer "0" sein, weil Rückwärts nicht gut ist
    Sekundenablauf04 = millisekunden;
  }
  //------------------------Pumpensteuerung Ende-------------------------------
  //###########################################################################
  // ------------------------Serial Print Ausgabe------------------------------
  if (millisekunden - Sekundenablauf03 >= Pausezeit03) // Serial Ausgabezeit abgelaufen?
  {
    /*
      Serial.println(F("---------------------------------"));
      Serial.print(F("Drehzahl Pumpe = "));
      Serial.print(Drehzahl);
      Serial.print(F("  soll = "));
      Serial.println(Solldrehzahl);
      Serial.print(F("Temp Pool = "));
      Serial.println(temppool);
      Serial.print(F("Temp Solar = "));
      Serial.println(tempsolar);
      Serial.print(F("Tempdif = "));
      Serial.print(tempsolar - temppool);
      Serial.print(F("  Soldif = "));
      Serial.println(P2);
      Serial.println(F("---------------------------------"));
      Serial.print(F("Panel "));
      Serial.print(pvv);
      Serial.print(F("V  "));
      Serial.print(pva);
      Serial.print (F("A  "));
      Serial.print(pvwat);
      Serial.println(F("W"));
      Serial.print(F("Akku  "));
      Serial.print(akkuVolt);
      Serial.print (F("V  "));
      Serial.print(akkuAmpere);
      Serial.print(F("A  "));
      Serial.print(prozent);
      Serial.println (F("%"));
      Serial.println (F("---------------------------------"));
    */
    Sekundenablauf03 = millisekunden;
  }
  //-------------------------Seriale Ausgabe Ende-----------------------------
  //##########################################################################
  //-------------------------------MPPT LOOP----------------------------------
  currentMillis = millis();
  if (currentMillis - previousMillis >= intervall)
  {
    previousMillis = currentMillis; // Zeitpunkt der letzten Schaltung wird festgehalten
    // Read 16 registers beginn mit Adresse  0x3100)
    uint8_t result;
    result = node.readInputRegisters(0x3100, 16);
    if (result == node.ku8MBSuccess)
    { //PV Daten
      pvv = node.getResponseBuffer(0x00) / 100.0f; //Tracer PV Volt
      pva = node.getResponseBuffer(0x01) / 100.0f;//PV Ampere
      //PV Leistung
      pvwat = ((node.getResponseBuffer(0x06) +  node.getResponseBuffer(0x07) ) / 100.0f);
      /*****  Akkustand Anzeigen  *****/
      akkuVolt = node.getResponseBuffer(0x04) / 100.0f; //Tracer Akku Volt
      akkuAmpere = node.getResponseBuffer(0x05) / 100.0f;//Akku Ladedaten in Ampere
    }
    result = node.readInputRegisters(0x311A , 1);//Akkukapazität in Prozent
    if (result == node.ku8MBSuccess) {
      prozent = node.getResponseBuffer(0x00);
    }
    lcd.setCursor (0, 0);
    lcd.print(akkuVolt);
    lcd.print (F("V  "));
    lcd.print(akkuAmpere);
    lcd.print (F("A  "));
    lcd.print(prozent);
    lcd.print (F("%  "));
    lcd.setCursor (0, 2);
    lcd.print (F("Soll"));
  }
  //-----------------------------MPPT LOOP Ende-------------------------------
  //##########################################################################
}
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 38 Gäste