Go Down

Topic: Beschleunigungsmessung (Read 3417 times) previous topic - next topic

Doc_Arduino

Hallo,

ich würde einen Taster nehmen und damit die ganze Sache wieder "Nullen" wie bei einer Stoppuhr. Da das Zustandsgesteuert ist, sollte das kein Problem sein. Ein Programm mit dem echten Resettaster zubeenden geht zwar auch, ist aber unschön programmiert.

Was du auch noch erweitern kannst ist, eine laufende Anzeige sobald es losgeht. Auch wie bei einer Stoppuhr. Der Beifahrer will ja was zum gucken haben. :)

Wegen dem Wert speichern usw., dass würde ich etwas anders machen. Ich würde innerhalb vom Programm keine float verwenden. Überall mit der Ganzzahl millis arbeiten. Und erst wenn es zur Anzeige kommt, Display oder sonstwas, erst dann würde ich die Ausgabe auf Menschen freundlicherer Einheiten formatieren. Damit haste intern "keinerlei" Rundungsfehler zubefürchten.


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Medolino73

ja also taster würd ich schon gerne weglassen, wenn das irgendwie ginge das sobald 0 ansteht auch da der reset ist und erst bei 1 die zeit rennt, wenn nicht geht bleibt mir nix anderes übrig, die lauffende zeit anzuzeigen wäre natürlich die krönung, mal schaun ob man das so hinbekommt

Doc_Arduino

Hallo,

die Automatikerkennung und dessen Nullen ist natürlich auch möglich.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Medolino73

Hi,

wird das genauso mit enum gemacht oder doch anders, und wie das Zeitresetten geht weis ich erlichgesagt im moment nicht

Doc_Arduino

Hallo,

Thema Nullen wenn "Start versaut".
Mit Taster wäre es leichter. Aber nun guckt.
Die Frage ist, kann dein CAN Bus so schnell reagieren, dass es beim anrucken schon einen VSS größer 0 rausgibt?
Danach richtet sich alles weitere, laut meiner Meinung.
Wenn VSS auf Null bleibt, muss man ein zeitliches Timeout einbauen. Das heißt das Auto muss diese Zeit still stehen.
Wenn VSS schon zuckt beim Ruckler, dann sollte die Zustandsabfrage neu kombiniert ausreichend sein.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Medolino73

#35
Mar 29, 2017, 11:32 am Last Edit: Mar 29, 2017, 11:40 am by Medolino73
Also die ausgabe vom canbus ist schon ziehmlich nahe an echtzeit, müßte so sein das, wenn sich innerhalb einer sekunde sich nix tut, also immer noch bei 0 steht, der reset erfolgt, sobald aber über 1kmh die geschichte ganz normal läuft und die zeit hochzählt

Doc_Arduino

Zeit-Anzeige ohne Null-Taster:
reine Überlegung erstmal
Die Verarbeitungsfunktion errechnet die Zeitdifferenz. Diesen Wert lässt du dir in einer Funktion "Anzeige" ausgeben. Die Trennung in Funktionen erleichtert das programmieren und ändern, auch wenn es vielleicht auf den ersten Blick nicht danach aussieht.

Nullen:
gut, dann überlege dir eine Erkennung aus den Zuständen heraus. Also du hast verschiedene Werte, alle etwas verschieden, die müssen jetzt logisch verknüpft werden. Meinetwegen kannste die enum Variable beliebig erweitern.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Medolino73

also irgendwie schnall ich das nicht, wie man die Zeit jetzt ausgibt damit man es sieht wie es hochläuft, gibts dafür eine spezielle funktion oder einfach nur logic

Doc_Arduino

Hallo,

aktuell ist das "nur" ein kombinieren der vorhandenen Daten.  :)
In welchen Zustand läuft denn die aktuelle Zeit derzeit im Hintergrund? Richtig, im RUN Zustand. Laut meinem aktuellen Sketch.
Wenn der Zustand da ist, errechnest du permanent die aktuelle Differenz zur Startzeit und gibts diese aus.
Dabei kannst du auch die Variable Zeit verwenden. Für dieses Zwischenspiel.
Diese wird am Ende, wenn 100 erreicht eh mit dem dann aktuellen Wert überschrieben.
Reicht das um den Code zu schreiben?

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Medolino73

ja so hab ich das versucht mit dem berechnen, aber habs nicht hinbekommen mit permanent berechnen

Doc_Arduino

Hallo,

zeig mal deinen Sketch. Vielleicht besser den Fehler zu zeigen wie fertigen Code.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Medolino73

Habs wieder rausgenommen, da er eh nicht funktioniert hat, aktuel sieht der code so aus
Code: [Select]
#include <FlexCAN.h>
#include <EEPROM.h>

static CAN_message_t rxmsg;
typedef enum {
  STOP, RUN, ENDE, LIVE
} state;
state Zustand = STOP;
int VSS = 0;

unsigned long startMillis = 0;
unsigned long endMillis = 0;
float ZeitA = 0.00;


int Zeit = 0;
int eep = 0;

void setup() {
  Serial1.begin(115200);
  Can0.begin(500000);
}

void loop() {
  char  inByte = Serial1.read();
  switch (inByte) {
    case 'r':
      EEPROM.put( 0, 99990 );
      break;
  }
  display();
  Verarbeitung();
}

void Verarbeitung() {
  if (VSS > 0 && Zustand == STOP) {
    startMillis = millis();
    Zustand = RUN;
  }

  if (VSS > 100 && Zustand == RUN) {
    endMillis = millis() - startMillis;
    ZeitA =  endMillis / 1000.00;
    if (endMillis < EEPROM.get( 0, eep )) {
      EEPROM.put( 0, endMillis );
    }
    Zustand = ENDE;
  }
  if (VSS < 1 && Zustand == ENDE) {
    Zustand = STOP;
  }
}

void display() {
  if (Can0.read(rxmsg)) {
    switch (rxmsg.id) {
      case 1562:
        VSS = (int)(word(rxmsg.buf[0], rxmsg.buf[1]) / 2.76);
        break;
    }
    Serial1.print("t401.txt=");
    Serial1.write(0x22);
    Serial1.print(VSS);                                                               //Geschwindigkeit
    Serial1.write(0x22);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);

    Serial1.print("t402.txt=");
    Serial1.write(0x22);
//    Serial1.print(ZeitB);                                                            //Aktual Time
    Serial1.write(0x22);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);

    Serial1.print("t403.txt=");
    Serial1.write(0x22);
    Serial1.print(ZeitA);                                                            //Last Time
    Serial1.write(0x22);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);

    Serial1.print("t404.txt=");
    Serial1.write(0x22);
    Serial1.print(EEPROM.get( 0 , eep ) / 1000.00);                                   //Best Time
    Serial1.write(0x22);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);
  }
}

Doc_Arduino

Hallo,

ich wollte und möchte aber schon den Teil sehen den du versucht hast, damit man eher und gezielter auf das Problem eingehen kann.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Medolino73

Hatte das so ursprüglich drin aber das ging nicht
Code: [Select]
if (VSS > 100 && Zustand == RUN) {
    endMillis = millis() - startMillis;
    ZeitB =  startMillis = millis() - endMillis / 1000.00;
    if (endMillis < EEPROM.get( 0, eep )) {
      EEPROM.put( 0, endMillis );
    }
    Zustand = ENDE;
  }

ich versteh nur noch nicht warum nicht der aktuelle wert ausgegeben wird, egal jetzt ob millis oder schon umgerechnet in sekunden

ausgabe hab ich dann auf Serial.print(ZeitB);

Doc_Arduino

Hallo,

Okay, alles klar. Du möchtest die laufende Zwischenzeit ausgeben.
Das wäre laut deiner etwas unglücklichen Bezeichnung endmillis. Aber erstmal egal.
endmillis ist
a) deine laufende Zwischen-Zeitdifferenz
b) deine Zeitdifferenz am Ende

2 Zuweisungen in einer Zeile, habe ich noch nie probiert.  :)

Dein Problem ist, du willst ja die Zwischenzeiten haben während der RUN läuft.
Du hast im Grunde nichts geändert. Außer eine neue Variable hinzugefügt.
Das alles wird nur ausgeführt, wenn VSS größer 100 und der Zustand RUN ist.
Du möchtest jedoch die Zwischenzeiten haben wenn nur der Zustand RUN ist. Alles andere ist egal.

Du machts jetzt was?


Quote
if (VSS > 100 && Zustand == RUN) {
  endMillis = millis() - startMillis;
    ZeitB = startMillis = millis() - endMillis / 1000.00; // meckert der Compiler hier nicht rum?
    if (endMillis < EEPROM.get( 0, eep )) {
      EEPROM.put( 0, endMillis );
    }
    Zustand = ENDE;
  }
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up