Hilfe bei erster eigener Library benötigt

Hallo,

versuche gerade meine erste eigene Library zu schreiben. Das Problem ist nun, dass die zwei Leds sich nicht einschalten lassen.

Könnte mir bitte jemand sagen, was im unten stehenden Code falsch ist? :slight_smile:

Header-Datei:

#ifndef Testt_h
#define Testt_h
#include <Arduino.h>

class Testt{

public:
Testt(int,int);
void anschalten();

private:
int A;
int B;


};
#endif

Klasse:

#include <Arduino.h>
#include "Testt.h"

Testt::Testt(int A, int B){
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
}

void Testt::anschalten(){
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
}

Und noch der Sketch:

#include <Testt.h>

Testt meinTestt(3,5);

void setup() {

  meinTestt.anschalten();

}

void loop() {
 
}

Viele Grüße und schöne Ostern!

Die Felder A und B werden nie gesetzt. Die Pin-Nummern müssen im Konstruktor von den Parametern in die privaten Felder kopiert werden. Dabei wirst Du merken, daß es ganz schlechter Stil ist, den gleichen Namen für unterschiedliche Elemente zu benutzen.

Vielen Dank für die Antwort!

Läuft jetzt alles so wie es soll...

Auch musst du generell aufpassen, im Konstruktor nicht zu viel zu machen. Es ist nicht garantiert, dass pinMode so früh (lange vor setup) schon funktioniert.

Daher haben viele Arduino - Klassen eine begin() Methode, die dann in setup aufgerufen wird.

Der Datentypintlässt immer den Verdacht aufkommen, dass man nicht über den Datentyp nachgedacht hat. Für Pins wäre normalerweiseconst byteangebracht.

Aber das sind nur generelle Tips. Konkret hat DrDiettrich recht, warum bei dir die Methode anschalten() nicht funktioniert.

Alles klar, werde ich in Zukunft beachten…

Hallo ich nochmal ,

bin gerade dabei, mir eine Library für ein Schieberegister zu schreiben, welches dann eine 7-Segmentanzeige ansteuern soll. Es hat eigentlich soweit auch alles funktioniert, bis ich angefangen habe, Schleifen einzubauen… :confused:

Hier mal die einzelnen Dateien:

#ifndef Testt_h
#define Testt_h
#include<Arduino.h>

class Schieberegister{

public:
Schieberegister(const byte, const byte, const byte);
void begin();
void anzeigen(byte);

private:
byte ds;
byte shiftclock; 
byte shiftstorage;
byte test[2];
byte a;
byte b;

};
#endif
#include <Arduino.h>
#include "Schieberegister.h"


Schieberegister::Schieberegister(const byte A, const byte B, const byte C){
ds=A;
shiftclock=B;
shiftstorage=C;
byte test[]={A, B, C};

}



void Schieberegister::begin(){
for(a=0;a<3;a++){
	pinMode(test[a], OUTPUT);
}
}



void Schieberegister::anzeigen(byte wert){
for(b=0;b<3;b++){
	digitalWrite(test[b], LOW);
}
shiftOut(ds, shiftclock, MSBFIRST, wert);
delay(20);
digitalWrite(shiftstorage, HIGH);
}

Und noch der Sketch:

#include <Schieberegister.h>

Schieberegister meinSchieberegister(10,11,9);

void setup() {
   meinSchieberegister.begin();
   delay(200);
   meinSchieberegister.anzeigen(98);

}

void loop() {
  
}

Hoffe ihr könnt mir helfen :slight_smile:

Viele Grüße

finebel

byte test[]={A, B, C};

Diese Zeile in deinem c'tor ist überflüssig

byte test[2];
byte a;
byte b;

Diese 3 Variable werden nicht initialisiert, wobei a und b nicht als member deklariert sein müssten

Was soll das?!

byte test[]={A, B, C};

Das ist eine lokale Variable

Gewöhne dir an Initialisierungslisten in Konstruktoren zu verwenden:

Dann kann man auch Konstanten initialisieren

Initialisierungen gehören nicht in den Konstruktor-Körper selbst. An der Stelle wurden die Elemente schon default-initialisiert

class Test
{
public:
  Test(byte b, byte A, byte B, byte C) : b(b), array { A, B, C }
  {
  }

  void print()
  {
    Serial.println(b);

    for (byte b : array)
      Serial.println(b);
  }
private:
  const byte b;
  const byte array[3];
};

void setup()
{ 
  Serial.begin(9600);

  Test test(10, 1, 2, 3);
  test.print();
}

void loop()
{
}