Mein erstes Projekt, bin Anfänger: Für mein Fahrrad möchte ich ein Digitaldisplay realisieren. Den Code habe ich aus einem Video. Der Aufgebaut ist mit einem ESP32 C3 mini, Oled SSD1306 128*64 Display und Hallsensor der am Pin4 vom ESP32 hängt. Ich hab das Problem dass auf dem Oled Display alle Texte und Werte angezeigt werden, aber leider werden die Werte nicht aktualisiert diese bleiben immer 0 stehen. Der Hallsensor soll über 2 Magnete angesprochen werden. Danke für die Hilfe, Gruß Joerg
/*
* Titel: Geschwindigkeit
*/
#include <Interval.h> // Zeitbibiliothek zum ständigen Wiederholen der Funktion
#include <SPI.h> // Display: Benötigte Bibliothekebn
#include <Wire.h> // Serial Peripheral Interface: Kommunikation zwischen den Geräten
#include <Adafruit_GFX.h> // Kommunikation zu 12c (inter Intergrated Circuit) device (OLED-Display)
#include <Adafruit_SSD1306.h> // Grafik-Bibliothek
// Dimension des Displays
#define SCREEN_WIDTH 128 // OLED Displa Beite in (Pixel)
#define SCREEN_HEIGHT 64 // OLED Display Höhe in (Pixel)
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define signalHallsensor 4 // Signal des Hallsensors geht an den Pin4 des ESP32
// Dimension des Rades (26x1, 90 Zoll)
// Rad: 26 Zoll (1 Zoll = 25,4 mm) --> 660,4 mm / 1000 = 0,6604m (Durchmesser in Meter)
// Umpfang = Pi * 0,6604m = 2,0747m (Umpfang in Meter)
float radumpfang = 2.0747;
void setup()
{
// Display Grundeinstellungen
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Adresse 0x3c für 128x64
display.clearDisplay(); // Leerer Bildschirm
display.setTextSize(1); // Display: Schriftgröße ("1"/"Normal")
display.setTextColor(WHITE); // Display: Schriftfarbe (Weiß)
pinMode(signalHallsensor, INPUT); // Interruproutine bei steigender Flanke
attachInterrupt(signalHallsensor, ISR, RISING);
}
volatile byte summeMagnete;
volatile long summeMillis;
unsigned long vorherigeMillis;
void ISR()
{
if (millis() - vorherigeMillis >= 25) // 25ms enspricht maximal 40 Radumdrehungen pro Sekunde
{
summeMagnete++; // Magnete zählen und Aufsummieren
summeMillis += millis() - vorherigeMillis; // Zeit zwischen den Signalen zählen und Aufsummieren
vorherigeMillis = millis(); // Zeit merken
}
}
void loop()
{
Interval(2500); {
tachometer();
}
}
unsigned long gesamtUmdrehungen;
void tachometer()
{
byte einzelUmdrehungen;
unsigned long zeit;
float drehzahl, geschwindigkeit, strecke;
noInterrupts(); // Interrupts werden gesperrt
einzelUmdrehungen = (summeMagnete) /2; // Zahlvariable Magnete umkopieren
summeMagnete = 0; // Zahlvariable Magnete auf 0 zurücksetzen
zeit = summeMillis; // Zahlvariable Zeit umkopieren
summeMillis = 0; // Zahlvariable Zeit auf 0 zurücksetzen
interrupts(); // Interrupts werden wieder zugelassen
gesamtUmdrehungen += einzelUmdrehungen; // Aufsummieren aller Radumdehungen
strecke = (float)gesamtUmdrehungen * (radumpfang/1000.0); // Fahrtkilometerzähler
if (einzelUmdrehungen > 0) {
drehzahl = 60.0 * 1000.0 * ((float)einzelUmdrehungen) / ((float)zeit); // Raddrehzal
geschwindigkeit = 3.6 * 1000.0 * radumpfang * ((float)einzelUmdrehungen)/((float)zeit); // Geschwindigkeit
} else {
drehzahl = 0.0;
geschwindigkeit = 0.0;
}
display.clearDisplay();
display.setCursor(5, 0);
display.println("Tachometer");
display.setCursor(0, 26);
display.println("o km/h:");
display.setCursor(0, 27);
display.println("/");
display.setCursor(60, 26);
display.println(durchschnittsgeschwindigkeit);
display.setCursor(98, 26);
display.println("km/h");
display.setCursor(0, 16);
display.println("Dauer:");
display.setCursor(60, 16);
display.println(dauerM);
display.setCursor(64, 16);
display.println(":");
display.setCursor(68, 16);
display.println(dauerM);
display.setCursor(77, 16);
display.println(":");
display.setCursor(81, 16);
display.println(dauerS);
display.display();
display.setCursor(0, 36);
display.println("Geschw:");
display.setCursor(10, 36);
display.println(geschwindigkeit);
display.setCursor(68, 36);
display.println("km/h");
display.display();
}
