Servo in einer Struktur

Ich hätte gern eine Struktur mit einem button und einem Servo. Genau genommen auch noch einen pin für den Servo.

Servo.h braucht aber keinen Pin bei der Anlage der Objekte, sondern nimmt den Pin später mit der Member function .attach

Nun die Übfrage: wie initialisiere ich das Array meiner Struktur richtig ohne ein Warning für die Servo zu bekommen?

#include <Servo.h>

struct Group{
  const byte buttonPin;
  const byte servoPin;
  Servo servo;
};

Group group[] {
  {A0, 9},
  {A1, 8}
};

void setup() {
  for (auto & i : group)
  {
    i.servo.attach(i.servoPin);
    pinMode(i.buttonPin, INPUT_PULLUP);
  }
  group[0].servo.write(30);
  group[1].servo.write(60);
}

void loop() {
}
C:\Daten\myrepository\Arduino\Forum no SVN\sketch_dec13b\sketch_dec13b.ino:13:1: warning: missing initializer for member 'Group::servo' [-Wmissing-field-initializers]
 };
 ^
C:\Daten\myrepository\Arduino\Forum no SVN\sketch_dec13b\sketch_dec13b.ino:13:1: warning: missing initializer for member 'Group::servo' [-Wmissing-field-initializers]

Stichwort: Konstruktor

Schreib dir selbst einen der nur zwei Paramater hat

1 Like

Danke!


#include <Servo.h>

struct Group{
  const byte buttonPin;
  const byte servoPin;
  Servo servo;

  Group(const byte buttonPin, const byte servoPin) :
    buttonPin(buttonPin), servoPin(servoPin)
   {}
};

Group group[] {
  {A0, 9},
  {A1, 8}
};

void setup() {
  for (auto & i : group)
  {
    i.servo.attach(i.servoPin);
    pinMode(i.buttonPin, INPUT_PULLUP);
  }
  group[0].servo.write(30);
  group[1].servo.write(60);
}

void loop() {
}

Weil das ja generell für jedes Group - Element gemacht werden muss, füg doch zusätzlich zum Konstruktor noch eine init - Methode dazu:

struct Group{
  const byte buttonPin;
  const byte servoPin;
  Servo servo;

  Group(const byte buttonPin, const byte servoPin) :
    buttonPin(buttonPin), servoPin(servoPin)  {}
  void init() { 
      servo.attach(servoPin);
      pinMode(buttonPin, INPUT_PULLUP); 
  }

};
void setup() {
  for (auto& elem : group) elem.init();
}

sieht dann schon richtig objektorientiert aus.