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
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?
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 ?
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.
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
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?
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
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.
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?
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
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 % ?
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; |
und die Minuten kannst Du Dir aus den Sekunden nicht selbst berechnen?
Dirk B. schrieb: > Marc V. schrieb: >> if (!(millis % 1000)) {...} > > Das könnten ein paar Ausgaben zuviel sein ... Warum ? Kläre mich auf, bitte...
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
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 | }
|
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.
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.
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 | }
|
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.
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.
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.
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.
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.
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
1 | if (pitch > 20 || pitch < -20){ |
2 | |
3 | und den Code nur einmal |
4 | |
5 | }
|
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.