Realisierung einer Ampelsteuerung für eine X-Kreuzung mit Linksabbiegerspur und Fußgängerampeln

Auch wenn Du keinen Konstruktor benötigst, tendiere ich eher zu diesem Ansatz:

class Ampel
{
  private:
    const byte rotPin;
    const byte gelbPin ;
    const byte gruenPin;
  public:
    Ampel(const byte rotPin, const byte gelbPin, const byte gruenPin) : rotPin(rotPin), gelbPin(gelbPin), gruenPin(gruenPin)
    {}
    void init()
    {
      pinMode(rotPin, OUTPUT);
      pinMode(gelbPin, OUTPUT);
      pinMode(gruenPin, OUTPUT);
    }

    void setrot()
    {
      digitalWrite(rotPin, HIGH);
      digitalWrite(gelbPin, LOW);
      digitalWrite(gruenPin, LOW);
    }
    void setrotgelb()
    {
      digitalWrite(rotPin, HIGH);
      digitalWrite(gelbPin, HIGH);
      digitalWrite(gruenPin, LOW);
    }
    void setgelb()
    {
      digitalWrite(rotPin, LOW);
      digitalWrite(gelbPin, HIGH);
      digitalWrite(gruenPin, LOW);
    }
    void setgruen()
    {
      digitalWrite(rotPin, LOW);
      digitalWrite(gelbPin, LOW);
      digitalWrite(gruenPin, HIGH);
    }
};

Ampel ampel[] =
{
  {2, 3, 4}
};


void setup()
{
  ampel[0].init();
  ampel[0].setrot();
}

void  loop()
{
  uint32_t jetzt = millis();
  static uint32_t vorhin = 0;
  const uint32_t intervall = 2000;
  static uint8_t schritt = 0;

  if (jetzt - vorhin >= intervall)
  {
    vorhin = jetzt;
    switch (schritt)
    {
      case 0:
        ampel[0].setrotgelb();
        schritt++;
        break;
      case 1:
        ampel[0].setgruen();
        schritt++;
        break;
      case 2:
        ampel[0].setgelb();
        schritt++;
        break;
      case 3:
        ampel[0].setrot();
        schritt = 0;
        break;
    }
  }
}