Go Down

Topic: Zeit parallel im LCD Display ? (Read 1 time) previous topic - next topic

Hallo,

ich mache gerade ein Projekt, in dem ich verschiedene Schrittmotoren
ansteuere und deren Status in einem LCD Display ausgebe.
Jetzt möchte ich nur gleichzeitig noch die Sekunden mit im Display anzeigen.
dh wie lange ein Schrittmotor schon läuft.

Allerdings habe ich das zZ mit einem ... HIGH dann ein delay und denn ein LOW
an einem Digitalen Port gelöst.

Jetzt meine Frage, kann ich im Hintergrund einen Thread laufen lassen, welcher mir
Sekündlich im Display die Laufzeit aktualisiert ?

Gruß Goofy


sth77

Ich denke da eher an einen Entfall der delay-Aufrufe. Schau dir dazu mal den Beispielsketch BlinkWithoutDelay an.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Das ging ja schnell ;)

Ja ok, dass wäre natürlich auch ne Möglichkeit - werde mal schauen wie ich
meinen Code umstelle, dass ich es mit dieser Methode funktioniert.

DANKE mal für den Tipp !

Gruß Goofy

maverick1509

Da stellt sich zunächst eine grundsätzlich Frage:
hast du ein Uhrmodul wo du die Sekunden abgreifen willst oder aber möchtest du
anhand der Funktion millis() die Zeiten ausgeben.
gruß

Was wäre den besser ?
Also zZ habe ich noch kein Uhrmodul - ich habe aber schon mit
dem Gedanken gespielt.

Gruß Goofy

maverick1509

geht beides, ich würde es erst einmal mit millis() versuchen, das delay würde ich auf jeden Fall raus nehmen,
denn da hälst du ja nur den Programmablauf an.
Willst du die Laufzeiten der einzelnen Motoren addieren und anzeigen (für jeden Motor) oder was genau soll
angezeigt werden?

Also ich seh' schon ... ich muss das ein wenig näher erklären :)

Das Projekt handelt sich um eine "Delux Duschsteuerung" - diese beinhaltet
zwei gesteuerte 2-Wege Zonenventile, einmal für Kaltwasser und einmal fürs
Warmwasser, und noch ein 2-wege Absperventil und 4 DS18B20.

Zu den Sensoren, einmal fürs kommende Wasser (kalt|warm) einmal unten
direkt nach dem Warmwasserspeicher und einmal vor dem Duschbrausenaustritt.

Zur Logik :  Die Umwälzpumpe soll so lange laufen bis ich an der Dusche nahezu
die Temp vom Speicher hat, dann wird über das Mischkreuz berechnet wie ich meine
2 Zonenventile stellen muss dass die gewünschte Temp aus dem Hahn kommt.
Und wenn dann grob alles passt, wir das Absperventil geöffnet.

und als Addon, kann man dann pro Benutzer spezifische Werte hinterlegen, also Temp, Länge
und stärke des Wassers.

Und für die Länge, möchte ich halt im Display anzeigen, wie lange man schon duscht :)

PS: hier mal ein Link von der ersten Steuerung
http://www.youtube.com/watch?v=WkaXdvOllb0

Gruß Goofy



maverick1509

ich glaube bei der Steuerung ist die Anzeige der Duschlänge noch das kleinste Problem.
Sobald das Absperrventil öffnet setzt du halt über millis() einen Startwert.
Bei jedem Durchlauf des Programms kannst du dann die verstrichene Zeit berechnen
zeit=(millis()-startwert)/1000 und du erhälst Sekunden, die du im Display ausgeben kannst.
Soweit der Grundgedanke, wenn noch was unklar ist frag.
gruß

#8
Feb 09, 2012, 08:39 pm Last Edit: Feb 09, 2012, 08:50 pm by goofy79 Reason: 1
Ja soweit ist mir das klar - nur es kann ja dann sein, dass es nachjustiert
und dass dann mit nem delay - und in der Zeit sehe ich ja dann nicht die Zeit ?

ich habe ne Funktion geschrieben
Quote

....
//Mischer zu bis auf in msek
int tmischer=14000;
....

///////////////////
//   Auf / Zu    //
///////////////////
int mischer(float warm_stellung, float kalt_stellung){
   int twarm;
   float prozent, warm_stellung_neu, temp_warm_stellung;
   
   warm_stellung_neu = warm_stellung - warm_stellung_aktuell;
   temp_warm_stellung = warm_stellung_neu;

   #ifdef DEBUG
     Serial.print("\n");
     Serial.print(warm_stellung);
     Serial.print(" aktuell - ");
     Serial.print(temp_warm_stellung);
   #endif

   if (warm_stellung == 0){
       twarm = 0 - tmischer;
   }
   else{
       prozent = temp_warm_stellung / 100;
       twarm = tmischer * prozent;
   }

   #ifdef DEBUG
     Serial.print(" Differenz - twarm: ");
     Serial.print(twarm);
     Serial.print("ms\n");
   #endif
   
   if(twarm>=0){
     //wenn twarm positiv, oeffne mischer
     digitalWrite(8, HIGH);
     delay(twarm);
     digitalWrite(8, LOW);
   }
   else{
     //wenn twarm negativ, schliesse mischer
     digitalWrite(8, HIGH);
     digitalWrite(9, HIGH);
     delay(twarm*(-1));
     digitalWrite(8, LOW);
     digitalWrite(9, LOW);
   }
   warm_stellung_aktuell = warm_stellung;
}


Diese Funktioniert soweit richtig gut - allerdings halt mit Delay :(
habe es gerade mal versucht umzustellen - oh man, dass läuft mal gar nicht so wie es soll.

Vor allem, weil sie die Werte für warm_stellung & kalt_stellung dauernd ändern können.

PS habe bis jetzt mal nur den Schrittmotor für das Warmwasser dran.

Gruß Goofy

maverick1509

Hallo Goofy,
ich weiß nicht ob ich das jetzt richtig verstehe, aber warum schreibst du nicht anstelle von

if(twarm>=0){
      //wenn twarm positiv, oeffne mischer
      digitalWrite(8, HIGH);
      delay(twarm);
      digitalWrite(8, LOW);
    }

if(twarm>=0) //wenn twarm positiv, oeffne mischer
      digitalWrite(8, HIGH);
      else
      digitalWrite(8, LOW);
   

Go Up