Ports schalten...

Hallo Leute.
Ich versuche mich gerade mal an einem kleinen Projekt mit Mega2560.
Es sollen eigentlich nur ein paar Pins geschaltet werden.
Hierzu sende ich dem Arduino per Serial einen String.
Je nachdem welchen "Port" ich da schalten will soll dieser ein oder ausgeschaltet werden.
Aber egal was ich sende, es wird immer nur der erste meiner Ports geschaltet.

Empfangen tut er das richtige, aber schaltet immer nur den Port0 auf Pin31.
was mache ich falsch??

Ich sende "SetPort0" --> Ergebnis:
16:09:51.197 -> Empfangen:SetPort0
16:09:51.230 ->
16:09:51.230 -> Port0=1
16:09:51.230 -> Port1=0
16:09:51.230 -> Port2=0
16:09:51.265 -> Port3=0
16:09:51.265 -> Port4=0
16:09:51.265 -> Port5=0
16:09:51.299 -> Port6=0
16:09:51.299 -> Port7=0

Sende ich danach "SetPort1", wo ich eigentlich erwarte, dass Port1 auf 1 geht kommt:
16:11:00.779 -> Empfangen:SetPort1
16:11:00.779 ->
16:11:00.779 -> Port0=0
16:11:00.813 -> Port1=0
16:11:00.813 -> Port2=0
16:11:00.813 -> Port3=0
16:11:00.813 -> Port4=0
16:11:00.848 -> Port5=0
16:11:00.848 -> Port6=0
16:11:00.848 -> Port7=0
Heist Port0 geht auf LOW und Port1 nicht.
Sende ich dann z.b. "SetPort3" geht wieder nur Port0 HIGH.

irgendwas übersehe ich doch hier... Danke schon mal..

int Ports[] = { 31, 33, 35, 37, 39, 41, 43, 45}; // an array of pin numbers to which LEDs are attached
int pinCount = 8; 
int PortStatus[] = { 0, 0, 0, 0, 0, 0, 0, 0}; 

int data = 0; 
String SerialInput = "";

void setup() 
{
  // put your setup code here, to run once:
  // the array elements are numbered from 0 to (pinCount - 1).
  // use a for loop to initialize each pin as an output:
  for (int thisPin = 0; thisPin < pinCount; thisPin++) 
  {
    pinMode(Ports[thisPin], OUTPUT);
    digitalWrite(Ports[thisPin], LOW);
  }

 Serial.begin(9600);


}

void loop() {
  // put your main code here, to run repeatedly:
  SerialInput="";
  if (Serial.available() > 0) 
  {
    //lesen von Daten
    //data = Serial.read();
    //char zeichen = (char)data;
    SerialInput = Serial.readString();
    Serial.print("Empfangen:");
    Serial.println(SerialInput);
    if(SerialInput == 'SetPort0')
    {
      PortStatus[0] = PortStatus[0] == 0 ? 1 : 0;
      digitalWrite(Ports[0], PortStatus[0] == 1? HIGH:LOW);
    } 
    else if(SerialInput == 'SetPort1')
    { 
      PortStatus[1] = PortStatus[1] == 0 ? 1 : 0;
      digitalWrite(Ports[1], PortStatus[1] == 1? HIGH:LOW);
    } 
    else if(SerialInput == 'SetPort2')
    { 
      PortStatus[2] = PortStatus[2] == 0 ? 1 : 0;
      digitalWrite(Ports[2], PortStatus[2] == 1? HIGH:LOW);
    } 
    else if(SerialInput == 'SetPort3')
    { 
      PortStatus[3] = PortStatus[3] == 0 ? 1 : 0;
      digitalWrite(Ports[3], PortStatus[3] == 1? HIGH:LOW);
    } 
    else if(SerialInput == 'SetPort4')
    { 
      PortStatus[4] = PortStatus[4] == 0 ? 1 : 0;
      digitalWrite(Ports[4], PortStatus[4] == 1? HIGH:LOW);
    } 
        else if(SerialInput == 'SetPort5')
    { 
      PortStatus[5] = PortStatus[5] == 0 ? 1 : 0;
      digitalWrite(Ports[5], PortStatus[5] == 1? HIGH:LOW);
    } 
        else if(SerialInput == 'SetPort6')
    { 
      PortStatus[6] = PortStatus[6] == 0 ? 1 : 0;
      digitalWrite(Ports[6], PortStatus[6] == 1? HIGH:LOW);
    } 
        else if(SerialInput == 'SetPort7')
    { 
      PortStatus[7] = PortStatus[7] == 0 ? 1 : 0;
      digitalWrite(Ports[7], PortStatus[7] == 1? HIGH:LOW);
    } 
  }


for (int thisPin = 0; thisPin < pinCount; thisPin++) 
  {
    Serial.print("Port");
    Serial.print(thisPin);
    Serial.print("=");
    Serial.println(PortStatus[thisPin]);
  }
  
  delay(1000);
  
  
}

Du verwendest den Begriff "Port" falsch. Port ist eine interne Bezeichnung des Controllers. Es werden immer 8 Pins zu einem Port zusammengefasst. Jeder Port had dann Register die z.B. Richtung und Zustand angeben, und jedes Bit entspricht einem Pin

'SetPort1'

'x' ist ein Zeichen
"xxx" ist eine Zeichenkette

Du solltest die Warnungen in der IDE aktivieren

Ansonsten musst du den Zustand des Pins nicht unbedingt abspeichern. Denn kannst du auch mit digitalRead() auslesen

Sendest Du "SetPort0" oder ist noch ein NL (Newline,'\n') hinten dran?
Dann solltest Du mal mit readStringUntil('\n') arbeiten.

Gruß Tommy

@Serenifly:
ok, dann sage ich mal ich schalte einen Digital-Pin als Ausgang :slight_smile:

Aber auch wenn ich das auf Zeichenkette umstelle wie unten, dann wird gar nichts mehr ausgeführt.

if(SerialInput == "Set0")
    {
      PortStatus[0] = PortStatus[0] == 0 ? 1 : 0;
      digitalWrite(Ports[0], PortStatus[0] == 1? HIGH:LOW);
    } 
    else if(SerialInput == "Set1")
    { 
      PortStatus[1] = PortStatus[1] == 0 ? 1 : 0;
      digitalWrite(Ports[1], PortStatus[1] == 1? HIGH:LOW);
    }

@Thommy56: readStringUntil('\n')!!
Das war es... jetzt läufts.. Danke!

Schön, dass es läuft und danke für die Rückmeldung.

Gruß Tommy