Brauche Hilfe bei programierung

Hallo und erst mal Sorry für die plumpe Überschrift.

Ich habe eine einfache Schaltung gebaut in die Spannung im Kfz zu überwachen und bei Überschreitung, nach Ablauf einer Stunde, ein Gerät von der Batterie trennt. Andererseits soll aber sobald die Spannung wieder über den eingestellten wert geht die Versorgung eingeschaltet werden.

Das abschalten funktioniert soweit ohne Probleme.
Bloß beim einschalten wartet der Arduino ebenfalls die 3600 Sekunden bis er die Aktion durchführt.

Wo hab ich da den Denkfehler?

int ledPin = 9;
int sensorValue = A0;
void setup() 
{
  Serial.begin(9600);
   delay(1000);
  digitalWrite(9, HIGH); 
   delay(10000);
}
void loop() {
 int sensorValue = analogRead(A0);
 float voltage = sensorValue * (14.8 / 1024.0);
 Serial.println(voltage);
   if (voltage <12.0)
   {
        delay(3600000);
     digitalWrite(9, LOW);
    }
   else
  {
    digitalWrite(9, HIGH);
        
  }
   }

Ja, kein Wunder.
Das delay verhindert ein problemloses Arbeiten deiner Schaltung.

Du musst die Zeitsteuerung mit millis aufbauen.
Siehe dazu das Beispiel "BlinkWithoutDelay" in der IDE.

Sobald dein Programm einmal in die If(true) Bedingung gesprungen ist und das Delay ausführt, bleibt es dort auch so lange bis der Delay vorbei ist.

Heißt:
Hat er erstmal einen Wert unterhalb von 12V am Analogen Eingang erkannt, bleibt dein Programm erstmal eben die im Delay festgelegte zeit, blockiert. Es macht also nicht weiter.
Erst wenn der Delay abgelaufen ist, wird dein Programm weiter ausgeführt.

Wie HotSystems schon geschrieben hat, gibt es andere Wege, um das von dir gewünschte Ergebnis zu erreichen.

LG Sheepstyle

Ich habe eine einfache Schaltung gebaut in die Spannung im Kfz zu überwachen und bei Überschreitung, nach Ablauf einer Stunde, ein Gerät von der Batterie trennt. Andererseits soll aber sobald die Spannung wieder über den eingestellten wert geht die Versorgung eingeschaltet werden.

Ich verstehe Dich nicht:
U > Ulimit -> Wait 1h -> OFF
U > Ulimit -> ON

Ist Da nicht einfacher ein ordentliches Ladegerät für Bleiakkus zu kaufen?

Grüße Uwe

latroe:
Wo hab ich da den Denkfehler?

Ich sehe auf den ersten, schnellen Blick keinen. Vielleicht hängt das Programm nach dem Einschalten (bevor Du die zu prüfende Spannung anlegst?) einfach noch im ersten Teil des if()s.

Allerdings sind mir zwei Unschönheiten aufgefallen:

  • Du definierst eine Variable ledPin, benutzt diese aber im weiteren Code nicht.
  • Die delay()s in setup() sind mega-hässlich und ebenso überflüssig. Apropos hässlich: Siehe hier.

Übrigens: Die „14.8“ sieht verdächtig aus. Du hast hoffentlich nicht vor, eine höhere Spannung als 5 Volt an einen Analog-Eingang zu hängen ...?

Gruß

Gregor

HotSystems:
Du musst die Zeitsteuerung mit millis aufbauen.

Das ist IMO Blödsinn. Für eine dermaßen simple Sache muss man das wirklich nicht tun.

Gruß

Gregor

uwefed:
Ich verstehe Dich nicht:
U > Ulimit -> Wait 1h -> OFF
U > Ulimit -> ON

Ist Da nicht einfacher ein ordentliches Ladegerät für Bleiakkus zu kaufen?

Grüße Uwe

Es geht nicht um das Laden des Akkus.
Es soll verhindert werden das die Batterie im Auto leergesaugt wird.
Wenn der Motor wieder läuft soll das angeschlossene Gerät auch wieder mit Strom versorgt werden.
Sozusagen eine Automatische Einschaltung mit zeitversetzten Abschaltung nach Stillstand.

latroe:
... Auto ...

Wundere Dich nicht, wenn es zuhause funktioniert, im Auto aber nicht mehr. Die Energieversorgung im Auto ist üblicherweise sehr schmutzig, sprich: Spannungsspitzen oder -einbrüche sind eher die Regel als die Ausnahme.

Gruß

Gregor

gregorss:
Übrigens: Die „14.8“ sieht verdächtig aus. Du hast hoffentlich nicht vor, eine höhere Spannung als 5 Volt an einen Analog-Eingang zu hängen ...?

Gruß

Gregor

Ich habe natürlich einen Spannungsteiler verbaut der nur Max. 5volt an den Arduino lässt.

gregorss:
Wundere Dich nicht, wenn es zuhause funktioniert, im Auto aber nicht mehr. Die Energieversorgung im Auto ist üblicherweise sehr schmutzig, sprich: Spannungsspitzen oder -einbrüche sind eher die Regel als die Ausnahme.

Gruß

Gregor

Ich benutze Einen Step down converter für die Versorgung des Arduino.
Die Spannung glätten und Stütze ich mit einem Elko, einem Keramik- und einem Folienkondensator.
Wenn ich das ganze ohne delay laufen lasse funktioniert es auch.

Ich will aber die 3600sek. Nachläuft....

gregorss:
Das ist IMO Blödsinn. Für eine dermaßen simple Sache muss man das wirklich nicht tun.

Gruß

Gregor

Das siehst du so....Viele andere sehen das anders.
Wenn , dann ist es evtl. überflüssig, mehr nicht.

latroe:
Ich benutze Einen Step down converter für die Versorgung des Arduino.
Die Spannung glätten und Stütze ich mit einem Elko, einem Keramik- und einem Folienkondensator.
Wenn ich das ganze ohne delay laufen lasse funktioniert es auch.

Ich will aber die 3600sek. Nachläuft....

Dann lies dir meinen Post #1 nochmals durch.
Lerne mit millis umzugehen und deine Probleme werden weniger.

Wenn du die Spannungsversorgung noch mit einer geeigneten Drossel versiehst, hast du noch weniger Probleme mit Störspitzen in deiner Versorgung.

Ok....wenn du keine Lust hast, deinen Sketch sauber und ohne die verhassten delays aufzubauen, dann nimm den und setze noch eine Hilfsvariable ein, die du am Einde deiner Stunde Wartezeit auf True setzt.
In einer zweiten If-Abfrage wertest du deine Spannung größer 14 Volt o.ä. und die Hilfsvariable aus.
Damit schaltest du den Verbraucher ein und die Hilfsvariable wieder auf False.
Das ganze ohne Else-Zweig.

Nicht schön aber sollte so funktionieren.

latroe:
Es geht nicht um das Laden des Akkus.
Es soll verhindert werden das die Batterie im Auto leergesaugt wird.
Wenn der Motor wieder läuft soll das angeschlossene Gerät auch wieder mit Strom versorgt werden.
Sozusagen eine Automatische Einschaltung mit zeitversetzten Abschaltung nach Stillstand.

Dann erklähr mir bitte den Satz:

Ich habe eine einfache Schaltung gebaut in die Spannung im Kfz zu überwachen und bei Überschreitung, nach Ablauf einer Stunde, ein Gerät von der Batterie trennt.

Überschreitung einer Spannung heiß für mich daß Du etwas lädst und nicht entlädst.
Grüße Uwe

HotSystems:
Du musst die Zeitsteuerung mit millis aufbauen.

gregorss:
Das ist IMO Blödsinn. Für eine dermaßen simple Sache muss man das wirklich nicht tun.

Gruß

Gregor

Meines Erachtens ist delay falsch weil in der Wartestunde die Spannung nicht kontrolliert wird. Wenn der Verbrennungs-Motor in dieser Zeit gestartet wird und die Batterie geladen wird, wird trotzdem das Gerät nach einer Stunde ausgeschaltet um sofort wieder eingeschaltet zu werden.

Außerdem wird bei jedem Motorstart das Auschalten getriggert, weil der Anlasser die Batterispannung arg zusammensacken macht. Da ist dei Bordspannung sicher unter 12V.

Meiner Ansicht braucht es millis und eine kontinuirliche Kontrolle mit Erkennung bestimmter Situationen wie Anlassen und Laden in "Echtzeit" um diese Ereignisse richtig zu verarbeiten.

Grüße Uwe

latroe:
Ich habe natürlich einen Spannungsteiler verbaut der nur Max. 5volt an den Arduino lässt.

Ach so; und Du weißt schon daß die Maximalspannung in einem Bordnetz eines Autos als +90V definiert ist?
Grüße Uwe

uwefed:
Meines Erachtens ist delay falsch weil in der Wartestunde die Spannung nicht kontrolliert wird. Wenn der Verbrennungs-Motor in dieser Zeit gestartet wird und die Batterie geladen wird, wird trotzdem das Gerät nach einer Stunde ausgeschaltet um sofort wieder eingeschaltet zu werden.

Stimmt. Das hatte ich nicht bedacht.

Gruß

Gregor