Hallo Leute,
ich habe aktuell ein Problem bei dem ich nicht weiterkomme. Und zwar möchte ich in meinem Code Milisekunden in Sekunden umrechnen, sprich das Koma verscieben. Bis jetzt habe ich das mit Potenzen versucht. Der gewünschte Erfolg blieb aber leider aus. Im Serialmonitor verschiebt sich jetzt nicht das Komma, sondern r zählt einfach ins Negative. Hat jemand von euch vielleicht ne idee?
Hier nochmal der Code zur Übersicht.
#include <StopWatch.h>
StopWatch sw_millis; // MILLIS (default)
StopWatch sw_micros(StopWatch::MICROS);
void setup() {
float sec;
int mili;
int v;
int entfernung = 3; //Entfernung in Cm von Messpunkt 1 zu Messpunkt 2
Serial.begin(9600);
sw_millis.start();
sw_micros.start();
}
void loop() {
int mili = sw_millis.elapsed();
Serial.print("sw_millis=");
Serial.println(sw_millis.elapsed());
Serial.print("sw_micros=");
Serial.println(sw_micros.elapsed());
float sec = mili*10^(-6);
Serial.println(sec);
delay(1000);
}
Ist bis jetzt nur der Testcode der StopWatch Libary. Später soll die Stoppuhr gestartet werden wenn ein Sensor getriggert wird, und wieder angehalten wird wenn ein zweiter getriggert wird. Und aus dem Wert und der Entfernung zwischen den zwei Messpunkten errechne ich dann die Geschwindigkeit. Und es müssen Milisekunden sein, da die Messstrecke vorraussichtlich nur 5 cm lang ist. Was ich mir jetzt übrlget habe, da ich in die Formel v= s/t ja auch nicht meter sondern Centimeter einsetze, ob ich nicht gleich auch Milisekunden einfügen kann, und das dann später von cm/milisekunde in meter/sekunde umrechnen kann, in dem ich beides mal 100 nehme?
datus:
Was ich mir jetzt übrlget habe, da ich in die Formel v= s/t ja auch nicht meter sondern Centimeter einsetze, ob ich nicht gleich auch Milisekunden einfügen kann, und das dann später von cm/milisekunde in meter/sekunde umrechnen kann, in dem ich beides mal 100 nehme?
Am besten rechnest Du die Strecke in Millimetern und die Zeit in Millisekunden.
Bei der Division Millimeter pro Millisekunde kannst Du das Milli dann kürzen:
Ein Millimeter pro Millisekunde ist derselbe Zahlenwert wie ein Meter pro Sekunde, ohne Umrechnungsfaktor.
Besser ist aber man schreibt bei sowas eine normale Gleitkommazahl (bzw. man macht eine Division daraus), auch wenn es weniger leserlich ist. Die wissenschaftliche Schreibweise kannst du in einen normalen Kommentar dahinter packen.
pow() willst du nicht.
const float factor = 1.e-6; // wenn du die ZehnerPotenz-Schreibweise verwenden möchtest.
Ich glaube nicht, dass der Compiler pow(10,-6) zur Compilierzeit ausrechnet, ausserdem sieht es auch nicht schöner aus.
Generell sollten bei MicroControllern Gleitkomma-Berechnungen nur "im Notfall" verwendet werden, da hierfür keine Hardware-Unterstützung vorhanden ist und alles per Software ( langsam, mit Befehlen Flash-Speicher ) germacht wird.
Stimmt. Da geht auch. Ganz vergessen, da ich es kaum verwende
Man sieht auch wieder sofort die typischen Rundungsfehler. In Visual Studio macht er da 9.999999747 * 10^-6 draus. Bei double (was es auf dem Arduino nicht gibt) macht er dann immerhin 1.0000000000000001 * 10^-5
double gibt es auf dem Arduino.
Man kann auch viel mit Ganzzahlen machen. float braucht man nicht unbedingt.
Wobei die Rechenzeit nicht der entscheidende Unterschied ist, sondern die Genauigkeit, wie schon angesprochen wurde.
ich wollte Dich jetzt wirklich nicht ärgern. Ich hatte es falsch in Erinnerung. Großes Entschuldigung. =(
Ich dachte das double und float zwar beide 4Byte groß sind, aber double eben Ganzzahlig und float Fließkomma. Stimmt aber nicht. double und float sind beide Fließkomma. Außer beim Due. Dort ist double 8Byte groß. So wie Du schon richtig geschrieben hast.