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 »

Meine Serial.print() Mitschnitte schauen so aus:

#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 150 soll = 255
Temp Pool = 22.75
Temp Solar = 32.44
Tempdif = 9.69 Soldif = 2
-----------------------------------------------------
Panel 39.20V 0.08A 3.16W
Akku 13.78V 0.23A 100%
-----------------------------------------------------
Motorstrom 0.03 Ampere Drehzahl 150
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 170 soll = 255
Temp Pool = 22.94
Temp Solar = 33.00
Tempdif = 10.06 Soldif = 2
-----------------------------------------------------
Panel 37.50V 0.85A 32.24W
Akku 13.78V 2.34A 100%
-----------------------------------------------------
Motorstrom 1.67 Ampere Drehzahl 170
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 190 soll = 255
Temp Pool = 22.87
Temp Solar = 34.06
Tempdif = 11.19 Soldif = 2
-----------------------------------------------------
Panel 37.50V 0.85A 32.24W
Akku 13.78V 2.34A 100%
-----------------------------------------------------
Motorstrom 3.58 Ampere Drehzahl 190
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 210 soll = 255
Temp Pool = 22.81
Temp Solar = 34.50
Tempdif = 11.69 Soldif = 2
-----------------------------------------------------
Panel 37.56V 0.90A 33.84W
Akku 13.76V 2.46A 100%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 210
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 230 soll = 255
Temp Pool = 22.75
Temp Solar = 34.94
Tempdif = 12.19 Soldif = 2
-----------------------------------------------------
Panel 37.54V 0.89A 33.67W
Akku 13.69V 2.46A 98%
-----------------------------------------------------
Motorstrom 3.48 Ampere Drehzahl 230
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 250 soll = 255
Temp Pool = 22.69
Temp Solar = 35.06
Tempdif = 12.38 Soldif = 2
-----------------------------------------------------
Panel 37.50V 0.94A 35.28W
Akku 13.73V 2.57A 99%
-----------------------------------------------------
Motorstrom 3.38 Ampere Drehzahl 250
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 255 soll = 255
Temp Pool = 22.69
Temp Solar = 34.50
Tempdif = 11.81 Soldif = 2
-----------------------------------------------------
Panel 37.50V 0.94A 35.28W
Akku 13.73V 2.57A 96%
-----------------------------------------------------
Motorstrom 2.16 Ampere Drehzahl 255
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 255 soll = 255
Temp Pool = 22.69
Temp Solar = 33.69
Tempdif = 11.00 Soldif = 2
-----------------------------------------------------
Panel 37.03V 1.08A 40.32W
Akku 13.67V 2.95A 97%
-----------------------------------------------------
Motorstrom 1.76 Ampere Drehzahl 255
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 255 soll = 255
Temp Pool = 22.69
Temp Solar = 33.06
Tempdif = 10.38 Soldif = 2
-----------------------------------------------------
Panel 37.02V 1.08A 40.35W
Akku 13.68V 2.95A 97%
-----------------------------------------------------
Motorstrom 1.98 Ampere Drehzahl 255
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 255 soll = 255
Temp Pool = 22.69
Temp Solar = 32.63
Tempdif = 9.94 Soldif = 2
-----------------------------------------------------
Panel 36.97V 1.07A 39.77W
Akku 13.67V 2.91A 97%
-----------------------------------------------------
Motorstrom 1.99 Ampere Drehzahl 255
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 255 soll = 255
Temp Pool = 22.69
Temp Solar = 32.44
Tempdif = 9.75 Soldif = 2
-----------------------------------------------------
Panel 36.97V 1.07A 39.77W
Akku 13.67V 2.91A 96%
-----------------------------------------------------
Motorstrom 2.45 Ampere Drehzahl 255
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 255 soll = 255
Temp Pool = 22.75
Temp Solar = 32.25
Tempdif = 9.50 Soldif = 2
-----------------------------------------------------
Panel 36.97V 1.07A 39.77W
Akku 13.67V 2.91A 97%
-----------------------------------------------------
Motorstrom 2.06 Ampere Drehzahl 255
Pumpe ein
#################################

Am Abend:

#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 150 soll = 150
Temp Pool = 22.69
Temp Solar = 23.75
Tempdif = 1.06 Soldif = 2
-----------------------------------------------------
Panel 12.31V 0.00A 0.00W
Akku 12.35V 0.00A 46%
-----------------------------------------------------
Motorstrom 0.01 Ampere Drehzahl 150
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 150 soll = 150
Temp Pool = 22.69
Temp Solar = 23.75
Tempdif = 1.06 Soldif = 2
-----------------------------------------------------
Panel 12.30V 0.00A 0.00W
Akku 12.38V 0.00A 48%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 150
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 150 soll = 150
Temp Pool = 22.69
Temp Solar = 23.75
Tempdif = 1.06 Soldif = 2
-----------------------------------------------------
Panel 12.27V 0.00A 0.00W
Akku 12.33V 0.00A 48%
-----------------------------------------------------
Motorstrom 4.89 Ampere Drehzahl 150
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 150 soll = 150
Temp Pool = 22.69
Temp Solar = 23.75
Tempdif = 1.06 Soldif = 2
-----------------------------------------------------
Panel 12.29V 0.00A 0.00W
Akku 12.37V 0.00A 48%
-----------------------------------------------------
Motorstrom 0.01 Ampere Drehzahl 150
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 150 soll = 150
Temp Pool = 22.69
Temp Solar = 23.75
Tempdif = 1.06 Soldif = 2
-----------------------------------------------------
Panel 12.28V 0.00A 0.00W
Akku 12.40V 0.00A 46%
-----------------------------------------------------
Motorstrom 0.01 Ampere Drehzahl 150
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 0 soll = 0
Temp Pool = 22.69
Temp Solar = 23.75
Tempdif = 1.06 Soldif = 2
-----------------------------------------------------
Panel 12.28V 0.00A 0.00W
Akku 12.40V 0.00A 46%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 0
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 0 soll = 150
Temp Pool = 22.62
Temp Solar = 23.56
Tempdif = 0.94 Soldif = 2
-----------------------------------------------------
Panel 12.47V 0.00A 0.00W
Akku 12.56V 0.00A 54%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 0
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 0 soll = 153
Temp Pool = 22.44
Temp Solar = 23.62
Tempdif = 1.19 Soldif = 2
-----------------------------------------------------
Panel 12.47V 0.00A 0.00W
Akku 12.59V 0.00A 55%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 0
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 150 soll = 167
Temp Pool = 22.19
Temp Solar = 23.69
Tempdif = 1.50 Soldif = 2
-----------------------------------------------------
Panel 12.47V 0.00A 0.00W
Akku 12.59V 0.00A 55%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 150
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 150 soll = 157
Temp Pool = 22.25
Temp Solar = 23.50
Tempdif = 1.25 Soldif = 2
-----------------------------------------------------
Panel 12.47V 0.00A 0.00W
Akku 12.59V 0.00A 46%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 150
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 0 soll = 0
Temp Pool = 22.44
Temp Solar = 23.31
Tempdif = 0.88 Soldif = 2
-----------------------------------------------------
Panel 12.47V 0.00A 0.00W
Akku 12.59V 0.00A 47%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 0
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 0 soll = 0
Temp Pool = 22.50
Temp Solar = 23.25
Tempdif = 0.75 Soldif = 2
-----------------------------------------------------
Panel 12.29V 0.00A 0.00W
Akku 12.57V 0.00A 55%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 0
Pumpe ein
#################################
-----------------------------------------------------
Drehzahl Pumpe ist = 0 soll = 0
Temp Pool = 22.37
Temp Solar = 23.25
Tempdif = 0.88 Soldif = 2
-----------------------------------------------------
Panel 11.42V 0.00A 0.00W
Akku 12.60V 0.00A 56%
-----------------------------------------------------
Motorstrom 0.00 Ampere Drehzahl 0
Pumpe ein
#################################

Man sieht, das war kein Ertragreicher Tag, weil er nur gut angefangen hat, dann in ein Gewitter übergegangen ist und dann die Sonne die meiste Zeit hinter den Wolken war. Das waren als 95 Seiten Mitschnitt, eines beschissenen Tages. Jedenfalls für die Solarheizung, beschissen, weil ohen Erfolg. :(o): :(o):

Ich hatte auch schon 2-3 Gute Tage, wo ich das Wasser von so 21 Grad auch 24 Grad hoch gebracht habe, was ohne die Solarheizung nie erreicht wurde. Aber in den Nächte sind zur Zeit die Luft-Temperaturen immer wieder runter bis 14-16 Grad, und haben den Pool wieder mächtig runtergekühlt. Ist schon ein seltener "Sommer". :sad: :sad:


Die waren jede Minute, so entstand dann 95 Seiten Text. :O:
Ist viel Text, aber auch eine gute Möglichkeit, den ganzen Ablauf schön zu sehen. Also am Anfang überprüfen, ob die Steuerung zum richtigen Zeitpunkt, mit dem richtigen Grund, die Pumpe mit welcher Geschwindigkeit startet. Die Temperatur-Differenz zwischen Poolwasser und Solarwasser zu beurteilen. Die Ladung der Batterie im Auge zu haben, die Arbeit dess SolarPanels auch im Auge zu haben, den Stromverbrauch der Pumpe. u.v.m. Und am Abend sieht man dann den Grund für die Abschaltung der Pumpe. Das kann einmal die Temperatur-Differenz sein, die unter 1 Grad geht, oder zum zweiten der Ladezustand der Batterie unter 35%, weil die Sonne am Abend am SolarPanel schon einige Zeit nichts mehr bringt. Wenn die Lufttemperatur noch die Solarwassertaschen warm hält, geht irgendwann die Batterie in die Knie, Wenn die Solar-Wassertaschen keine Wärme mehr kriegen, dann ist eben die Temperatur-Differenz zwischen Poolwasser und dem am Dach Solarerwärmten Wasser unter 1 Gad, dann ist auch Schluss.

Übrigens sieht man hier, dass die Strommessung am Motortreiber nicht so toll ist. Solange die Pumpe nicht mit PWM-255 läuft, ist die Stromangabe ein Witz. Wenn ich die Spannung am X_IS Punkt auslese, wenn PWM gerade im Nulldurchgang ist, habe ich "Motorstrom 0,00 Ampere", wenn ich den Wert für den Stromverbrauch gerade am Beginn des pos. Impulses auslese, habe ich z.B. schon mal 5,40 Ampere, wenn ich bei PWM 255 Strom auslese ist der Wert auch recht verschieden. So 1,8 bis 2,6 Ampere. Mit dem Ampermeter ist der Stron bei 255 PWM 2,4 Ampere. Also dieser Stromwert, ist nur eine Hausnummer, um zu überprüfen, ob die Pumpe vielleicht blockkiert, dann kommt irgendwann mal ein zu hoher Strom, der für die dauerhafte Abschaltung der Pumpe sorgt. Wenn im Serial.print() "Pumpe aus steht, anstelle von "Pumpe ein" dann ist diese Notabschaltung wegen Überstrom eingetreten. Dann geht die Pumpe nur wieder in Betrieb, wenn man einen Neustart, also einen Reset macht.
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 »

Heute bin ich mit meiner Poolheizung schon mal auf fast 26 Grad gekommen, bei 42.000 Liter, 1,6 Meter tief schon eine Aufgabe. Natürlich ist die Solarheizung nur eine Erweiterung der Poolfläche. Also die Sonne heizt ja auch den Pool direkt. Aber im den letzten beiden Jahren hatten wir 18 - 21 Grad maximal Ergebnis. Da war ich in den beiden Jahren nur insgesammt 3x im Pool, jeweils für 5-10 Minuten :sad:. Heute war ich alleine an dem Tag 3x im Pool für jeweils 15-30 Minuten, gestern 2x. Da macht mir das Schwimmen Spass, ich bin ja ein sogenannter "Warmduscher" :lol:. Ich habe nur immer wieder das Problem, dass in diesem "Sommer" die Nachtabsenkung der Lufttemperatur schon sehr grass ist. Zwischen 13 und 18 Grad Lufttemperatur zieht mir jede Nacht 3-4 Grad Wärme aus dem Pool. Am Tag schaffe ich immer wieder größer 24 Grad, bis heute, fast 26 Gad, und am nächsten Morgen habe ich wieder eine Starttemperatur von 20,5 bis 22 Grad. So eine Solarheizung kann natürlich nicht zaubern. Wenn man jeden Morgen wieder feststellen muss, dass von der Wärme des Vortages nicht übrig ist, bekommt man schon ein wenig Frust. Aber die letzten zwei Tage konnte ich jedenfalls am Nachmittag schon lange im Pool bleiben. Man könnte natürlich noch über Nacht eine Thermo- Schwimmplane auf den Pool legen. Aber die kostet mit der Aufrollvorrichtung auch wieder 900,- Euro für einen Pool in der Größe. :???: Vielleicht schauen wir mal, ob es eine Anleitung für eine Gelddruck-Maschine, für den Arduino gibt :(V):

Franz
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 »

Ich habe heute Abend mal das Programm rund um die Pumpensteuerung überarbeitet. Ich habe in dem Teil Pumpensteuerung zu oft was reingeschrieben, um an einigen Stellschrauben zu arbeiten, bis es unübersichtlich wurde. Dann hatte ich Fehler im Programm, so dass z.B. um 23:00 Uhr Abends die Pumpe eingeschalten war, obwohl da ja garantiert die letzte Sonne weg war, keine Tempdifferenz mehr da war und die Batterie schon unter 40% kam. Da hat mich nur noch der Laderegler gerettet, weil der keine Tiefentladung zu lässt.Der hat dann der Steuerung die Spannung abgeschalten.

Aber das Programm muss sicher seine Arbeit tun. Deshalb habe ich den Teil, indem die Pumpe gesteuert wird, nochmal komplett neu gemacht. Ich teste das neue Programm übers Wochenende und wenn ich es klar habe, stelle ich es wieder hier rein.

Servus
Franz :(V):
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 »

Der erste Test heute mit dem geänderten Programm ist gut verlaufen. Alles wie erwartet. Mal schauen was es Morgen Früh so sagt. Jetzt ist die Pumpensteuerung wieder übersichtlich. Aber macht das Wesentliche, das ich inzwischen für wichtig und richtig befunden habe.

Am Sonntag werde ich wohl alles so weit getestet haben. Dann hänge ich die aktuelle Version wieder hier rein.

Servus
Franz
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 »

Ich habe keinen Fehler mehr entdeckt. Der Teil Pumpensteuerung ist ziehmlich abgespeckt, auf das wesentliche, aber hat was es braucht. Hier ist mal das aktuelle Programm. VERGESST BITTE DIE PROGRAMME DAVOR. Die hatten seltsamme Fehlfunktionen.

Code: Alles auswählen

/*
   Arduino Pool_Solarheizung_Pumpensteuerung mit MPPT Kontrolle
   V1.0 ist Erweiterung vom 18.09.23 Strommessung am Motor und neue Pumpensteuerung
*/
#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;
const byte R_Amp = A2;
//-------Taster--------
byte Tasterstatur = 0;
const byte Taster = 4;// Display einschalten !!
//-------Merker--------
byte Pumpe = 1;
int P1 = 0;
int P2 = 0;
// Derzeit Pool=1 und Solar=2
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 Drehzahlmin = 150;
int Drehzahlmax = 255;
float Motorstrom = 0;
byte Stromgrenze = 10;
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 = 60000; //Alle 60 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(R_Amp, INPUT);              // Strommessung Motor
  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();
  //----------------------- Motorstrom auf überlasst prüfen --------------------
  /*
    Wenn Pumpe auf "0" geht, kann man die Pumpe nur durch Programmneustart
    wieder einschalten, weil die Pumpe offenbar blockiert und dadurch zuviel
    Strom braucht.
  */
  Motorstrom = analogRead (R_Amp);
  Motorstrom = (Motorstrom * 4) / 320;
  if (Motorstrom > Stromgrenze)
  {
    Serial.println(F("#############################################"));
    Serial.print(F("Motorstrom "));
    Serial.print(Motorstrom);
    Serial.print(F(" Ampere"));
    Serial.print(F("  Drehzahl "));
    Serial.println(Drehzahl);
    Serial.println(F("#############################################"));
    Pumpe = 0;
    Drehzahl = 0;
    analogWrite(RPWM, Drehzahl); // Pumpe Notaus
  }
  //--------------------------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?
  {
    if ((prozent > 70) && (tempsolar >= 23))
    {
      //-Solldrehzahl aus Temperaturdifferenz und Solldifferenz ermitteln---------
      Solldrehzahl = map(tempdif, 10, (P2 * 10), 150, 255);
      if (Solldrehzahl > Drehzahlmax)
      {
        Solldrehzahl = Drehzahlmax;
      }
      else if (Solldrehzahl < Drehzahlmin)
      {
        Solldrehzahl = Drehzahlmin;
      }

    }
    //--------Batterie unter 60 Prozent, dann Pumpe auf halb-----------------
    if ((prozent < 60) && (tempsolar >= 23))
    {
      Solldrehzahl = Drehzahlmin;
    }
    //--------Batterie unter 50 Prozent, dann Pumpe aus----------------------
    if ((prozent < 50)||(tempdif < 10))
    {
      Solldrehzahl = 0;
    }
    // Ist aber die Wunsch-Temperatur +1 erreicht, dann keine Solar Unterstützung mehr
    if (temppool > (P1 + 1))
    {
      Solldrehzahl = 0;
    }
    if (Pumpe == 0)
    {
      Solldrehzahl = 0;
    }
    //--------Drehzahlausgabe an die Pumpe----------------------------------------
    Drehzahl = Solldrehzahl;
    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 ist = "));
    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("-------------------------------------"));
    Serial.print(F("Motorstrom "));
    Serial.print(Motorstrom);
    Serial.print(F(" Ampere"));
    Serial.print(F("  Drehzahl "));
    Serial.println(Drehzahl);
    if (Pumpe == 1)
    {
      Serial.println(F("Pumpe ein "));
    }
    else
    {
      Serial.println(F("!!!!!!! Pumpe aus !!!!!!!"));
    }
    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-------------------------------
  //##########################################################################
}
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 »

Ich habe das Programm noch ein wenig erweitert. Bis der Solarsensor die Sonne abbekommt, das dauert zu dieser Jahreszeit hier in unserer Lage bis Mittags nach 12:00 Uhr. Aber ein Teil der Solarwassertaschen hat bereits vor 12:00 Uhr kräftige Sonne. Und das Solarpanel das die Betriebsspannung erzeugt, hat auch schon wesentlich früher volle Sonne. Da meine Steuerung ja auch mit dem MPPT-Solar-Laderegler kommuniziert, habe ich auch Zugriff auf die Paneldaten und die Batteriedaten. Also habe ich einfach das Programm erweitert, das jetzt auch testet, ob das SolarPanel schon volle Spannung (36-40 Volt) produziert und ob die Batterie bereits wieder 100% aufgeladen ist. Diese beiden Werte sagen ja, dass schon volle Sonne an Teilen des Daches ist. Wenn also diese beiden Werte schon voll zur Verfügung stehen, aber die Solartemperatur am Sensor noch für einen Start der Anlage zu niedrig ist, schalte ich die Pumpe für 5 Minuten ein. In diesen 5 Minuten wird das Wasser übers Dach gepumpt, und wenn ein Teil des Daches bereits volle Sonne hat, bekommt der Solarsensor diese Wärme über das Wasser zugetragen. Die Differenz zwischen den Poolwasser und dem Solarwasser am Dach wird somit von der Steuerung erkannt, und der normale Regelkreislauf geht los. Sollte sich das in den 5 Minuten noch nicht einstellen, weil die Sonne noch gar nicht an den Solarwassertaschen angekommen ist, wird die Pumpe nach den 5 Min. wieder abgeschalten und eine Wartezeit von 30 Minunten startet. Nach 30 Minunten, gehen wieder die 5 Minunten an den Start, und der Testlauf beginnt von vorne. Damit bekomme ich die Heizung etwa eine Std. eher an den Start. Ich muss mal die nächsten Sonnigen Tage abwarten, dann kommt die Bewärungsprobe des neuen Programmteiles. Wenn es gut läuft stelle ich es hier zusätzlich rein. In Lagen, wo das Solarpanel nicht zuerst mit Sonne versorgt ist, braucht man diesen Teil nicht, aber er stört auch nicht. Also kann man auf jeden Fall das erweiterte Programm benutzen. Aber wie gesagt, ich möchte es noch testen.

Servus
Franz
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 ist mal das erweiterte Programm. Es ist noch in der Testphase, aber ich denke es passt.

Code: Alles auswählen

/*
   Arduino Pool_Solarheizung_Pumpensteuerung mit MPPT Kontrolle
   V1.1 ist Erweiterung vom 23.09.23 Strommessung am Motor
   Neue Pumpenkontrolle plus Anlaufhilfe über Panelspannung
*/
#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;
const byte R_Amp = A2;
//-------Taster--------
byte Tasterstatur = 0;
const byte Taster = 4;// Display einschalten !!
//-------Merker--------
byte Pumpe = 1;
int P1 = 0;
int P2 = 0;
// Derzeit Pool=2 und Solar=1
byte Pool = 2; // Hier 1 oder 2 tauschen mit Solar, wenn Sensoren vertauscht
byte Solar = 1; // 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;
float Motorstrom = 0;
byte Stromgrenze = 10;
byte testzeit = 0;
byte testlauf = 0;

unsigned long millisekunden = 0;
//-------------------------------Zeiten---------------------------------------
unsigned long Sekundenablauf01 = 0;      // Messung alle Werte 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 = 60000; //Alle 60 Sekunden Daten für Pumpe
//------------------------------------------------------------------------------
unsigned long Sekundenablauf05 = 0;      // 5 Minuten Testlauf der Pumpe
const unsigned long Pausezeit05 = 60000 * 5; // Kontrolle ob schon genug Sonne
//------------------------------------------------------------------------------
unsigned long Sekundenablauf06 = 0;      // 30 Minuten Testlauf der Pumpe Pause
const unsigned long Pausezeit06 = 60000 * 30; // Nach Kontrolle ob schon genug Sonne
//------------------------------------------------------------------------------
#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(R_Amp, INPUT);              // Strommessung Motor
  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();
  //----------------------- Motorstrom auf überlasst prüfen --------------------
  /*
    Wenn Pumpe auf "0" geht, kann man die Pumpe nur durch Programmneustart
    wieder einschalten, weil die Pumpe offenbar blockiert und dadurch zuviel
    Strom braucht.
  */
  Motorstrom = analogRead (R_Amp);
  Motorstrom = (Motorstrom * 4) / 320;
  if (Motorstrom > Stromgrenze)
  {
    Serial.println(F("#############################################"));
    Serial.print(F("Motorstrom "));
    Serial.print(Motorstrom);
    Serial.print(F(" Ampere"));
    Serial.print(F("  Drehzahl "));
    Serial.println(Drehzahl);
    Serial.println(F("#############################################"));
    Pumpe = 0;
    Drehzahl = 0;
    analogWrite(RPWM, Drehzahl); // Pumpe Notaus
  }
  //--------------------------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 == Solar)
      {
        tempsolar = temperatur; // -----------Temperatur Messung 1------------------
      }
      if (Sensor == Pool)
      {
        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------------------
  //##############################################################################
  /* Über Panelspannung und Batterie Ladezustand 5 Minuten Pumpe starten
     um zu testen ob am Dach schon genügend Solarwärme vorhanden ist.
     Wenn der Dachsensor noch nicht genug Sonne hat, aber pvv > 45 Volt 
     und Batterieladung > 95% ist.
  */
  // Alle 30 Minunten für 5 Minunten Testlauf, ob schon genug wärme am Solardach ist.
  if ((millisekunden - Sekundenablauf06 >= Pausezeit06)) // 30 Minunten abgelaufen?
  {
    if (testzeit = 0)// --------Ist gerade kein Testlauf aktiv? ------------------
    {
      if ((pvv >= 35) && (prozent >= 95) && (tempsolar >= 19) && (tempsolar <= 22))
      {
        // Wenn Voraussetzungen für einen Testlauf gegeben sind.
        testzeit = 1;
        Serial.println("Testzeit eingeschalten");
      }
    }
    if ((pvv < 33) && (prozent < 90) && (tempsolar >= 23) && (testzeit == 1))
    {
      // Wenn Voraussetzungen für einen Testlauf nicht mehr gegeben sind
      testzeit = 0;
      testlauf = 0;
      Serial.println("Testzeit + Testzeit ausgeschalten");
    }

    if ((testzeit == 1) && (testlauf == 0))
    {
      // Wenn Testlauf für 5 Minunten starten soll
      testlauf = 1;
      Serial.println("Testlauf eingeschalten");
      Sekundenablauf05 = millisekunden;
    }
    if ((millisekunden - Sekundenablauf05 >= Pausezeit05) && (testlauf = 1)) // 5 Minunten abgelaufen?
    {
      // Wenn der Testlauf für 5 Minunten abgelaufen ist
      testzeit = 0;
      testlauf = 0;
      Sekundenablauf06 = millisekunden;  // 30 Minuten Testunterbrechung
      Serial.println("Testzeit + Testzeit nach 5 Minuten ausgeschalten");
    }
  }
  //-----------------------Pumpentestlauf Ende------------------------------------
  //##############################################################################
  // ------Daten für Pumpensteuerung auswerten und an Pumpe übergeben-------------

  if (millisekunden - Sekundenablauf04 >= Pausezeit04) // 30 Sekunden abgelaufen?
  {
    if ((prozent > 70) && (tempsolar >= 23))
    {
      //-Solldrehzahl aus Temperaturdifferenz und Solldifferenz ermitteln---------
      Solldrehzahl = map(tempdif, 10, (P2 * 10), 150, 255);
      if (Solldrehzahl > Drehzahlmax)
      {
        Solldrehzahl = Drehzahlmax;
      }
      else if (Solldrehzahl < Drehzahlmin)
      {
        Solldrehzahl = Drehzahlmin;
      }

    }
    //--------Batterie unter 60 Prozent, dann Pumpe auf halb-----------------
    if ((prozent < 60) && (tempsolar >= 23))
    {
      Solldrehzahl = Drehzahlmin;
    }
    //--------Batterie unter 50 Prozent, dann Pumpe aus----------------------
    if ((prozent < 50) || (tempdif < 10))
    {
      Solldrehzahl = 0;
    }
    // Ist aber die Wunsch-Temperatur +1 erreicht, dann keine Solar Unterstützung mehr
    if (temppool > (P1 + 1))
    {
      Solldrehzahl = 0;
    }
    if (Pumpe == 0)
    {
      Solldrehzahl = 0;
    }
    //--------Drehzahlausgabe an die Pumpe----------------------------------------
    if (testlauf == 1) // Ist 5 ein Testlauf für 5 Minunten aktiviert ??
    {
      Solldrehzahl = 255;
    }
    Drehzahl = Solldrehzahl;
    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 ist = "));
        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("-------------------------------------"));
        Serial.print(F("Motorstrom "));
        Serial.print(Motorstrom);
        Serial.print(F(" Ampere"));
        Serial.print(F("  Drehzahl "));
        Serial.println(Drehzahl);
        if (Pumpe == 1)
        {
          Serial.println(F("Pumpe ein "));
        }
        else
        {
          Serial.println(F("!!!!!!! Pumpe aus !!!!!!!"));
        }
        Serial.print(F("Testlauf = "));
        Serial.println(testlauf);
        Serial.print(F("Testzeit = "));
        Serial.println(testzeit);
        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-------------------------------
  //##########################################################################
}
Montag - Dienstag ist wieder tolles Wetter bei uns. Da kann ich nochmal intensiv prüfen. Dann kann ich hoffentlich auch eine Aussage treffen, wieviel früher das System zu heizen beginnt. Ich weiß ja aus meinen letzten Kontrollen, dass ich bei dem Sonnenstand, um diese Jahreszeit, nicht vor etwa 12:30 mit den Beginn der Heizung rechnen kann. Also mit Sonnen am Solarsensor. So kann ich dann auch sehen, wieviel früher die Heizung mit dem Neuen Kontrollsystem, also mit volle Sonne am SolarPanel, und somit volle Batterien, startet. Also Montag oder Dienstag sollte ich es wissen. Und das System wird nur aktiv, wenn die Temperatur am Solarsensor noch nicht für einen normalen Start reicht.

Sevus
Franz
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

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