Serielle Datenstring vom Computer im Adruino Mega einlesen und aufteilen

NUMMER 1 LEBT!
Alles später .

Alles gut, den 1 Preis für Schnelligkeit werde ich nicht mehr erreichen können. :wink:
Das ich/wir Ausdauer besitzen, haben schon bewiesen.
Also... Alles Gut

Beim kompilieren kommt in dem Bereich ne Warnung.
Das soll sicher so aussehen:

    for (uint8_t i = 0; i < 3; i++) // das = war zuviel
    {
      if ((ExternLich_state[i]) == 1) { // und hier fehlte ein = damit war das immer wahr
        pixelAnAus(i, 1);
      }
    }

Dann hast Du das array ExternLich_state als uint8_t definiert. das ist zu gross.
mach daraus einen bool und dann true/false. Das wird eindeutig übersichtlicher.
Gleiches gilt für die Übergabe an pixelAnAus. Der Zahlenwert verwirrt.

Und zum testen der Tageszaehler mal umgebaut:

void merkeRunden()                                // Zählt alle Runden pro Spur zusammen
{
  for (uint8_t i = 1; i <= spuren; i++)
  {
    Serial.print(F("Tageszaehler aktuelle Spur: "))
    Serial.print(i);
    Serial.print("\t Rundenzahl :");
    Serial.print(AR[i]);
    Serial.print("\t letzte Rundenzahl");
    Serial.println(lastAR[i]);
    if (AR[i]  != lastAR[i])
    {
      TagZahl[i] = TagZahl[i] + AR[i] - lastAR[i];
      lastAR[i] = AR[i];
    }
  }
}

Wie Du siehst, addiere ich nicht starr +1 sondern ermittle den tatsächlichen Wert aus letzter und aktueller Rundenzahl.
Das sollte es evtl. sein.

Auszug aus dem Datenblatt der 1N5917B

Die 2. Kurve von links müßte die 4,3V sein und die 3. die 5,1V Zener. Die von Dir verwendete müßte dazwischen sein.
Die Zenerspannung wird laut Datenblatt bei den Folgenden Dioden bei folgendem Strom gemessen:
4,3V Zener bei 87,2mA
4,7V bei 79,8mA
5,1V bei 73,5mA
Also ziemlich weit oben.

Also bei 32V fließen durch den Spannungsteiler (ohne Z Diode)
32V/11,5kOhm = 2,7mA
Am Eingang des Arduino sind dann 4,17V

Wenn wir nun annehmen daß der gesamte Strom über die Z-Diode fließt dann hat die 4,7V Zdiode eine Z-Spannung um 3,7V.

Darum begrenzt die Z_Diode die Ausgangsspannung des Spannungsteilers auf geschätzte 3,7V. Darunter nimmt sich die Z-Diode mehr oder weniger strom was den Spannungsabfall am 10kOhm Widerstand vergrößert. Darum wird der Spannungsteiler bei Spannungen ab sagen wir mal 3,5V nicht mehr linear. Die Ausgangsspannung ist nicht mehr proportional zur Eingangspannung.

Abhilfe schafft statt der Z_Diode eine Schottky-Diode zwischen Analogeingang und Versorgungsspannung mit Kathode gegen Versorgungsspannung. Wird die Spannung am Spannungsteiler-Ausgang größer als Versorgungsspannung + 0,3V leitet die Diode und begrenzt so die Spannung. +0,3V sind vertretbar.

Grüße Uwe

Ein guten Morgen in die Runde.....
Heute mal kurz aus der Arbeit weil ich es gestern Abend nicht mehr geschafft habe. :sleeping:
@my_xy_projekt
Die LED's funktionieren jetzt wie sie sollen.....das mit <= hätte ich nicht vermutet.
Aber das andere hätte mir auffallen sollen......ich schäme mich.
Danke für's drauf schauen.

Der Tageszähler......macht mich verrückt (wenn ich's nicht schon bin) :wink:
Um den Hintergrund zu verstehen, kurze Info zum Rennablauf.
4 Spuren / 4 Fahrer

Beim Start werden die Lichtschranken überfahren und der Renncomputer(=RC) gibt für alle eine "0" aus.

Für jedes weitere überfahren der Lichtschranke pro Spur, erhöht sich der ensprechende Zähler.

Nun kommst, nach z.B. 3 Minuten ist das erste Rennen vorbei. (RC schaltet Bahnstrom ab)
Als Beispiel hat : Spur 1=25, Spur 2=24 Runden; Spur 3=21Runden;Spur 4=25 Runden geschafft.

Dann tauschen die Fahrer die Spuren. Der RC start den Bahnstrom und sobald der Wagen über die Lichschranke fährt wird der ensprechende Zähler der Spur auf "0" gesetzt und zählt dann seine gefahrenden Runden.

Im Prinzip sind es 4 kleine Rennen von a. 3Min. wo jeder Fahrer einmal jede Spur fährt.
Gewonnen hat der mit den meisten Runden....is ja klar.

Nun zum Tageszähler....
Der Rundenzähler zeigt ja nun 4 x die gefahrenden Runden an. Nehmen wir an jeder Fahrer schafft 25 Runden auf Spur 1
Der Rundenzähler Spur 1 würde dann 4 x von 0 bis 25 zählen.
Es wurden aber insgesammt 100 Runden auf Spur 1 gefahren, das wäre dann der Tageszähler.

Hier mal mein Versuch es zu zu realisieren......
Das Problem ist wenn zwischendurch ein Übertragungsfehler auftritt und ich eine "0" bekomme.

void merkeRunden()                                // Zählt alle Runden pro Spur zusammen
{
  for (uint8_t i = 1; i <= spuren; i++)
  {
    if (AR[i] != lastAR[i]){
    Serial.print(F("Spur: "));
    Serial.print(i);
    Serial.print("\t Rundenzahl :");
    Serial.print(AR[i]);
    Serial.print("\t letzte Rundenzahl ");
    Serial.print(lastAR[i]);
    Serial.print("\t Tageszahl ");
    Serial.println(TagZahl[i]);
    }
    if ((AR[i] > 0) && (AR[i] != lastAR[i]) && (lastAR[i] + 1 == AR[i])) {
      TagZahl[i] = TagZahl[i] + 1;
      lastAR[i] = AR[i];
    }
    else {
      lastAR[i] = AR[i];
    }
  }
}

@uwefed
Vielen Dank für die ausführliche Ausarbeitung, da ich gerade noch mit den Turm kämpfe möchte ich das Thema bis ich zum Konvertor (Er verarbeitet die Analogen Daten) verschieben.

Da ich nicht gerade der Elektroniker bin, halbseidiges Wissen....nenne ich es.
Kannst Du mir vielleicht sagen welche Schottky-Diode ich besorgen soll / kann.
Perfekt wäre auch vielleicht für die mitleser, eine kleine Skizze von der Verdrahtung. :smiling_face_with_three_hearts:

Dankeeeee :wink:

Turm_Empfaenger_V73.2.ino (60.9 KB)

Der Theoretiker zum "mal drüber schauen" bin ich eher nicht, daher bin ich jetzt erleichtert, wenn es funktioniert.

Applaus, Applaus :clap:

Na siehste - kleine Ursache, grosse Wirkung.

Ne, das Problem ist schon vorher, ich beschreib das mal:

START: AR=0; lastAR=0; Tageszaehler=0;
Ende 1. Session: AR=5; lastAR=5; Tageszaehler=5;

Start 2. Session: AR=0; lastAR=5; Tageszaehler=5;
Runde1 2. Sesssion: AR=1; lastAR=5; Tageszaehler=5;
-> Tageszaehler wäre jetzt: Tageszaehler=Tageszaehler+lastAR-AR
Falsch, weil: AR=1; lastAR=1; Tageszaehler=9

Ich glaub der Ansatz lässt sich vereinfachen.
Grundlage wird:

Meine Idee wäre den Merker lastAR[] und AR[] mit abschalten der Versorgung auf 0 zu setzen.
AR[] wird aus dem RC gefüttert.
Geprüft wird jetzt auf AR[]>lastAR[], der Rest wie sonst bei mir - fertig.
Damit erschlage ich zwei Probleme: Wenn eine 0 kommt, wird nicht aufaddiert weil nicht statisch auf != verglichen und +1 gemacht.
Gleichzeitig wird der Tageszähler mit dem Start einer weiteren Session nicht mit den gemerkten Werten aus der vorherigen Session gefüttert. (Siehe oben "9")

Vielleicht so?

void merkeRunden()                                // Zählt alle Runden pro Spur zusammen
{
  for (uint8_t i = 1; i <= spuren; i++)
  {
    Serial.print(F("Tageszaehler aktuelle Spur: "))
    Serial.print(i);
    Serial.print("\t Rundenzahl :");
    Serial.print(AR[i]);
    Serial.print("\t letzte Rundenzahl");
    Serial.println(lastAR[i]);
    if (AR[i] > lastAR[i])
    {
      TagZahl[i] = TagZahl[i] + AR[i] - lastAR[i];
      lastAR[i] = AR[i];
    }
    if (VoltVK[i] == 0)
    {
      AR[i] = 0; lastAR[i] = 0;
    }
  }
}

Eine schöne Idee wenn da nicht.....die Abschaltung unter der Bahn erfolgen würde. :woozy_face: Der Bahnstrom wird in der Nähe des RC abgenommen. Das heiß wenn der RC den Strom abschalten habe ich am Analogen-Eingang noch Spannung anliegen.

Sorry, wenn ich Dich mit der Bahnabschaltung auf eine falsche Fährte gelenkt habe. Bin am überlegen ob ich die else Funktion weiter ausbauen sollte.....

Ganz nach dem Motto..... Was war vorher....was kam nach der "0" addiere +2
Was hältst Du davon?

....sagt zum Praktiker "Theoretisch sollte es funktionieren"
der Praktiker antwortet....Was in der Theorie funktioniert, muss in der Praxis noch lange nicht funktionieren. :joy: :joy: :joy:

Aber gut das ich das jetzt weiß.....bekommst dann nur noch Aufgaben :wink: :joy:

Dann ist was faul.
Wenn die Ladung nicht aufgebraucht wird, gehört die Schaltung überarbeitet.
Wenn ich das weiter spinne, stimmt ja sonst auch nicht die Anzeige, wenn es eine viel zu große Verzögerung gibt.

Man könnte natürlich auch noch die StartAmpel als Bezugspunkt nehmen.
Geht die inden Zustand Start, wird AR uns lastAR genullt.

Du brauchst in jedem Fall einen Startwert, der mit dem SessionStart korreliert.

IMG_2296
Im Anhang auf die schnelle.....die Schaltung.

Geht leider auch nicht...da diese nur beim ersten Rennstart arbeitet.
Und meine Idee... else Ausbau vorher/nachher ? Mist oder Möglichkeit?

Hast Du noch nen freien PIN?
Optokoppler an der Steuerleitung zum Relais anpinnen und den Ausgang dessen via digital-IN verwerten.

Alternativ ein zweites Relais.

Erschlägt alles.

Und da war noch Chaos....wenn mehrere Autos auf einmal abfliegen wird auf die Notaustaste gedrückt. Dabei wird der Bahnstrom abgeschaltet damit nachfolgende Autos nicht in die auf der Bahn liegenden Autos rasen und Schrott produzieren. Fällt somit auch das, leider auch aus...... :worried:

Auch wenn ich jetzt damit nerve....
Aber wenn ich nun nach einer "0" einen Merker setze und anschließend vergleiche nächste AR>1 = Rennen läuft noch lastAR+2, weil AR==1 wäre ja dann ein neues Rennen.

Oder verrenne ich mich gerade.....

Wann entscheidet sich, das AR und lastAR zurück gesetzt werden?
Wenn Du dreimal keinen verwertbaren Rundenwert bekommst?

Auswerten.
Ist NotAus gedrückt, wird die Funktion merkeRunden() nicht ausgeführt.

Du kannst in Software nicht abbilden, was Dir die Hardware nicht gibt.
Schaltet das NotAus die Fahrwegversorgung (das Labornetzteil) ab oder liegt der im Steuerkreis?

AR kommt ja vom RC und lastAR wenn AR 0 war und anschließend 1 ist.

Dann Fehlmessung bzw. falsche Werte in der Tageszahl....mhmm

liegt im Steuerkreis als Öffner

Eingangs-Pin sind noch welche frei.

Aber eins verstehe ich nicht, warum taucht bei der Rundenmessung die 0 nicht auf?

Na ist doch schick.
Dann in der Leitung zwischen RC und NotAus quer ein zusätzliches Relais rein.


            NotAus
              |
RC: #-+------*-*-+
      |          |      
      |         ----
      |         |FahrRelais
      |         ----
     [ ]Zusatz   |
      |          |
RC: #-+----------+

Alternativ(!) Und nur in der allergrößten Not:

Könnte man alle Spuren abfragen und wenn alle 0 sind, werden alle Werte zurückgesetzt.

Ist vor Ort nicht ganz so schick, weil dann müsste ein Kabel von unter der Bahn zurück zum RC.....ca.10 Meter.

Mhmm fällt mir gerade ein, Signal Notaus(Chaos Licht) habe ich ja bereits, aber bringt ja nicht wirklich weiter. Es stehen mir noch dreimal keinen verwertbaren Rundenwert im Raum.

Tageszähler verwerfen und als nächstes den führenden Fahrer im Rundenzähler auf den TM1637 Zeilenweise mit mehr Helligkeit hervorzuheben....oder vielleicht sollte ich mal damit aufhören immer mehr zu wollen :thinking:

Aber noch eine andere Sache wo ich gerade bei den TM's sind. Weißt Du wie ich den Doppelpunkt bei der Uhr setzen kann mit setegments(0x40) bekomme ich sie an aber der Rest dahinter verschwindet.

Warum?
Das muss doch schon da sein?
Das Relais zieht doch nicht, wenn nur ein Pin am Relais versorgt wird.
Oder läuft das alles auf einem gemeinsamen GND... Der dann irgendwoanders raus kommt?

Was war das ? Plötzlich stand mein Text als Edit wieder da......Merkwürdig

Aber richtig vermutet, es läuft alles auf gemeinsamen GND.

Ja, heute ist einiges merkwürdig...

Na dann nimm den doch. Das Relais "Zusatz" am RC und auf der anderen Seite an irgendwas mit dem gemeinsamen GND - Da brauchst nirgendwo runter krauchen und hast es nebem dem Turm.

Leider doch, Turm und Bahnsteuerung stehen auch ca.7 Meter auseinander. Mal sehen entweder ich schmeiß den Tageszähler wieder raus oder ich nehme die Fehlrunden in Kauf....rechnet eh keiner nach :wink: