Hallo,
ich möchte mir einen kleinen Bordcomputer für mein Motorrad bauen. Das ganze besteht grob aus den folgenden Elementen:
- Arduino
- Display
- SD-Karte, soll Daten abspeichern können
- Momentan 3 Taster, wobei Taster 1 und 2 ein hoch- bzw. herunterschalten zwischen verschiedenen Menüs auf dem Bildschirm bewirken
Mein Ziel ist jetzt, das ganze möglich objektorientiert zu machen, aber leider fehlt mir hier wohl noch etwas Erfahrung. Die Probleme treten auf, wenn ich externe Libraries nutzen möchte. In dem Falle die "SD.h". Nachdem
ich über sd_init() die SD-Karte initialisiere, macht der Arduino komische Dinge:
Ohne die sd_init() (auskommentiert), kann ich über die Tasten zwischen den verschiedenen Bildschirmen hin- und her springen und auch im Seriellen Monitor wird mir der Name der aktuellen Seite angezeigt, z.B. "Seite 1". Wenn ich die sd-init() nicht auskommentiert habe, dann zeigt mir der Serielle Monitor nur noch "eite" an und mit den Tasten kann ich auch nicht mehr hin- und her springen zwischen den Bildschirmen. Auf dem Display wird allerdings immer "Seite 1" angezeigt. Fehlermeldungen gibt mir die IDE nicht aus.
Das sind meine Dateien:
Master.ino
Code:
//Funktionsbibliotheken einbinden
#include "Bordcomputer.h"
//Deklarationen
BC mybc; //Objekt für Bordcomputer anlegen
void setup() {
Serial.begin(9600);
mybc.init(); //Initialisierung von Display, SD usw.
}
void loop() {
mybc.check_button();
mybc.show();
}
Bordcomputer.h
Code:
//Bordcomputer.h
//Klasse für den Bordcomputer
#ifndef _BORDCOMPUTER_ //verhindert mehrmaliges inkludieren der Klassendefinition
#define _BORDCOMPUTER_
#include "Arduino.h"
#include <U8g2lib.h>
#include <SPI.h>
#include <SD.h>
/*
Anschluss des SD-Moduls:
CS: wie unter chipselect ausgewaehlt
SCK: 13
MOSI: 11
MISO: 12
VCC: + VCC (3,3 oder 5V)
GND: - GND
*/
class BC {
private:
//Variablen private
int akt_seite = 1;
int min_seite = 1;
int max_seite = 3;
int pin_taste_1 = 8;
int pin_taste_2 = 9;
int pin_taste_3 = 10;
U8G2_SSD1306_128X64_NONAME_1_HW_I2C* display; // 0,96"- Display - bei Änderung auch init mit ändern
//U8G2_SH1106_128X64_NONAME_1_HW_I2C* display; // 1,3" - Display - bei Änderung auch Init mit ändern
const int chipSelect = 4; //Pin, an dem ChipSelect hängt
bool sd_ready = false;
File* logFile; //Logfile für alle Daten
//Methoden private
void show_seite1(); //zeigt Seite 1
void show_seite2();
void show_seite3();
// void show_seite4();
// void show_seite5();
// void show_seite6();
// void show_seite7();
// void show_seite8();
void up(); //geht eine Seite nach oben
void down(); //geht eine Seite nach unten
public:
//Variablen public
//Methoden public
BC(); //Konstruktor
~BC();
void init(); //Initialisierung von Display und anderen Objekten
void display_init();
void sd_init();
void show(); //zeigt aktuellen Bildschirm an
void check_button(); //kontrolliert, welche Buttons gedrückt werden
};
#endif // _BORDCOMPUTER_
Bordcomputer.cpp
Code:
#include "Bordcomputer.h"
//Konstruktor
BC::BC() {
}
//##############################################################
//Destruktor
BC::~BC() {
delete display;
delete logFile;
}
//##############################################################
void BC::init(){
display_init();
sd_init();
Serial.println("Code geht in init weiter");
}
//##############################################################
void BC::display_init() {
//bei anderem Display ggfs. umkommentieren und auch bei privaten Variablen umkommentieren nicht vergessen
display = new U8G2_SSD1306_128X64_NONAME_1_HW_I2C(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17); // 0,96"-Display
//display = new U8G2_SH1106_128X64_NONAME_1_HW_I2C display(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // 1,3"-Display
display->begin();
}
//##############################################################
void BC::sd_init() {
//SD-Modul initialisieren
//Dateien anlegen
logFile = new File;
if(SD.begin(chipSelect)) {
Serial.println("card initialized.");
sd_ready = true;
} else {
Serial.println("Card failed, or not present");
//Fehler - Flag setzen
sd_ready = false;
}
Serial.println("Code geht in sd_init weiter");
}
//##############################################################
void BC::show() {
switch(this->akt_seite) {
case 1:
show_seite1();
break;
case 2:
show_seite2();
break;
case 3:
show_seite3();
break;
default:
show_seite1();
}
}
//##############################################################
void BC::show_seite1() {
Serial.println("Seite" + this->akt_seite);
display->firstPage();
do {
display->setFont(u8g2_font_profont11_mr);
display->setCursor(0, 10);
display->print("Seite ");
display->print(this->akt_seite);
} while ( display->nextPage() );
}
//##############################################################
void BC::show_seite2() {
////Serial.println("Seite" + this->akt_seite);
display->firstPage();
do {
display->setFont(u8g2_font_profont11_mr);
display->setCursor(0, 10);
display->print("Seite ");
display->print(this->akt_seite);
} while ( display->nextPage() );
}
//##############################################################
void BC::show_seite3() {
//Serial.println("Seite" + this->akt_seite);
display->firstPage();
do {
display->setFont(u8g2_font_profont11_mr);
display->setCursor(0, 10);
display->print("Seite ");
display->print(this->akt_seite);
} while ( display->nextPage() );
}
//##############################################################
void BC::up() {
//geht eine Seite nach oben
this->akt_seite = this->akt_seite + 1;
if(this->akt_seite > this->max_seite) {
this->akt_seite = this->min_seite;
}
delay(200);
}
//##############################################################
void BC::down() {
//geht eine Seite nach oben
this->akt_seite = this->akt_seite - 1;
if(this->akt_seite < this->min_seite) {
this->akt_seite = this->max_seite;
}
delay(200);
}
//##############################################################
void BC::check_button() {
//wertet die Aktionen auf den Tasten aus (welche Tasten werden gedrückt, lang oder kurz usw.)
int taster = 0;
if (digitalRead(this->pin_taste_1) == HIGH) {
taster = 1;
//Serial.println(taster);
}
if (digitalRead(this->pin_taste_2) == HIGH) {
taster = 2;
//Serial.println(taster);
}
if (digitalRead(this->pin_taste_3) == HIGH) {
taster = 3;
//Serial.println(taster);
}
switch(taster) {
case 1:
BC::up();
break;
case 2:
BC::down();
break;
}
}
Ich vermute, dass ich falsch auf die Methode SD.begin() zugreife, bzw. dass die Initialisierung/Deklaration nicht passt.
Die Ausgaben "Code geht in init weiter" bzw. "Code geht in sd_nit weiter" werden übrigens beide ordentlich ausgegeben. Also scheint sich der Arduino zumindest nicht aufzuhängen :-). Aber warum geht dann mein Menü nicht mehr weiter zu betätigen und der Serielle Monitor gibt so unvollständige Strings zurück?
Würde mich sehr freuen, wenn ihr mir helfen könnt.
VG Stefan