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?
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...
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
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:
Die Initialisierungsliste ist eine Spezialität der Programmiersprache C++. Sie kommt ausschließlich in Konstruktoren vor und hat die Aufgabe, die Konstruktion von Vorfahren-Klassen, eingebetteten Elementen und Referenzen zu regeln.
Im Gegensatz zu C, wo man eine Variable deklarieren kann, ohne sich zunächst um ihre Initialisierung zu kümmern, gibt es in C++ Fälle, in denen eine sofortige Initialisierung nötig ist:
Finden solch restriktive Deklarationen in einer Klassendefinition statt (Vererbun...
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()
{
}