Show Posts
Pages: [1] 2 3 ... 5
1  International / Deutsch / Re: Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 10, 2012, 08:16:19 am
Kamera wäre vorhanden und auf entsprechende Software hätte ich auch Zugriff.

Allerdings wäre es wieder zu viel Aufwand dafür, dass ich die Geschwindigkeit lediglich anzeige und keinen genauen Wert brauche. Die Geschwindigkeit dient mir ja lediglich um:
1. zu erkennen, ob das Tachosignal funktioniert
2. die Geschwindigkeitsprogression des Kettenölers zu berücksichtigen (höhere Geschwindigkeit = mehr abgeschleudertes Öl = früher nachölen)

Dafür reichen mir ungenaue Werte und im Zweifel wird halt mal 10m zu spät geölt, weil die errechnete Geschwindigkeit langsamer war. Bei einem Raster von 100m für die Einstellung sind diese 10m dann auch egal.
Ihr wisst, was ich meine. Die ganze Ölerei ist ja sowieso alles nur pi mal Daumen.

Was mich antreibt ist rein nur der Ehrgeiz herauszufinden, ob ich in meinem Code scheiße gebaut hab (ich bin Softwarentwickler, da sollte ich fähig sein einen funktionierenden Code zu basteln), oder ob das Tachosignal doof ist oder sonst irgendwas in der Art.

Ich war auch schon am überlegen, ob ich mir nicht testweise als Debug mal die Ticks pro Sekunde anzeigen lasse. Das würde zumindest zeigen, ob die Ticks linear mit dem Tacho laufen oder ob vielleicht da bereits ein Fehler ist. Dann kann man darauf schließen, dass die Berechnung stimmt bzw. falsch ist.

Was es mir halt so richtig schwer macht ist die Ableserei. Das Display hängt direkt am Lenker. Ich muss also immer vom Tacho wegschauen. So super 100% konstant Gas geben kann kaum jemand. Also schwankt es immer ein wenig. Den Wert am Display für genau 50km/h Tacho abzulesen ist also nicht gerade einfach.
2  International / Deutsch / Re: Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 10, 2012, 03:37:54 am
Wieso Verkleidung aufmachen? Leg doch einen Programmieranschluss nach außen.

Ich hab ein Gehäuse, in das der Arduino gerade so reinpasst. Da geht kein Stecker mehr in den USB Port.
Wenn ich ein größeres Gehäuse nehme, dann passt es nachher eventuell nicht mehr rein.

Eine Lösung wäre ein USB Kabel direkt dran zu löten. Aber das will ich nicht machen, dann kann ich den Arduino nicht im Bedarf einfach wieder austauschen (bisher ist alles über ein selbstgebautes Shield gelöst).

Davon abgesehen wüsste ich ja sowieso nicht, was ich noch ausprobieren sollte.
3  International / Deutsch / Re: Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 09, 2012, 03:30:03 am
Ich hab jetzt den neuen Code ausprobiert und immer noch das gleiche Ergebnis (bei 100km/h Tacho habe ich ca. 84km/h auf dem Arduino).
Ich weiß, dass der Tacho bei 100km/h ca. 7km/h vor geht (laut Navi). Demnach MUSS der errechnete Wert zu wenig sein.

Ich könnte mir vorstellen, dass der Radumfang vielleicht etwas zu klein ist. Ich habe 195cm eingestellt (gemessen), manch andere haben 198cm. Das wären aber auch nur 1,5% Differenz, das würde sich gar nicht auswirken (1km/h mehr).

Ich wollte das aber lediglich berichten. Aktuell belasse ich es einfach dabei, da ich keine Lust habe immer wieder die Verkleidung auf zu machen, damit ich neu programmieren kann.
4  International / Deutsch / Re: Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 06, 2012, 12:21:46 am
Also mit Messfehlern wegen Störungen hatte ich bisher nicht zu kämpfen, da scheint das Tachosignal ganz ordentlich zu sein. Oder es liegt daran, wie gemessen wird (interner Pullup und über Diode an das Tachosignal - somit triggert der Massedurchgang).

Ich habe jetzt mal volatile auf dem Zähler mit reingenommen und noInterrupts für das Auslesen der Messzeit und der gezählten Ticks eingebaut. Weiter werden die Ticks nicht mehr auf 0 gesetzt sondern der zuvor ausgelesene Wert wird abgezogen.

Testen kann ich die Lösung leider erst in ein paar Tagen. Gestern abend wars schon zu spät und heute bin ich dann bis Sonntag unterwegs.
Mal schnell ausprobieren ist leider nicht, da ich den Sitz runternehmen und die hintere Seitenverkleidung abnehmen muss. Das dauert ein wenig.
5  International / Deutsch / Re: Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 05, 2012, 01:28:48 pm
GPS hat im Stillstand eine schlechte Genauigkeit, das ist korrekt. In Bewegung lässt sich die Position aber sehr genau berechnen (etwa 50cm genau).

Du hast aber Recht, in Kurven kann man per GPS keine gescheite Geschwindigkeit errechnen, das geht nur auf der Geraden.
Aber schaust du in der Kurve auf den Tacho? Besonders beim Motorrad? Eigentlich nicht ;-)

Ich würde die Lösung mit GPS dann sowieso nur für eine zusätzliche Anzeige nutzen. Die Geschwindigkeit des Hinterrads muss ich trotzdem weiterhin korrekt berechnen (also incl. Schlupf), da die Geschwindigkeit bzw. die gefahrene Strecke dazu benutzt wird, um die Kette zu ölen. Und die Kette hat nunmal mehr Strecke zurückgelegt, als das Moped (wegen Schlupf).
6  International / Deutsch / Re: Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 05, 2012, 05:33:45 am
Grundsätzlich gute Idee, die Geschwindigkeit z.B. mit einem zweiten IC zu messen. Da ich die Steuerung aber bereits im Einsatz habe und ungern nochmal umlöten möchte, ist das keine praktikable Lösung für mich.
Davon abgesehen wäre es mit Kanonen auf Spatzen geschossen. Ich bin nicht auf eine absolut exakte Geschwindigkeit angewiesen, es wäre aber schön, wenn sie dennoch stimmen würde (daher hier ja meine Suche nach einer programmatischen Lösung).

Wenn GPS Module nicht so scheiß teuer wären, würde ich eines verbauen und einfach damit die Geschwindigkeit errechnen. Dann hätte ich auch nicht mehr die Probleme mit dem Schlupf (der macht sich nämlich tatsächlich bemerkbar und ich weiß nicht, wie ich den rausrechnen sollte).
7  International / Deutsch / Re: Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 05, 2012, 04:56:39 am
Sollte ich dann besser die bestehende Logik einfach mit volatile und nointerrupt erweitern oder sollte ich die Zeitmessung zusätzlich in den Interrupt packen?
8  International / Deutsch / Re: Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 05, 2012, 02:51:38 am
Schonmal danke für die Hinweise, das hilft ein wenig weiter.

Genaugenommen ist das Teil ein Frequenzzähler mit einer auf Umdrehungen pro Minute oder km/h umgerechneten Ausgabe. Ich würde mir anschauen wie andere Leute Frequenzzähler für den gewünschten Frequenzbereich optimieren. Auf jeden Fall würde ich mich bei Frequenzzählerprojekten bedienen. Also http://arduino.cc/en/Reference/pulseIn und http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/.

pulseIn zählt die Dauer eines Zustands. Das Hilft mir nicht, da hier gemessen würde, wie lange bei einem Tick das Signal HIGH ist. Ich will aber nicht wissen wie lange es HIGH ist, sondern wie lange es dauert, bis es von HIGH wieder auf HIGH schaltet.

Bei der zweiten Variante müsste ich testen, ob hier der Programmablauf unterbrochen wird. Das kann ich nämlich nicht brauchen, weil ja auch noch andere Sachen laufen.

Egal wie, ich muss die Ticks auf jeden Fall alle zählen, weil ich auch die gefahrene Strecke brauche.


Ich will mal kurz auf volatile und noInterrupt zurück kommen:
Ich hole mir zuerst die aktuellen millis. Danach erst die Anzahl an Ticks. Wenn die Ticks zwischenzeitlich erhöht wurden, dann müsste mir eine höhere Geschwindigkeit errechnet werden, weil ich dann zuviele Ticks in meinem Intervall habe. Genau das passiert aber nicht.
Nach der Zuweisung setze ich die Ticks auf 0 zurück. Wenn hier zwischenzeitlich Ticks erhöht wurden, dann gehen die verloren. Das müsste dann doch aber auch bei deutlich höherer Geschwindigkeit auch so sein. Oder spielt mir da vielleicht die Physik einen Streich und der Schlupf wird so groß, dass das Rad tatsächlich eine deutlich höhere Geschwindigkeit hat? Eigentlich dachte ich, dass das nur beim Beschleunigen oder bei richtig hoher Geschwindigkeit signifikant wird.

Wenn ich jetzt mit nointerrupts arbeite, dann gehen mir doch sicherlich Ticks verloren oder nicht? Das würde ich gerne vermeiden.

Die Idee einfach die Zeit zwischen den Ticks zu zählen ist auch so ne Sache. Schließlich haben wir ja bereits bei 100km/h eine Frequenz von 1000Hz. Bisher berechne ich die Geschwindigkeit alle 100ms also mit 10Hz. Ich frage mich, ob mein Programm dann noch ordentlich läuft oder ob da dann nicht doch der IC irgendwann an seine Grenzen stößt. Aber wahrscheinlich unterschätze ich da den 16Mhz Chip.
Davon unabhängig kann ich dann aber nicht mehr mit millis arbeiten, sondern muss mikros nehmen.

Wäre folgendes eine Lösung (achtet nicht auf die syntax, ich kritzel das nur so hin)?
Code:

unsigned long speedMicros
unsigned long speedTicks

speedTrigger() #wird per interrupt gerufen
{
  static unsigned long lastMicros
  unsigned long actualMicros = micros()
  unsigned int diff = actualMicros - lastMicros
  lastMicros = actualMicros
  speecMicros += lastMicros
  speedTicks++
}

calculateSpeed()
{
  unsigned long mySpeedMicros = speedMicros
  unsigned long mySpeedTicks = speedTicks
  speedMicros -= mySpeecMicros
  speedTicks -= mySpeedTicks

... geschwindigkeit berechnen und kram machen
}

So sorgt der Interrupt selbst dafür, dass die Anzahl Ticks und die gemessene Zeit zusammen passen. Dennoch kann ich kontrolliert in einem definierten Intervall die Geschwindigkeit bestimmen und meinen restlichen Kram damit machen, ohne den Interrupt damit zu belasten.
Ticks verlieren kann ich nicht. Falls der Interrupt weiter gezählt hat, bleibt das erhalten, da ich nur den alten Wert abziehe.


Nachdem ich diesen Code eben so geschrieben habe fällt mir auf, dass ich auch den bestehenden Code dementsprechend anpassen könnte (statt speedTicks = 0 müsste ich ticks davon abziehen).
Zusammen mit volatile könnte das vielleicht schon die Lösung sein und ich muss den Interrupt nicht aufblähen.
9  International / Deutsch / Errechneter Wert ist falsch. Programmfehler? Kann mal jemand drüberschauen? on: July 04, 2012, 02:28:45 pm
Hallo Leute,

ich errechne über die Ticks des Tachosignals meines Motorrads die gefahrene Geschwindigkeit. Mir fällt auf, dass diese im Bereich um die 90-100km/h sehr stark vom Tachowert abweicht (teilweise bis 15km/h). Die errechnete Geschwindigkeit ist zu gering.

Bei niedrigeren Geschwindigkeiten habe ich aber höhere errechnete Geschwindigkeiten, die besser zur Realität passen.

Wenn ich z.B. anhand der Drehzahl vergleiche stelle ich fest, dass ich bei Verdoppelung der Drehzahl nicht die errechnete Geschwindigkeit verdopple.
Bei deutlich höheren Geschwindigkeiten (150km/h) passt es dann auf einmal wieder wesentlich besser und die errechnete Geschwindigkeit scheint wieder zu stimmen.

Ich hänge mal den entsprechenden Code an, vielleicht tritt ja irgendwo ein Überlauf oder ein dummer Rundungsfehler auf und ich sehe das einfach nicht.

Code:
//Geschwindigkeit
unsigned long speedTicks = 0;
int actualSpeed = 0;

//Konstanten für Tachosignal auswertung (Distanz + Geschwindigkeit)
const int tickPerRotation = 72;
const int rotationLength = 1950;

void getSpeed() {
   static unsigned long speedMillis = 0;
   static const unsigned int intervall = 100;
   static boolean beschlMessung = false;
   static unsigned long beschlMessMillis = 0;
   static int speeds[] = {0, 0, 0, 0, 0};
  static int speedIdx = 0;
  static int mySpeed = 0;

   long actualMillis = millis();
//alle 100ms
   if (actualMillis > speedMillis + intervall) {
       unsigned long ticks = speedTicks;  //ticks merken, da speedTicks durch interrupt erhöht wird
       speedTicks = 0; //speedTicks resetten
       int diff = actualMillis - speedMillis; //tatsächliches intervall
       speedMillis = actualMillis; //zeitpunkt für nächstes intervall speichern
       int calcSpeed = 0;
       if (ticks > 10) {
//nur wenn genügend ticks gezählt sind, geschwindigkeit berechnen, ansonsten speed = 0
         unsigned long divisor = (unsigned long)tickPerRotation * 1000 * diff;
         calcSpeed = (ticks * rotationLength * 3600) / divisor;
       } else { //keine ticks abziehen, das moped steht (wird nur im stand leicht bewegt)
         ticks = 0;
       }

//geschwindigkeit mit den 4 vorangegangenen Werten glätten (sonst schwankt es stark)
       mySpeed -= speeds[speedIdx];
       mySpeed += calcSpeed;
       speeds[speedIdx] = calcSpeed;
       speedIdx++;
       if (speedIdx == 5) {
           speedIdx = 0;
       }
       
       int theSpeed = mySpeed / 5;

       //errechnete geschwindigkeit übernehmen
       actualSpeed = theSpeed;
}

//interrupt für das Tachosignal
void speedTrigger() {
   speedTicks++;
}


actualSpeed ist die globale Variable, in der die errechnete Geschwindigkeit landet, um dann später aufs Display zu gelangen.

speedTrigger() wird über interrupt gerufen und dient dazu, die Ticks zu zählen. Es sind 72 Ticks pro Radumdrehung und jede Radumdrehung hat 1,95m
100km/h sind 27,7m/s also 1025 Ticks pro Sekunde. Ich denke das sollte der Chip schaffen, die alle korrekt zu zählen.

Woran könnte jetzt mein Problem liegen?
Gehen mir eventuell Ticks verloren, weil sie nicht gezählt werden?
Verpasse ich im Code irgendwo Ticks bei der Geschwindigkeit?
Oder habe ich irgendwo einen Überlauf (unwahrscheinlich, da müsste dann totaler Käse rauskommen) oder blöde Rundungsfehler?

Hat jemand eine Idee?
10  International / Deutsch / Re: Alarm / Zeitschaltuhr on: August 05, 2011, 12:21:50 pm
Der Code von Gerlitschka zeigt genau die beiden Varianten, die ich aufgezeigt habe (normale Abfrage und die Invertierung). Allerdings ohne Variablen für die Schaltzeiten, sondern direkt mit den Werten. In dem Moment ist das Ganze aber witzlos, denn dann sind teile der Abfrage überflüssig. Das hatte ich aber früher auch schon erwähnt.

Ich ging davon aus, dass hier eine Zeitschaltuhr entstehen soll, bei der man die Zeiten variabel einstellen kann. Wenn alles im Programm hardcodiert ist, dann muss man sich natürlich nicht mit so Fragen wie dem 0:00 Durchgang befassen, weil man ja die Zeiten kenn und eben weiß ob man den Durchgang mit dabei hat oder nicht.
11  International / Deutsch / Re: Anfänger: "Standventilator" steuern? on: August 05, 2011, 08:22:19 am
Wie Uwe schon erwähnt geh ich auch nicht davon aus, dass der Ventilator selbst nen Trafo hat und somit wird der Motor wohl mit 230V laufen.

Relais ist ne Lösung, aber es ist halt um die Möglichkeiten, die man mit PWM hätte schade.
Was den Schaltstrom angeht, so sollte der doch relativ egal sein. Man packt einfach einen Treiber davor (BUZ11 z.B.) und gut is. Man muss ja sowieso irgendwie den Arduino mit Strom versorgen, also muss ja irgendwo ne geregelte Spannung von 5-15V da sein.

Was wäre, wenn man den Ventilator mit nem Mosfet steuert? Gibts da nicht irgendwo was passendes mit kleinem Innenwiderstand?
Voraussetzung wäre halt, dass es ein Gleichspannungsmotor ist. Wenn der Wechselspannung braucht, dann is das mit dem Mosfet natürlich auch Käse.
Vom Strom her sollte es ja möglich sein. Bei 230V wäre man mit 1A bereits bei 230W (was recht viel wäre für nen Ventilator).

Ich hab nen Buz11 im Mopped verbaut und der macht an 12V locker 3-4A mit. Und das obwohl er bei 5V Steuerspannung nicht vollständig durchschaltet. Kühlung ist keine nötig.

Von dem her müsste das eigentlich machbar sein. Man braucht halt nen andern Mosfet, der Buz macht nur bis 50V mit.
12  International / Deutsch / Re: Alarm / Zeitschaltuhr on: August 05, 2011, 02:01:17 am
Also mir wäre es wichtiger, dass das System sicher und zuverlässig den gewünschten Zustand hält, als den Code um 3 Zeilen einfacher zu haben.

Was ist, wenn ich um 23:00 einschalten soll, aber 23:00 gar nicht eintritt, weil mein Arduino zufällig 60sec irgendwas am rechnen ist und erst um 23:01 das nächste mal prüft, ob er einschalten soll? Dann hat er 23:00 verpasst und schaltet nicht ein.

Daher MUSS ich immer den Zeitraum betrachten und nicht nur den Einschaltzeitpunkt (Reset wurde ja auch noch als Fehlerquelle angeführt).

Wie ich bereits erwähnte, kann man den 0:00 Durchgang mit gescheitem Code lösen. Und das sollte man auch machen. Der Grundsätzliche Ansatz ist ja: if (einschaltMinuten <= aktuelleZeitMinuten < ausschaltMinuten) { einschalten } else { ausschalten }
Jetzt muss man halt zusätzlich noch testen, ob ausschaltMinuten < einschaltMinuten ist. In dem Fall muss man invertieren.

if (einschaltMinuten < ausschaltMinuten) {
  if (einschaltMinuten <= aktuelleZeitMinuten && aktuelleZeitMinuten < ausschaltMinuten) {
    //einschalten
  } else {
    //ausschalten
  }
} else {
  if (ausschaltMinuten <= aktuelleZeitMinuten && aktuelleZeitMinuten < einschaltMinuten) {
    //ausschalten
  } else {
    //einschalten
  }
}


Ich denke so müsste es zuverlässig funktionieren, auch nach einem Reset
13  International / Deutsch / Re: Anfänger: "Standventilator" steuern? on: August 04, 2011, 09:24:51 am
Warum mit Relais die Schalter nachbilden, wenn man den Ventilator stufenlos steuern könnte?

Um die ganze Geschichte sicherer zu machen und da man sowieso den Arduino irgendwie mit Strom versorgen muss, würde ich folgendes machen:
Für den 230V Motor einen 12V Ersatz suchen.
Ein fertiges 12V Netzteil mit genug Leistung besorgen.
Den Motor austauschen und mit dem Arduino stufenlos über PWM steuern.

Es kann natürlich auch sein, dass gar kein 230V Motor verbaut ist, sondern im Ventilator ein Netzteil sitzt. Dann könnte man sich hinter dem Netzteil entsprechend austoben.

Ein Netzteil wird auf jeden Fall nötig werden, weil der Arduino ja nicht an 230V angeschlossen werden kann. Außer man betreibt ihn mit Batterie, aber wer will das schon?
Außerdem hat man dann 2 unterschiedliche Versorgungsspannungen, die zu Problemen führen können (unterschiedliche Massepotentiale lassen Transistoren lustige Dinge tun).

Direkt mit 230V arbeiten würde ich persönlich nicht. Ich hab zwar schonmal einen Röhrenverstärker gebaut (350V Spannung), aber das war ein Bausatz mit entsprechender Anleitung und einer fertigen korrekten Schaltung. Das ist ein Unterschied dazu, dass man sich selbst was ausdenkt und einfach mal irgendwie ein paar Relais dazwischenklemmt.
14  International / Deutsch / Re: Alarm / Zeitschaltuhr on: August 04, 2011, 12:58:00 am

if (
  (
    (480 < 1410)
    &&
    (Minutenuhrzeit >= 1410)
  )
  ||
  (
    (480 >= 1410)
    &&
    (Minutenuhrzeit < 480)
    && (Minutenuhrzeit >= 1410)
  )


1. dir fehlt am Ende eine schließende Klammer
2. kann der Teil nach dem "oder" niemals true sein, weil schon die erste Klammer nicht true sein kann. Außerdem kann Minutenuhrzeit niemals < 480 und gleichzeitig >= 1410 sein.
3. Wir die Uhr um 0:00 einschalten und um 23:30 ausschalten.

Im Endeffekt ist die Version von Uwe ja das, was ich am Ende meines Posts erwähnt habe. Du musst die Stunden in Minuten umrechnen und diese Werte vergleichen. Du musst aber auch irgendwie noch mit dem Überlauf um 0:00 umgehen (außer deine Zeiten gehen nie über 0:00 hinaus, dann ist es egal).

Hier mal noch die richtige Version deiner Bedingung zum einschalten:

if (minutenUhrzeit >= 480 && minutenUhrzeit < 1410) {
  digitalWrite(SCHALTPIN, HIGH);
} else {
  digitalWrite(SCHALTPIN, LOW);
}
15  International / Deutsch / Re: Alarm / Zeitschaltuhr on: August 03, 2011, 03:10:16 am
Man kann die LCD Lib auch so setzen, dass sie von rechts nach links schreibt. Dann musst du aber auch alles, was du schreibst, invertieren, damit es wieder richtig rum da steht.
Einfacher ist die Länge der Ausgabe zu berechnen und den Startcursor richtig zu setzen (Leerzeichen sind nicht nötig).

Was die Zeitschaltung angeht:

DateTime now = RTC.now();
 
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();


Da liest du doch schon Jahre, Tage, Stunden u.s.w. aus.
Wenn die Zeitschaltuhr jeden Tag um 8:00 einschalten soll, dann prüfst du dort, ob sie noch nicht eingeschaltet ist (in globaler Variable speichern) und ob 8:00 vorüber ist (also ob Stunden >= 8 und Minuten >= 0). Wenn ja, einschalten und Variable setzen. Ähnlich verfährst du mit ausschalten (Uhrzeit erreicht und ist noch eingeschaltet).
Brauchst du am Tag mehrere Schaltvorgänge, dann musst du dir merken, bei welchem Schaltvorgang du gerade bist. Dann reicht kein einfacher boolean mehr zum ein/ausschalten sondern du brauchst noch einen Zähler, der dir sagt, bei welchem der eingetragenen Zeitintervalle du bist.

Beispiel:
1 = 8:00 einschalten, 9:00 ausschalten
2 = 14:00 einschalten, 16:00 auschalten
3 = 20:00 einschalten, 1:00 ausschalten


if (status == 1 && !eingeschaltet && stunde >= 8 && minute >= 0){
  digitalWrite(zeitschaltpin, HIGH);
} else if (status == 1 && eingeschaltet && stunde >= 9 && minute >= 0){
  digitalWrite(zeitschaltpin, LOW);
} else if (status == 2 && !eingeschaltet && stunde >= 14 && minute >= 0){
...

so in der Art.
Den status würde ich persönlich aber dann mit einem switch durchgehen.
Also:

switch(status) {
case 1:
if (!eingeschaltet && stunde >= 8 && minute >= 0){
  digitalWrite(zeitschaltpin, HIGH);
} else if (&& eingeschaltet && stunde >= 9 && minute >= 0){
  digitalWrite(zeitschaltpin, LOW);
break;

case 2:
if (!eingeschaltet && stunde >= 14 && minute >= 0){
}
break;
}


ACHTUNG:
Mein code berücksichtigt bisher nicht den jeweiligen Sprung der Minuten bei der vollen Stunde. Das müsste man auch noch regeln.
Das lässt sich aber auch einfach lösen, indem man die Uhrzeiten nicht direkt nimmt, sondern in minuten umwandelt. 8:00 wäre dann 420 minuten. Die aktuelle Uhrzeit auch in Minuten umrechnen und nur noch die Minuten vergleichen.

Dann bleibt noch ein letztes Problem. Der 0:00 Durchgang. Wenn ich vor 0:00 einschalte und nach 0:00 ausschalten will, hab ich ein Problem. Denn 20:00 ist größer als 1:00.
Eine mögliche Lösung wäre den Ausschaltzeitpunkt nicht explizit zu nehmen, sondern nur das Zeitintervall bis zum Ausschaltzeitpunkt zu ermitteln (also 240min eingeschaltet bleiben). Dann müsste man halt irgendwie zählen, wieviel Zeit seit dem Einschalten vergangen ist (z.B. indem man den aktuellen Minutenwert abspeichert und immer wenn sich der Minutenwert ändert addiert man das zu den bereits vergangenen Minuten und vergleicht dann die vergangenen Minuten mit dem Zeitintervall. Natürlich muss man die vergangenen Minuten immer beim Einschalten resetten.

Ob das die Ideale Lösung ist, weiß ich nicht, aber so auf die Schnelle wäre das jetzt mal meine erste Idee. Vielleicht hilfts dir ja für den ersten Ansatz.
Pages: [1] 2 3 ... 5