Forum: Mikrocontroller und Digitale Elektronik Suche Zeitanzeige mit Serial.print


von Udo W. (einstein55)


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

von Stefan F. (Gast)


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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Udo W. schrieb:
> Der zeigt mir das so an wie ich es gerne sehen würde, ausser ich hätte
> gerne dort min:sec

> Serial.print (pitch/1000);

 Wie ?

 Das zeigt dir einen Wert, welcher kleiner 0.1 ist - wie willst du
 daraus min:sec kriegen ?

von Udo W. (einstein55)


Lesenswert?

Hallo Stefan,

pitch ist ein Messwert von einem 0-5V Sensor ausgelesen mit analog read 
();

Ich will nur Messwerte erhalten bei bestimmten Abweichungen und dabei 
sehen wann es war ab Start.

von Patrick J. (ho-bit-hun-ter)


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

von Udo W. (einstein55)


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?

von arduinoooooo (Gast)


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

von Stefan F. (Gast)


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.

von arduinoooooo (Gast)


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?

von Udo W. (einstein55)


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

von Dirk B. (dirkb2)


Lesenswert?

1. Dann musst du feststellen, ob seit der letzten Ausgabe mehr als 1000 
ms vergangen sind

2. Ist dir der Zusammenhang zwischen Sekunden, Minuten und Stunden 
bekannt?

Kennst du den Modulo-Operator % ?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Udo W. schrieb:
> 1. die Ausgabe ist alle 13µsec
>     ich bräuchte die nur  alle sec
1
  if (!(millis % 1000)) {...}


>
> 2. das Ausgabeformat min  sec wäre mir doch lieber
1
 temp = millis / 1000;
2
 minute = temp / 60;
3
 sekunde = temp % 60;

von guest (Gast)


Lesenswert?

und die Minuten kannst Du Dir aus den Sekunden nicht selbst berechnen?

von Dirk B. (dirkb2)


Lesenswert?

Marc V. schrieb:
>   if (!(millis % 1000)) {...}

Das könnten ein paar Ausgaben zuviel sein ...

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Dirk B. schrieb:
> Marc V. schrieb:
>>   if (!(millis % 1000)) {...}
>
> Das könnten ein paar Ausgaben zuviel sein ...

 Warum ?
 Kläre mich auf, bitte...

von Dirk B. (dirkb2)


Lesenswert?

Marc V. schrieb:
> Dirk B. schrieb:
>> Marc V. schrieb:
>>>   if (!(millis % 1000)) {...}
>>
>> Das könnten ein paar Ausgaben zuviel sein ...
>
>  Warum ?
>  Kläre mich auf, bitte...

Die Bedingung ist eine ganze Millisekunde wahr.

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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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

Ja, deshalb sollte man noch eine Variable last_millis mitführen.

Also:
1
  if (!(millis % 1000) && last_millis != millis)
2
  {
3
    last_millis = millis;
4
    ...
5
  }

von Marc V. (Firma: Vescomp) (logarithmus)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Joe F. (easylife)


Lesenswert?

Frank M. schrieb:
> if (!(millis % 1000) && last_millis != millis)
>   {
>     last_millis = millis;
>     ...
>   }

das hat wiederum den Nachteil, dass keine Ausgabe passiert wenn man die 
eine Millisekunde nicht genau "trifft".

Vorschlag:
1
if ((millis - last_millis) >= 1000)
2
{
3
  last_millis = millis;
4
  ...
5
}

von Dirk B. (dirkb2)


Lesenswert?

Joe F. schrieb:
> Vorschlag:if ((millis - last_millis) >= 1000)
> {
>   last_millis = millis;
>   ...
> }

So in etwa war das gemeint.

Wenn man jetzt noch dafür sorgt, das last_millis ein Vielfaches vom 
Intervall (1000) ist, verschiebt sich die Ausgabezeit auch nicht.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Frank M. schrieb:
> Danach würde ich niemals gehen.

 LOL.
 Ich auch nicht.

 Trotzdem ist Ausgabe alle 13us ganz einfach unmöglich.
 Es geht um min:sec + ADC Wert.


Joe F. schrieb:
> das hat wiederum den Nachteil, dass keine Ausgabe passiert wenn man die
> eine Millisekunde nicht genau "trifft".

 Stimmt, aber gerade deswegen gibt es Flags und state machine.

von Udo W. (einstein55)


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.

von Dirk B. (dirkb2)


Lesenswert?

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.

von Erwin D. (Gast)


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.

von Udo W. (einstein55)


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

von Dirk B. (dirkb2)


Lesenswert?

1
if (pitch > 20 || pitch < -20){
2
3
  und den Code nur einmal
4
5
}

von Stefan F. (Gast)


Lesenswert?

> und meinst du nicht vielleicht eher
> unsigned long dauer=millis()-start; ?

Ja stimmt. Habe mich vertippt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.