Eigene Library Fehler beim Kompilieren

Hi,
ich bin gerade dabei meine nächste Lib zu schreiben komme aber um die Fehlermeldung

sketch_may25a.ino: In function ‘void setup()’:
sketch_may25a.ino:6:8: error: request for member ‘start’ in ‘dist’, which is of non-class type ‘DistSens()’
sketch_may25a.ino: In function ‘void loop()’:
sketch_may25a.ino:10:23: error: request for member ‘readDist’ in ‘dist’, which is of non-class type ‘DistSens()’

nicht herum. Die Library soll eine Distanzsensor auslesen.
Die Header Datei:

#include"Arduino.h"
#ifndef DistSens_h
#define DistSens_h

class DistSens
{
 public:
  DistSens();
  void start(int _apin);
  long readDist();
 private:
  int _apin;
  long result;
};

#endif

Die CPP Datei:

#include "Arduino.h"
#include "DistSens.h"

DistSens::DistSens()
{
}
void DistSens::start(int _apin)
{

  pinMode(_apin,INPUT);
}
long DistSens::readDist()
{
  int val=analogRead(_apin);
  long result=(6787.0/((float)val-3.0))-4.0;
  return result;
}

Und der Beispiel Sketch:

#include <DistSens.h>

DistSens dist();

void setup(){
  dist.start(0);
  Serial.begin(9600);
}
void loop(){
  Serial.println(dist.readDist());
  delay(1000);
}

Wo ist der Fehler?
Wahrscheinlich ist der ganz banal und ich schau einfach nicht richtig. :grin:
Bei der letzten Lib hat es ja auch so geklappt.

DistSens dist;  // wenn der Konstruktor keine Parameter hat

Da du mit Instanzen arbeitest, also (theoretisch) mehrere Sensoren haben kannst,
bietet es sich eigentlich an, den Pin ( um den sich mehere Sensoren ja wohl unterscheiden müssen) gleich im Konstruktor mitzugeben, oder ?

class DistSens
{
private:
  int _apin;
public:
  DistSens(int pin) {_apin = pin;};
  long readDist();
};

Dann geht in der .ino

DistSens s1(3);
DistSens s2(4);

Übrigens:

  • result braucht es (z.Zt.) nicht als member variable ...
  • um aus einer 10 bit Messung ein long Ergebnis zu erhalten, sollte man - ohne Genauigkeitsverlust - ohne float auskommen.
    Gib dir mal ein bisschen Mühe :wink:

Danke, habe den Pin in den Konstruktor gesetzt.
Da ich nur einen Sensor habe war es eigentlich egal aber so könnte ich jetzt auch mehrere anschließen.
Trotzdem bleibe ich bei float, weil ich damit Kommazahlen darstellen kann :smiley:
Vielen Dank für die schnelle Hilfe!

Da gibt es noch ein Problem:
Es wird immer Analogpin 0 abgefragt obwohl ich A5 eingetragen habe(teste auf Uno und Leonardo)
Wo ist das Problem, in der cpp Datei wird die Variable nicht auf Null gesetzt

#include <DistSens.h>

DistSens dist(A1);// sensor attached to analog pin 0

void setup(){
 
  Serial.begin(9600);
}
void loop(){
  Serial.println(dist.readDist());//read the distance and send
  delay(1000);
}

Es ist egal welchen Pin ich wähle! Immer wird A0 benutzt.
Bei dem Beispiel readanalogvoltage funktioniert alles.
Bei meinem Sketch, der das gleiche macht wie die Library funst es auch
---> Es muss an der Library hängen. Aber ich finde den Fehler nicht.
Die Lib ist im Anhang

DistSens.cpp (294 Bytes)

DistSens.h (190 Bytes)

readdata.ino (221 Bytes)

DistSens::DistSens(int _apin)
{
  apin=_apin;
  pinMode(apin,INPUT);
}

Wenn du genau hinsiehst, siehst du den Unterschied, und dann ist dir alles klar :wink:

Nachtrag: AnalogPins brauchen noch weniger pinMode(apin, INPUT); als andere ...

Klar darduch wird eine neue Variable erzeugt! Danke bin heute nicht so bei mir :sweat_smile:
Und zu pinMode: Die Lib soll später leicht zu verstehen sein, dass digitale und analoge Pins automatisch Input sind weiß ich.