Hallo Kollegen,
ich bastel gerade an einem kleinen Tacho für mein Motorrad. Der grundliegende Code für den Tacho stammt nicht von mir und funktioniert auch einwandfrei. Allerdings wollte ich jetzt noch einen Taster integrieren, um die Anzeigen durchschalten zu können (Aktuelle Geschwindigkeit, Uhrzeit, Kilometerstand,....).
Und jetzt fangen die Probleme auch schon an. Ich lese den Taster ein und will dann über ein switch/case Konstrukt die verschiedenen Displayinhalte steuern.
Case 0 ist die Defaultansicht (Geschwindigkeit), die Ansichten in Case 1 und Case 2 haben derzeit nur Dummy-Inhalte.
Das dubiose ist - sobald ich in "Case 1" und "Case 2" irgendwelche Display-Anweisungen reinschreibe, ändert sich die Anzeige, die über Case 0 getriggert wird. Wenn ich die Inhalte von Case 1 und Case 2 auskommentiere, passt wieder alles.
Ich verstehe nicht, wie die Inhalte von Case1 und Case2 den Code aus Case0 beeinflussen können...
Über SerialPrint hab ich das ganze mal verfolgt - die Case-Schleifen werden korrekt abgearbeitet...
Auf dem angehängten Photo (ok.jpg) seht ihr die korrekte Anzeige. Sobald ich aber die Anweisungen in Case1 und Case2 einkommentiere, verschwindet die letzte Zeile ("Trip (km): .....")
Ich hoffe, ihr könnt mir folgen....
mfg
Basti
#include <RunningAverage.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);
RunningAverage myRA(100);
volatile unsigned long dauer = 0; // microsekunden seit dem letzten Interrupt
volatile unsigned long last = 0; // Zählerwert beim letzten Interrup
short geschwindigkeit; // selbstredend
short VAnzeige;
short wegstrecke;
const int buttonPin = 2;
const int reedPin = 3;
const int ledPin = 13;
int interruptCounter = 0;
int buttonState = 0; // Tasterstatus
int anzeigeModus = 0;
static const unsigned char PROGMEM logo [] = {
};
void setup() {
// Serial.begin(9600); // open the serial port at 9600 bps:
pinMode(reedPin, INPUT_PULLUP); // Reed-Sensor an Pin 3
pinMode(buttonPin, INPUT_PULLUP); // Taster an Pin 2
pinMode(ledPin, OUTPUT); //interne LED an Pin13
attachInterrupt(digitalPinToInterrupt(3), readmillis, RISING);
myRA.clear();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
// display.drawBitmap(0, 0, logo, 128, 64, 1);
display.display();
delay(1000);
}
void loop() {
readButton();
VAnzeige = myRA.getAverage(), 0; // Mittelwert errechnen
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
switch (anzeigeModus) {
case 0:
display.print("Built, not bought...");
display.setTextSize(4);
display.setCursor(10, 12);
display.print(VAnzeige);
display.setTextSize(1);
display.setCursor(10, 56);
display.print(String("Trip (km): ") + wegstrecke );
myRA.clear();
break;
case 1:
display.print("Anzeige 2");
break;
case 2:
display.print("Anzeige 3");
break;
}
display.display();
myRA.clear(); // Mittelwertdaten löschen
delay(250); // Alle 1/4 Sekunde Werte aktualisieren, bis dahin über Interrupt Werte sammeln
}
void readmillis() { // Interrupt-Routine
detachInterrupt(2);
interruptCounter++;
if (interruptCounter >537) { //537 Radumdrehungen entsprechen einem km
wegstrecke++;
interruptCounter = 0;
}
unsigned long m = millis(); // Microsekundenzähler auslesen
unsigned long v = m - last; // Differenz zum letzten Durchlauf berechnen
if (v > 5) { // ignorieren wenn <= 5ms (Kontaktpreller)
dauer = v; // Wert in dauer übernehmen
last = m; // und wieder den letzten Wert merken
geschwindigkeit = 1.86*3.6*1000/dauer; // Geschwindigkeit: 1 Interrupt alle 1860mm (Radumfang)
myRA.addValue(geschwindigkeit); // Wert zur Mittelwerberechnung hinzufügen
}
attachInterrupt(digitalPinToInterrupt(2), readmillis, RISING); // Interrupt wieder einschalten.
}
void readButton() {
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) { anzeigeModus++; }
if (anzeigeModus > 2) { anzeigeModus= 0; }
}