Hilfe bei Code Erstellung anhand eines Ablaufdiagramms

Hallo zusammen,

ich bräuchte im Rahmen einer Projektarbeit, Hilfe bei der Erstellung eines Codes.

Der Ablaufdiagramm dazu steht bereits. Könnte mir da jemand netterweise weiterhelfen.

Die Abgabe wäre schon morgen.

Danke schon mal!



Das ist sehr ambitioniert.
Seit wann kennst du die Aufgabe?

Dazu muss gesagt sein, es ist ein Gemeinschaftsprojekt und wir haben dazu schon was gemacht. Nur sind wir jetzt stecken geblieben.
Wir haben uns folgende Variablen überlegt:

Globale Variablen:

Wagenplatz_1 = 1
Wagenplatz_2 = 2
Wagenplatz_3 = 3

Lagerplatz_1 = 1-1-1
Lagerplatz_2 = 1-1-2
Lagerplatz_3 = 1-1-3

LED_Wagenplatz_1 (Pin 2)
LED_Wagenplatz_2 (Pin 3)
LED_Wagenplatz_3 (Pin 4)
LED_Lagerplatz_1 (Pin 5)
LED_Lagerplatz_2 (Pin 6)
LED_Lagerplatz_3 (Pin 7)

Variablen für Funktion ZeileLesen:
Char ZeichenEinlesen (liest den Auftrag aus dem SM ein, Typ char)
String EinlagerAuftrag (speichert nach und nach die Zeichen von ZeichenEinlesen)

Variablen für Funktion ZeileZerlegen:

Char NächstesZeichen (typ char);
String Feld[5] (Variable um 5 Felder des Auftrags zu speichern)
Int FeldAnz (als Feldzähler; kriterium für die while-Schleife =<5)
Int Len (Variable um zu Wissen wann man am Ende der Zeile angekommen ist > EinlagerAuftrag.length() )
Int Pos (Variable um das Ende der Zeile in Kombination mit Len und Trennzeichen zu ermitteln „#“)

Der bisherige Code:

int Wagenplatz[]= {1,2,3};                        //Array für Wagenplatzunummer
char array Lagerplatz[]= {"1-1-1","1-1-2","1-1-3"};   //Array für Fachnummer
char array EinlagerAuftrag;                           //Variable für Einlesen der Zeile aus der Schnittstelle (Serial-Monitor)
char c;                                           //Variable um den nächsten Buchstaben aus der Schnittstelle einzulesen
char NaechstesZeichen;                             //Variable um den nächsten Buchstaben aus dem Einlagerauftrag zu lesen
char array Auftragsstelle[4];                        //Array um den Auftrag in die verschiedenen Stellen zu zerlegen



void setup() {
 Serial.begin(9600);
}

String EinlagerAuftragLesen(){   // Funktion um Auftrag einzulesen
  EinlagerAuftrag="";
  while(Serial.available()){
    c=Serial.read();
    EinlagerAuftrag+=c;
    delay(2);
   }
   return EinlagerAuftrag;
  }

String EinlagerAuftragZerlegen(){                       // Funktion um Auftrag zu zerlegen
  int StellenAnzahl = 0;                               //als Feldzähler; kriterium für die while-Schleife <5
  int Laenge = EinlagerAuftrag.length();
  int ZeichenPosition = 0;
  while((ZeichenPosition<Laenge) && (StellenAnzahl<5)){
    NaechstesZeichen=EinlagerAuftrag[ZeichenPosition];
    if (NaechstesZeichen=='#'){
      StellenAnzahl++;
    }
    else{
      Auftragsstelle[StellenAnzahl]+=NaechstesZeichen;
    }
    ZeichenPosition++;
  }

  }
  
void loop() {

 if(Serial.available()){
  EinlagerAuftragLesen();
  Serial.print(EinlagerAuftrag[5]);
 }
 }

Setze Deinen Code bitte in Codetags. Wie das geht, steht hier.
So ist er nicht lesbar.

Gruß Tommy

Das Ziel ist folgendes:

  1. Einlagerauftrag soll im serial monitor eingegeben werden (Format: Barcode#Artikelname#Menge#Lagerplatz#Wagenplatz; Beispiel: O 332 414 823#Schraube#3#1-1-2#2)
  2. Lagerplatz und Wagenplatz sollen "herausgefiltert" werden (Stellen 4 und 5 des Auftrages)
  3. Entsprechend sollen die zugewiesen PIN´s des Arduinos "angesteurt" werden und die entsprechenden bzw. an diesen Pins angesteckte Lämpchen sollen auf dem steckboard leuchten

Wir haben mit dem loop am ende des bisherigen codes versucht, dass uns der serial monitor nach der Eingabe des Einlagerauftrages die Stelle 4 also den Lagerplatz herausgibt, was aber leider nicht funktioniert hat.
um ehrlich zu sein, sind wir aufgeschmissen. Wir wissen einfach nicht wie wir hier weiterkommen.
Den Code werde ich gleich in Codetags setzen.

Warum ignorierst Du unsere Bitte, den Code in Codetags zu stellen?
So wirst Du wenig Hilfe bekommen.

Gruß Tommy

Hi Tommy, ich habe am Ende meines Kommentares geschrieben, dass ich dies gleich erledigen werde, da ich das Forum zum ersten mal nutze befinde ich mich gerade dabei mich einzulesen wie das mit den Tags genau funktioniert. Gruß

Ich hab doch sowas die Tage schon mal gelesen....
Das ist nicht das gleiche Projekt?

Ja, aber löse Dich von String. Nutze besser Char-Arrays, um Deine Daten zu speichern. Du bekommst sonst bei längerer Laufzeit Speicherprobleme.

Gib uns doch mal einen klaren Aufbau der Daten, dann kann man über den Rest nachdenken.

Gruß Tommy

Ich musste diesen Kommentar bearbeiten, da ich als neuer User schon die maximale Anzahl an erlaubten Kommentaren erreicht habe.

Ich verstehe leider nur nicht, wie ich einen klaren Aufbau der Daten darstellen soll.
Ich fasse nochmal den Arbeitsauftrag zusammen und erweitere dies mit meinen gedanken zur Implementierung des codes um das verlangte umzusetzen. @Tommy56

Das Ziel ist folgendes:

  1. Einlagerauftrag soll im serial monitor eingegeben werden
    (Format: Barcode#Artikelname#Menge#Lagerplatz#Wagenplatz;
    Beispiel: O 332 414 823#Schraube#3#1-1-2#2)
  2. Lagerplatz und Wagenplatz sollen "herausgefiltert" werden (Stellen 4 und 5 des Auftrages)
  3. Entsprechend sollen die zugewiesen PIN´s des Arduinos "angesteurt" werden und die entsprechenden bzw. an diesen Pins angesteckte Lämpchen sollen auf dem steckboard leuchten

Gedanklicher Vorgang:

  1. Funktionen für das Lesen (EinlagerAuftragLesen) und Zerlegen (EinlagerAuftragZerlegen) des eingegebenen Einlageauftrages definieren
  2. Dann sollen die Funktionen im loop nacheinander aufgerufen werden
  3. Durch das herausfiltern der daten (platz 4 und 5 des Auftrages) sollen die entsprechend zugewiesenen Output-PIN´s angesprochen werden und die damit verbundenen lämpchen auf dem board leuchten, bis der arduino durch einen signal (knopfdruck auf dem Board verbunden mit einem Input-Pin) diesen Auftrag als erledigt "ansieht" und die Lämpchen hören auf zu leuchten bis der nächste Einlagerauftrag in den serial monitor eingegeben wird.

Rahmenbedingung:
Es werden nur folgende Lagerplätze (4) eingegeben : 1-1-1; 1-1-2 und 1-1-3
Es werden nur folgende Wagenplätze (5) eingegeben: 1, 2 und 3

Momentan nicht und ich denke, dass es eher zielführend wäre, dass hier zu vervollständigen.
Muss ja uach irgendwie schlüssig präsentiert werden...

Das ist doch ein brauchbarer Ansatz.
Wie lang kann der Datensatz maximal werden? Die ) am Ende gehört nicht dazu?

Datensatz in ein Char-Array einlesen (deswegen maximale Länge) +1
Ende der Zeichenkette gekennzeichnet? Mit Wagenrücklauf/Zeilenmvorschub?
Ende mit '\0' markieren.
Mit strtok an '#' trennen und auswerten.

Für den konkreten Ablauf fehlen noch Infos- Wie erkenne ich das Ende und wie lang kann es maximal werden?

Gruß Tommy

Schreibe von diesem Profil weiter, da mein max. Limit an Antworten beim anderen Profil erreicht ist.
Naja, die Datensatzlänge kann variabel sein, da die Artikel unterschiedliche Namen haben, welche Artikel der Prof eingibt, weiß man nicht. Die ) gehört nicht dazu. Ich gehe mal davon aus, dass es nicht mehr als 50 Zeichen werden sollte.
Wir wissen nicht was der Prof eingibt, das einzige das wir wissen ist, dass, wie schon beschrieben, das Format immer das gleiche bleibt und die Lagerplatznummer (1-1-1, 1-1-2, 1-1-3) und wagenplatznummer (1,2,3) beschränkt sind. Das Ende der Zeichenkette wird nicht gekennzeichnet.

In dem Fall hier, als Beispiel, würde das konkret so aussehen, der Prof gibt folgendes im Serial Monitor ein und löst dies mit Enter aus: O 332 414 823#Schraube#3#1-1-2#2

Rausgefiltert sollen Lagerplatznummer 1-1-2 und Wagenplatznummer 2, daraufhin werden dann eben die entsprechend zugewiesenen pin´s zu diesen lager- und wagenplatznummern angesteuert.

Wenn ich das richtig verstehe, soll der string Einlagerauftrag als char array deklariert werden. Ich werde alle Vorschläge umgehend in den code oben einarbeiten, so das der aktuelle stand laufend ersichtlich ist. Kannst du mir die Funktion strtok nochmal erklären bzw. wie setzt man diese im Code um ?

Wird das Enter mit übertragen? Das wäre dann das Endekennzeichen. Ansonsten müsstest Du die '#' mit zählen und noch 1 Zeichen nach dem 4. '#' einlesen. Dann die Zeichenkette mit '\0' abschließen.
Mit strtok zerlegen und die Teile weiter verarbeiten.

Gruß Tommy

ist der Strichpunkt das Zeilenende?

ich rate euch - geht die Beispiele aus dem

Serial Input Basics - updated - Using Arduino / Introductory Tutorials - Arduino Forum

durch. Da steht wie man einen Stream sauber einliest und es gibt auch Beispiele wie man den buffer dann zerstückelt.

Wenn ich das richtig verstehe, dann ist Heute Morgen.
bzw. Gestern war Heute Morgen.

und Morgen ist Heute Gestern... :thinking:

Da das ja nun terminlich erledigt ist und wie immer bei solchen Dingern alles einschläft, wenn die Forderung lautet einfach ein wenig mitzumachen....

Hier eine Lösung für Deine Aufgabe.
Macht genau das, was gefordert wurde.

// Forensketch Code für Parser
// https://forum.arduino.cc/t/hilfe-bei-code-erstellung-anhand-eines-ablaufdiagramms/1212395/19

const byte wagenLed[] = {2, 3, 4};
const byte lagerLed[] = {5, 6, 7};
const char lagerText[][6] = {"1-1-1", "1-1-2", "1-1-3"};

char lagerplatz[6] = {'\0'};
byte lagerIndex;

byte wagenplatz;

byte element;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("\r\nStart...\r\n"));
  for (byte b = 0; b < sizeof(wagenLed) / sizeof(wagenLed[0]); b++)
  { pinMode(wagenLed[b], OUTPUT); }
  for (byte b = 0; b < sizeof(lagerLed) / sizeof(lagerLed[0]); b++)
  { pinMode(lagerLed[b], OUTPUT); }
}


void  loop()
{
  checkIn();
  if (element >= 5)
  { checkOut(); }
}
//
void checkOut()
{
  for (byte b = 0; b < sizeof(lagerLed); b++)
  { digitalWrite(lagerLed[b], LOW); }
  for (byte b = 0; b < sizeof(wagenLed); b++)
  { digitalWrite(wagenLed[b], LOW); }
  if (wagenplatz < sizeof(wagenLed))
  { digitalWrite(wagenLed[wagenplatz], HIGH); }
  for (byte b = 0; b < sizeof(lagerLed); b++)
  {
    if (strcmp(lagerplatz, lagerText[b]) == 0)
    { digitalWrite(lagerLed[b], HIGH); }
  }
  element = 0;
  memset(lagerplatz, '\0', sizeof(lagerplatz));
  lagerIndex = 0;
}
//
void checkIn()
{
  char inChar = '\0';
  if (Serial.available())
  { inChar = Serial.read(); }
  if (inChar)
  {
    switch (element)
    {
      case 0 ... 2:
        if (inChar == '#')
        {
          Serial.println();
          element++;
        }
        else
        { Serial.print(inChar); }
        break;
      case 3:
        if (inChar == '#')
        {
          Serial.println();
          element++;
        }
        else
        {
          Serial.print(inChar);
          lagerplatz[lagerIndex++] = inChar;
        }
        break;
      case 4:
        Serial.println(inChar);
        wagenplatz = inChar - '0';
        element++;
        break;
    }
  }
}

Vielleicht bekomme ich ja wenigstens einen Eintrag ins Klassenbuch.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.