Pages: [1]   Go Down
Author Topic: Zeit parallel im LCD Display ?  (Read 799 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Germany
Offline Offline
Edison Member
*
Karma: 46
Posts: 2310
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich denke da eher an einen Entfall der delay-Aufrufe. Schau dir dazu mal den Beispielsketch BlinkWithoutDelay an.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ging ja schnell smiley-wink

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
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ß
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Gruß Goofy
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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 smiley

PS: hier mal ein Link von der ersten Steuerung


Gruß Goofy


Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ß
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad
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
« Last Edit: February 09, 2012, 02:50:43 pm by goofy79 » Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
   
Logged

Pages: [1]   Go Up
Jump to: