Servoelement als Argument einer Funktion

Hallo liebes Forum

Ich habe mal wieder ein kleines Problem. Ich möchte mit meinem Arduino ein paar Lüftungsklappen steuern, zu diesem Zweck sind die Klappen mit Servomotoren verbunden. Nun wollte ich, um mir einiges an Tipparbeit zu sparen, Funktionen schreiben die die Servos öffnen und schließen. An die Funktion soll dann der jeweilige Servo als Argument übergeben werden und die Funktion macht dann das entsprechende. Es funktioniert aber leider nicht, Arduino scheint den Typ Servo als Argument einer Funktion nicht zu akzeptieren. Ist dem tatsächlich so oder mache ich etwas bei der Definition der Funktion falsch?

Hier Funktion und Fehlermeldung:

int schliessen (Servo s)
{
  int ist = s.read();
  int h;
  
  if(ist > zu)
  {
    s.write(ist - 5);
    h = 0;
  }
  else
  h = 1;
  
  return h;
}

Klappensteuerung:1: error: 'Servo' was not declared in this scope Klappensteuerung.cpp: In function 'int schliessen(Servo)': Klappensteuerung:185: error: 'int schliessen(Servo)' redeclared as different kind of symbol Klappensteuerung:1: error: previous declaration of 'int schliessen'

Danke schon mal für die Hilfe

Lg Max

hi,

bitte ganzen code posten, ev. als anhang. hier sieht man nur, daß Servo nicht definiert ist, und das sagt ja auch die fehlermeldung.

gruß stefan

//Initialisierung des LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 8, 7, 4, 3, 2);
int LCDLED = A5;
int LCDState = LOW;

//Initialisierung der Servos
#include <Servo.h>
Servo AK1;
Servo AK2;
Servo AK3;
Servo AK4;
Servo AK5;
Servo ZK;

//Variablen für die Zustände der Servos
//45 ist zu, 135 ist auf
int zu = 46;
int auf = 134;
int ak1;
int ak2;
int ak3;
int ak4;
int ak5;
int zk;

//Variablen um die Messabstände zu kontrollieren
long previousMillis = 6000;   // will store last time Temperatur was updated
long previousMillis2 = 0;
long interval = 6000;         // Interval der Messungen (milliseconds)
                              // 1x pro Minute

void setup()
{
  //LCD initialisieren
  lcd.begin(16, 2);
  
  //Pins für Servos festlegen
  AK1.attach(13);
  AK2.attach(11);
  AK3.attach(10);
  AK4.attach(9);
  AK5.attach(6);
  ZK.attach(5);
  
  //Servos auf Mittelstellung initialisieren
  AK1.write(90);
  AK2.write(90);
  AK3.write(90);
  AK4.write(90);
  AK5.write(90);
  ZK.write(90);
  
}

void loop()
{
  //aktuelle Zeit erfassen
  unsigned long currentMillis = millis();
  
  //Status der Serovs erfassen und auf Display ausgeben
  if(currentMillis - previousMillis > interval/2)
  {
  //Status der Servos erfassen
    digitalWrite(s_vcc, HIGH);
    delay(100);
    ak1 = AK1.read();
    ak2 = AK2.read();
    ak3 = AK3.read();
    ak4 = AK4.read();
    ak5 = AK5.read();
    zk = ZK.read();
    digitalWrite(s_vcc, LOW);
    
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Z:");
    lcd.print(zk);
    lcd.print(",1:");
    lcd.print(ak1);
    lcd.print(",2:");
    lcd.print(ak2);
    lcd.setCursor(0,1);
    lcd.print("3:");
    lcd.print(ak3);
    lcd.print(",4:");
    lcd.print(ak4);
    lcd.print(",5:");
    lcd.print(ak5);
  }
}

int schliessen (Servo s)
{
  int ist = s.read();
  int h;
  
  if(ist > zu)
  {
    s.write(ist - 5);
    h = 0;
  }
  else
  h = 1;
  
  return h;
}

Das ist nicht der Code, der obige Fehlermeldung produzierte, der hier ergibt nämlich:

sketch_mar07a:6: error: ‘Servo’ was not declared in this scope
sketch_mar07a.ino: In function ‘void loop()’:
sketch_mar07a:65: error: ‘s_vcc’ was not declared in this scope
sketch_mar07a.ino: In function ‘int schliessen(Servo)’:
sketch_mar07a:93: error: ‘int schliessen(Servo)’ redeclared as different kind of symbol
sketch_mar07a:6: error: previous declaration of ‘int schliessen’

Im Übrigen, wenn Du den #include <Servo.h> gleich nach dem #include <LiquidCrystal.h> einfügst und die Variable s_vcc auch wirklich deklariert ist, compiliert das Ganze ohne Probleme.

hi,

ich hab' mir gedacht: bis ich mir die servo installiert hab, ist wer anderer schneller. und recht hatte ich. aber ich hab' mir inzwischen einen anderen ansatz überlegt und ausprobiert. statt servo-objekte an funktionen zu übergeben, ist es doch viel schöner, selbst klassen zu schreiben:

class Licht
{
  public:
    Licht(byte p){
      _pin = p;
      pinMode(_pin, OUTPUT);
    }
    void Ein() {
      digitalWrite(_pin, HIGH);
    }
    void Aus() {
      digitalWrite(_pin, LOW);
    }
    void Ein_zeit(int z) {
      digitalWrite(_pin, HIGH);
      delay(z);
      digitalWrite(_pin, LOW);
      
    }
  private:
    byte _pin;
};

Licht Licht_1(13);

void setup() {
  
}

void loop() {
  Licht_1.Ein(); 
  delay(1000);
  Licht_1.Aus(); 
  delay(1000);
  Licht_1.Ein_zeit(3000);
  delay(1000);  
}

gruß stefan