Suche Zeitanzeige mit Serial.print

OP #4927467
Lesenswert?

Hallo,

Ich suche die Funktion für die "Zeitanzeige"

Bekannt ist mir der Code:

if (pitch<100){
                        Serial.print ("Zeitanzeige  ");
                        Serial.print (pitch/1000);
}

Der zeigt mir das so an wie ich es gerne sehen würde, ausser ich hätte 
gerne dort min:sec
stehen seit Start mit einem Taster, der bereits mit switch case 
eingebaut ist und noch frei verfügbar ist.

Vielen Dank für eine Hilfestellung
Gast #4927480
Lesenswert?

Dann musst du deine Zahl in Stunden und Minuten zerlegen, und dann diese 
nacheinander ausgeben.

Weisst, du, wie man eine Zahl in Stunden und Minuten zerlegt?

Was ist denn eigentlich pitch? Millisekunden, Sekunden, Minuten, oder 
was?
#4927564
Lesenswert?

Hi

Das wird wohl Normales' C sein (zumindest sieht mir Das nicht nach 
Arduino aus) - welcher µC hört denn dort auf Deine Instruktionen?
Beim Arduino hättest Du den Wert mills - bei einem nackten µC müsste man 
sich selber um die Vergangenheit kümmern - also einen Zähler mitzählen 
lassen, aus der Taktfrequenz, dem Vorteiler und dem Zählerwert kannst Du 
die vergangene Zeit berechnen.

MfG
OP #4927727
Lesenswert?

Arduino Uno ist dabei....
Zähler mit millis (); ist gut,
Auslesen und umrechnen und anzeigen ist auch gut,
Aber, wie starte ich den Zähler und setze den mit StartTaste  auf Null 
und
wie lese ich die abgelaufene Zeit aus und zeige die an der Position 
"Zeitanzeige  "vor dem Sensorwert in einer Zeile an?
Gast #4927737
Lesenswert?

Da muss man sich ein bisschen Gedanken machen. Sicher gibt es da fertige 
Lösungen. Versuche dein Problem zu zerlegen und systematisch zu lösen.
Möglich wäre:

loop
Variable für Zähler etstellen "time"
time = millis

If tasterstatus == 1
Time =0

Ausgabe der zeit

usw.

Dabei wirst zB über Probleme stolpern wie überlaufen der Variable time 
nach der 32,767s, wenn als int deklariert usw.
Learning by doing. Das sind Grundlagen
Gast #4927786
Lesenswert?

Dieser Lösungsansatz von arduinoooooo ist ganz schlecht.

Dieser Millieskunden Timer ist nicht dazu gedacht, zurückgesetzt zu 
werden. Und es fehlt eine Lösung für den Überlauf. Richtig macht man das 
so:

unsigned long start=millis();
tu irgendwas....
unsinged dauer=millis()-start;

Bei einem Überlauf tritt kein Rechenfehler auf. Bei zweifachem Überlauf 
aber schon - der ist allerdings äußerst unwarscheinlich, weil das 99 
Tage dauern würde.
Gast #4927791
Lesenswert?

Stefan U. schrieb:
> unsigned long start=millis();
> tu irgendwas....
> unsinged dauer=millis()-start;

Recht hast du. War schon spät. Bei dir fehlt jetzt jedoch noch die If 
bedingung, sodass Uwe versteht, dass start nicht in jedem Durchlauf auf 
millis gesetzt wird.
Zwecks Überlauf wollte ich nur zum selbst nachdenken anregen.
Und meinst du nicht vielleicht eher
unsigned long dauer=millis()-start;?
Oder was würde man damit bezwecken, wenn der Datentyp fehlt?
OP #4927917
Lesenswert?

hallo,

einen Schritt weiter bin ich bereits

   if (pitch>20){
     dauer=millis()-start;



     Serial.print(dauer/1000);
     Serial.print(" sec  ");
     Serial.print(pitch/200);       //pitch gemappt auf -511/511
     Serial.println(" V ");
}

Ausgabe:  xxx sec 0,08 V     fast richtig.....

trotzdem ist das noch nicht gelöst, mein Problem.


1. die Ausgabe ist alle 13µsec
    ich bräuchte die nur  alle sec

2. das Ausgabeformat min  sec wäre mir doch lieber
(Firma: Vescomp) #4928077
Lesenswert?

Dirk B. schrieb:
> Die Bedingung ist eine ganze Millisekunde wahr.

 Das ist wahr, natürlich.


> Wenn vorher alle 13 µs eine Ausgabe kam, dann sind das ca. 76 Durchläufe
> in der einen Millisekunde

 Das ist natürlich Blödsinn (nicht du, der TO).
 Ausgabe kann nicht alle 13us erfolgen.
 Bei 38400B sind es gerade 4 Zeichen pro ms.
 Was er auch immer über Serial.println() ausgibt, es dauert bestimmt
 länger als 1ms.

Frank M. schrieb:
> Ja, deshalb sollte man noch eine Variable last_millis mitführen.

 Auch wahr.
Moderator Persönliche Seite #4928095
Lesenswert?

Marc V. schrieb:
> Was er auch immer über Serial.println() ausgibt, es dauert bestimmt
> länger als 1ms.

Danach würde ich niemals gehen. Erstens kennst Du nicht die Baudrate, 
zweitens weisst Du nicht, ob Serial.println() das Zeugs nicht einfach in 
einen Ringbuffer kippt, der asynchron an die serielle Schnittstelle 
übergeben wird. In diesem Fall kriegst Du innerhalb der einen 
Millisekunde vermutlich so viel rein, wie der Ringbuffer fassen kann.

Und selbst, wenn Du es weisst (durch Nachschauen im Serial-Quellcode): 
Du weisst nicht, ob die Serial-Lib ab dem nächsten Update nicht anders 
arbeitet.
OP #4928187
Lesenswert?

Back to Thread. ....

Das war  ein Fehler meinerseits.
Ich bekam alle 13 millis " Steine auf mein Haupt" eine Anzeige.
Das sind keine Microschritte gewesen.

Die ganzen Vorschläge zum timing muss ich erstmal sacken lassen...

Mich wundert es, das ich ohne diese milli-Ausgabe vorher den Sensorwert 
im ca Sekundentakt erhalten hatte.
Die millis zählen auch sobald der  Sketch im Uno geladen ist, ohne das 
ich sie starten musste.
Mit der StartTaste konnte ich dann den milliwert Nullen.
Gast #4928272
Lesenswert?

Dirk B. schrieb:
> Udo W. schrieb:
>> Mich wundert es, das ich ohne diese milli-Ausgabe vorher den Sensorwert
>> im ca Sekundentakt erhalten hatte.
>
> Die Ausgabe der Zeichen (Zeit und ADC-Wert) braucht auch Zeit.

Eine Sekunde? Er ist zwar nicht der schnellste, aber soooo 
schnarchlangsam ist er nun auch wieder nicht.
OP #4928461
Lesenswert?

supi, habs fertig

läuft auch wieder im ca Sekunden Rhytmus, war auch mein Denkfehler
ich hatte zwischendurch zum testen eine weitere Sensorabfrage über 
pulseIn
ausgeklinkt, und da wurde der Sketch doch gleich wesentlich schneller.



   if (pitch>20){
     dauer=millis()-start;
     temp=dauer/1000;
     Serial.print(temp/60);
     Serial.print(" min ");
     Serial.print(temp%60);
     Serial.print(" sec  ");
     Serial.print(pitch/200);
     Serial.println(" V ");}

   if (pitch<-20){
     dauer=millis()-start;
     temp=dauer/1000;
     Serial.print(temp/60);
     Serial.print(" min ");
     Serial.print(temp%60);
     Serial.print(" sec  ");
     Serial.print(pitch/200);
     Serial.println(" V ");}

Ausgabe:  xx min yy sec (-5,0 bis -0,1 und 0,1 bis 5) V

Vielen Dank allen für die Hilfe
Udo

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren