INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Spannungsüberwachung
09.11.2019, 14:17
Beitrag #1
Spannungsüberwachung
Hallo und guten Tag zusammen.
Zum Thema Spannungsüberwachung hab ich mal eine kleine Frage, und zwar:

Ich benutze einen Arduino Nano-Clon zur Steuerung einiger Zusatzfunktionen auf meinem Modellboot. Das funktioniert auch so weit recht zufriedenstellend. Nun möchte ich das ganze um eine Spannungsüberwachung erweitern. Ziel ist es alle Sonderfunktionen verriegelnd abzuschalten, sobalt die Spannung des Versorgugsakkus unter einen bestimmten Wert fällt. Das Problem ist folgendes. Werden die Verbraucher abgeschaltet, wird die Spannung am Akku wieder leicht steigen (Leerlaufspannung) und somit könnten die Verbraucher wieder zuschaltbar sein. Das will ich aber verhindern, da so der Akku tiefenentladen wird.
Die Schaltung ist soweit klar, die Akkuspannung wird über einen Spannungsteiler (2x 10kOhm) über A0 eingelesen und ausgewertet. Ich habe es mir so gedacht, dass ich die Spannungsüberwachung an den Anfang des Loops setze und dieser, wenn die Spannung unterschritten wird nicht weiter ausgeführt wird und alle digital Ausgänge auf Low gesetzt werden.

Womit lässt sich die Idee realisieren?

Danke schonmal im Vorraus.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2019, 14:31 (Dieser Beitrag wurde zuletzt bearbeitet: 09.11.2019 14:32 von hotsystems.)
Beitrag #2
RE: Spannungsüberwachung
Besser ist es, wenn du in einer if-Abfrage eine Hysteresis einbaust.

Z.B.
< xy ausschalten
> xy einschalten

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2019, 14:32
Beitrag #3
RE: Spannungsüberwachung
Einfachster Weg:

Du packst beide Teile jeweils in eine eigene Funktion. z.B. abschalten und arbeiten.
Den Zustand merkst Du Dir in einer Variablen.
Pseudocode:
Code:
bool zuTief = false;

void abschalten() {
  zuTief = true;
  // Pins setzen
}

void arbeiten() {
  // das was Du bei genug Spannung tun willst
}

void setup() {
...
}

void loop() {
  int spannung = analogRead(Messeingang);
  if (spannung < grenzwert) abschalten();
  if (!zuTief) arbeiten();
}

Damit kannst Du die Zusatzfunktionen erst nach einem Neustart wieder benutzen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2019, 15:18
Beitrag #4
RE: Spannungsüberwachung
Ui, das ging ja mal schnell. Besten Dank dafür.

Ich werde mich heute Abend mal dran setzen um das in in den eigentlichen Sketch einzuflechten.

Als Info hier mal der Sketch, der erweitert werden soll.

Code:
//Relaissteuerung über RC-Fernsteuerung

int Eingang1 = 2; //RC-Kanal 5
int Eingang2 = 3; //RC-Kanal 6
int Eingang3 = 4; //RC-Kanal 9
int Eingang4 = 5; //RC-Kanal 10
int Eingang5 = A0; //Spannungsüberwachung Funktionsakku
int Ausgang1 = 6;
int Ausgang2 = 7;
int Ausgang3 = 8;
int Ausgang4 = 9;
int Ausgang5 = 10;
int Ausgang6 = 11;
int Ausgang7 = 12;
int Ausgang8 = 13;
unsigned long Kanal_1; //Pulsleange 1
unsigned long Kanal_2; //Pulslaenge 2
unsigned long Kanal_3; //Pulslaenge 3
unsigned long Kanal_4; //Pulslaenge 4
void setup() {
  pinMode(Eingang1, INPUT);
  pinMode(Eingang2, INPUT);
  pinMode(Eingang3, INPUT);
  pinMode(Eingang4, INPUT);
  pinMode(Eingang5, INPUT);
  pinMode(Ausgang1, OUTPUT);
  pinMode(Ausgang2, OUTPUT);
  pinMode(Ausgang3, OUTPUT);
  pinMode(Ausgang4, OUTPUT);
  pinMode(Ausgang5, OUTPUT);
  pinMode(Ausgang6, OUTPUT);
  pinMode(Ausgang7, OUTPUT);
  pinMode(Ausgang8, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  Ueberwachen_Eingang1();
  Ueberwachen_Eingang2();
  Ueberwachen_Eingang3();
  Ueberwachen_Eingang4();
  Ueberwachen_Eingang5();

}
void Ueberwachen_Eingang1()
{
  Kanal_1 = pulseIn(Eingang1, HIGH);
  //Serial.println(Kanal_1);
  if ((Kanal_1 > 1400) && (Kanal_1 < 1600)) {
    digitalWrite(Ausgang1, LOW);
    digitalWrite(Ausgang2, LOW);
  }
  if ((Kanal_1 > 800) && (Kanal_1 < 1300)) {
    digitalWrite(Ausgang1, HIGH);
    Serial.println(Ausgang1);
  }
  if ((Kanal_1 > 1700) && (Kanal_1 < 2200)) {
    digitalWrite(Ausgang2, HIGH);
    Serial.println(Ausgang2);
  }
}
void Ueberwachen_Eingang2()
{
  Kanal_2 = pulseIn(Eingang2, HIGH);
  //Serial.println(Kanal_2);
  if (( Kanal_2 > 1400) && (Kanal_2 < 1600)) {
    digitalWrite(Ausgang3, LOW);
    digitalWrite(Ausgang4, LOW);
  }
  if ((Kanal_2 > 800) && (Kanal_2 < 1300)) {
    digitalWrite(Ausgang3, HIGH);
    Serial.println(Ausgang3);
  }
  if ((Kanal_2 > 1700) && (Kanal_2 < 2200)) {
    digitalWrite(Ausgang4, HIGH);
    Serial.println(Ausgang4);
  }
}
void Ueberwachen_Eingang3()
{
  Kanal_3 = pulseIn(Eingang3, HIGH);
  //Serial.println(Kanal_3);
  if (( Kanal_3 > 1350) && (Kanal_3 < 1650)) {
    digitalWrite(Ausgang5, LOW);
    digitalWrite(Ausgang6, LOW);
  }
  if ((Kanal_3 > 800) && (Kanal_3 < 1300)) {
    digitalWrite(Ausgang5, HIGH);
    Serial.println(Ausgang5);
  }
  if ((Kanal_3 > 1650) && (Kanal_3 < 2200)) {
    digitalWrite(Ausgang6, HIGH);
    Serial.println(Ausgang6);
  }
}
void Ueberwachen_Eingang4()
{
  Kanal_4 = pulseIn(Eingang4, HIGH);
  //Serial.println(Kanal_4);
  if (( Kanal_4 > 1400) && (Kanal_4 < 1600)) {
    digitalWrite(Ausgang7, LOW);
    digitalWrite(Ausgang8, LOW);
  }
  if ((Kanal_4 > 800) && (Kanal_4 < 1300)) {
    digitalWrite(Ausgang7, HIGH);
    Serial.println(Ausgang7);
  }
  if ((Kanal_4 > 1700) && (Kanal_4 < 2200)) {
    digitalWrite(Ausgang8, HIGH);
    Serial.println(Ausgang8);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2019, 15:29
Beitrag #5
RE: Spannungsüberwachung
Die Pins werden nicht negativ, es werden auch nicht mehr als 256 und sie ändern sich auch nicht während des Betriebs.
Also:
Code:
// nicht
int Eingang1 = 2;
// sondern
const byte Eingang1 = 2;
usw.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2019, 15:32
Beitrag #6
RE: Spannungsüberwachung
Und du verwendest den analogen A0 als Eingang, dann brauchst du diesen nicht als Input zu definieren.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2019, 17:11
Beitrag #7
RE: Spannungsüberwachung
....in diesem Fall würde ich beim erkennen von Unterspannung eine Zeitschleife starten und mal so 5..10 Sek. lang immer wieder die Spannung prüfen und erst wenn bei z.B. mindestens 80% der Messungen Unterspannung festgestellt wurde die endgültige Abschaltung einleiten. Ganz einfach deswegen weil wenn gerade eben was eingeschaltet wurde kann der Akku evtl. durch den Einschaltstrom kurz in die Knie gehen und so hat man dann eben länger Spaß an den Sonderfunktionen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2019, 19:13
Beitrag #8
RE: Spannungsüberwachung
@ Thommy + Dieter
Danke für die Tipps, hab den Scatch entsprechend geändert.

@ Thommy
Nur zum Verständnis deines Pseudocodes betreffend.
An dem Teil:

Code:
void arbeiten() {
  // das was Du bei genug Spannung tun willst
}

Stoße ich ein bischen auf Unverständnis, da, so lange ausreichend Saft zur Verfügung steht, der Loop ausgeführt werden soll.

Ansonsten würde ich das so machen:
Code:
const byte Eingang1 = 2; //RC-Kanal 5
const byte Eingang2 = 3; //RC-Kanal 6
const byte Eingang3 = 4; //RC-Kanal 9
const byte Eingang4 = 5; //RC-Kanal 10
const byte Eingang5 = A0; //Spannungsüberwachung Funktionsakku
const byte Ausgang1 = 6;
const byte Ausgang2 = 7;
const byte Ausgang3 = 8;
const byte Ausgang4 = 9;
const byte Ausgang5 = 10;
const byte Ausgang6 = 11;
const byte Ausgang7 = 12;
const byte Ausgang8 = 13;
unsigned long Kanal_1; //Pulsleange 1
unsigned long Kanal_2; //Pulslaenge 2
unsigned long Kanal_3; //Pulslaenge 3
unsigned long Kanal_4; //Pulslaenge 4
bool zuTief = false;

void abschalten() {
  zuTief = true;
   digitalWrite(Ausgang1, LOW);
   digitalWrite(Ausgang2, LOW);
   digitalWrite(Ausgang3, LOW);
   digitalWrite(Ausgang4, LOW);
   digitalWrite(Ausgang5, LOW);
   digitalWrite(Ausgang6, LOW);
   digitalWrite(Ausgang7, LOW);
   digitalWrite(Ausgang8, LOW);
}

void arbeiten() {
  // das was Du bei genug Spannung tun willst (Keine Ahnung, was hier hin kommt)
}

void setup() {
  pinMode(Eingang1, INPUT);
  pinMode(Eingang2, INPUT);
  pinMode(Eingang3, INPUT);
  pinMode(Eingang4, INPUT);
  pinMode(Ausgang1, OUTPUT);
  pinMode(Ausgang2, OUTPUT);
  pinMode(Ausgang3, OUTPUT);
  pinMode(Ausgang4, OUTPUT);
  pinMode(Ausgang5, OUTPUT);
  pinMode(Ausgang6, OUTPUT);
  pinMode(Ausgang7, OUTPUT);
  pinMode(Ausgang8, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int Spannung = analogRead(A0);
  float Volt = Spannung * (5.00 / 1023.00) * 2;
  if (Volt < 3,5) abschalten();
  if (!zuTief) arbeiten();
}
{
  Ueberwachen_Eingang1();
  Ueberwachen_Eingang2();
  Ueberwachen_Eingang3();
  Ueberwachen_Eingang4();

}
void Ueberwachen_Eingang1()
{
  Kanal_1 = pulseIn(Eingang1, HIGH);
  //Serial.println(Kanal_1);
  if ((Kanal_1 > 1400) && (Kanal_1 < 1600)) {
    digitalWrite(Ausgang1, LOW);
    digitalWrite(Ausgang2, LOW);
  }
  if ((Kanal_1 > 800) && (Kanal_1 < 1300)) {
    digitalWrite(Ausgang1, HIGH);
    Serial.println(Ausgang1);
  }
  if ((Kanal_1 > 1700) && (Kanal_1 < 2200)) {
    digitalWrite(Ausgang2, HIGH);
    Serial.println(Ausgang2);
  }
}
void Ueberwachen_Eingang2()
{
  Kanal_2 = pulseIn(Eingang2, HIGH);
  //Serial.println(Kanal_2);
  if (( Kanal_2 > 1400) && (Kanal_2 < 1600)) {
    digitalWrite(Ausgang3, LOW);
    digitalWrite(Ausgang4, LOW);
  }
  if ((Kanal_2 > 800) && (Kanal_2 < 1300)) {
    digitalWrite(Ausgang3, HIGH);
    Serial.println(Ausgang3);
  }
  if ((Kanal_2 > 1700) && (Kanal_2 < 2200)) {
    digitalWrite(Ausgang4, HIGH);
    Serial.println(Ausgang4);
  }
}
void Ueberwachen_Eingang3()
{
  Kanal_3 = pulseIn(Eingang3, HIGH);
  //Serial.println(Kanal_3);
  if (( Kanal_3 > 1350) && (Kanal_3 < 1650)) {
    digitalWrite(Ausgang5, LOW);
    digitalWrite(Ausgang6, LOW);
  }
  if ((Kanal_3 > 800) && (Kanal_3 < 1300)) {
    digitalWrite(Ausgang5, HIGH);
    Serial.println(Ausgang5);
  }
  if ((Kanal_3 > 1650) && (Kanal_3 < 2200)) {
    digitalWrite(Ausgang6, HIGH);
    Serial.println(Ausgang6);
  }
}
void Ueberwachen_Eingang4()
{
  Kanal_4 = pulseIn(Eingang4, HIGH);
  //Serial.println(Kanal_4);
  if (( Kanal_4 > 1400) && (Kanal_4 < 1600)) {
    digitalWrite(Ausgang7, LOW);
    digitalWrite(Ausgang8, LOW);
  }
  if ((Kanal_4 > 800) && (Kanal_4 < 1300)) {
    digitalWrite(Ausgang7, HIGH);
    Serial.println(Ausgang7);
  }
  if ((Kanal_4 > 1700) && (Kanal_4 < 2200)) {
    digitalWrite(Ausgang8, HIGH);
    Serial.println(Ausgang8);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste