Relays spielen verrückt

Hi,
ich habe mein Problem mit der einbrechenden Spannung an der Battery seite mit 2 relais gelöst. Diese 2 Relais sollen zwischen Load des Charge Controllers und der Solar Panels schalten.

Wenn die Solar Spannung größer ist als die Batterie Spannung will ich das Load ausgeschalten wird und die Last über das Solar Panel betrieben wird. Damit ermögliche ich das ich die Batterie Laden kann während dessen ich eine Last an dem Ladecontroller hängen habe.

Wenn aber die Batterie Spannung unter die Batterie Spannung fällt soll Load eingeschalten werden.

Die Relais schalten bei einer bestimmten Spannung wie verrückt hin und her, wenn die Solar Spannung unter die Batterie Spannung fällt.

Code:

FInal_Software.ino (25.5 KB)

dominik1313:
Wenn aber die Batterie Spannung unter die Batterie Spannung fällt soll Load eingeschalten werden.

Der Satz ist Unsinn.

Gruß Tommy

dominik1313:
Die Relais schalten bei einer bestimmten Spannung wie verrückt hin und her, wenn die Solar Spannung unter die Batterie Spannung fällt.

Nur ein Schuss ins Blaue:

1 Spannung fällt unter Grenzwert,
2 du schaltest ein,
3 Spannung ist wieder hoch,
4 Relais schaltet ab
5 Goto 1

New Task(User wundert sich)

Statte deinen Sketch mit sprechenden Serial.print Ausgaben aus, damit du siehst welche Bedingungen erfüllt sind, damit kannst du debuggen.

dominik1313:
Die Relais schalten bei einer bestimmten Spannung wie verrückt hin und her, wenn die Solar Spannung unter die Batterie Spannung fällt.

Die Software macht was du ihr aufträgst. Und ich bin mir recht sicher, dass die z.B. sagst. Schalte die Ladung ein, wenn die Batterie unter 13 Volt ist. Und als zweite Regel schalte die Ladung aus, wenn die Batterie über 13 Volt ist. Also ich weiß jetzt nicht wo bei dir die Schaltschwelle ist, das ist auch völlig egal. Was ich aufzeigen will, ist der Grund für wildes ein- und ausschalten. Die CPU sagt schalte die Ladung ein, weil die Batteriespannung zu klein ist. Kaum ist die Ladung ein, kommt die Batteriespannung natürlich sofort ein Zentel Volt höher, und schon sagt die CPU wieder, schalte die Ladung aus, weil die Spannung über 13 Volt ist. Das heißt diese Spannungsschwelle zwischen Ladung ein und Ladung aus, muss wesentlich weiter auseinander sein. Z.B. Ladung ein weil Spannung der Batterie nur noch 12,3 Volt ist, Ladung aus, wenn Spannung der Batterie größer 13,8 Volt ist. Dann zappelt das Relais nicht mehr.

Der Fehler sitzt immer am Monitor, nicht im Arduino!!

Hallo,

mir ist nicht klar was Du überhaupt machen willst. Deine Aussage das Du Dein Problem mit 2 Relais gelöst hast kann ja nicht sein, sonst wüdest Du ja nicht "verrückte" Relais haben und hier nach einer Lösung suchen.

Deine Aussage " wenn die Batterie Spannung unter die Batterie Spannung fällt" ist doch völliger Quatsch. Du meinst sicher wenn die Battrerie Spannung unter die Schaltschwelle fällt ...

Also ich habe mir Deinen Sketch nicht angesehen. Habe aber dennoch eine Vermutung. Bei irgendwelchen Unterschieden zwischen den beiden Spannungen von Solarzelle und Batterie, oder einer Schaltschwelle willst Du irgendwie die Relais schalten. Irgendwann willst Du dann die Batterie laden ( z.B U_Zelle > U_Batterie ), dazu musst Du die Solarzelle mit der Batterie verbinden. Just ab diesem Moment gibt es aber die Differenz nicht mehr die zum schalten dieses Zustandes führte und das Relais fällt wieder ab.

Sowas kann man mit einer Schalthyterese oder einer mindest Schaltzeit verhindern, ob das in Deinem speziellen Fall aber überhaupt Sinn macht weiß ich ehr nicht.

Heinz

(deleted)

Hi danke erstmal für die vielen Lösungvorschaläge.

Ich Habe mir eine Sachen über eine Schalthysterese durchgelesen konnte aber nix verwendbares für speziell mein Fall finden.

Wie genau bau ich das in meinen Sketch mit ein?

Code:

void load_control()
{  
  int state = 0;
  if(bat_volt < lvd || solar_volt > bat_volt + 1){
    state = 0;
  }
  if(state == 0 && bat_volt > lvd && solar_volt < bat_volt +1){
    state = 1;
  }
  switch(state){
    case 0:
    load_status = 0;
    digitalWrite(RELAY_BAT, LOW);
    digitalWrite(RELAY_SOL, HIGH);
    digitalWrite(LOAD_PIN, LOW); // load is OFF
    break;
    case 1:    
    load_status = 1;
    digitalWrite(RELAY_BAT, HIGH);
    digitalWrite(RELAY_SOL, LOW);
    digitalWrite(LOAD_PIN, HIGH); //load is ON
    
    break;
  }
}

So ungefähr habe ich die Relais geschalten falls das Hilft.

Lieber Dominik,

bitte poste den gesamten Sketch. Wie soll man deine If-bedingungen analysieren können wenn man nicht weiß welche Zahlenwerte sich hinter den Konstanten /Variablen lvd usw. verbirgt?

bat_volt < lvd || solar_volt > bat_volt )

damit du selbst besser verstehst was der code macht solltest du debug-output einbauen der die die einzelnen Zahlen und welche Bedingungen true oder false sind ausgibt.

viele Grüße Stefan