OLED-Display Darstellung Dezimalzahlen

Moin Allerseits,

ich möchte auf einem OLED-Display eine Zeitanzeige (00:00:00) darstellen und diese per Tastendruck verändern können.

Sobald ich den Taster gedrückt lasse werden die Zahlen leider nicht nacheinander, sondern sprunghaft und auch verpixelt dargestellt. Es erfolgt also keine aufeinander Folge der Zahlendarstellung auf dem Display. Eher zufällig werden Zahlen auf-, oder absteigend, je nachdem ob ich Taster hoch, oder Taster runter betätige dargestellt.
Beispiel: ich drücke den Taster und es soll hoch gezählt werden. Die Darstellung beginnt bei 0. Ich drücke den Taster und lasse diesen gedrückt. Jetzt wird 5 angezeigt und als nächstes die 14, dann die 27, dann 34 ect. Es werden alle Zahlen dazwischen nicht mit angezeigt. Klar, es kann natürlich sein, das die Zahlen, bez. der Wert der Variable zu schnell verändert wird und das Display in seiner Ausgabe nicht hinterherkommt.

Wenn ich den Taster immer nur kurz drücke, wird eine aufeinander Folge von zahlen korrekt dargestellt. Ich möchte aber dazu in der Lage sein den Taster gedrückt zu lassen, um mir so das ständige drücken des Taster zu ersparen.

Leider habe ich noch keine Lösung für mein Problem gefunden. Zur Zeit versuche ich das Problem mit dem Einsatz der Funktion millis() zu umgehen. Also nur zu einer gewissen Zeit die Erhöhung/Verringern der Zahl zu ermöglichen. Wenn ich z.B. 1 Sekunde einstelle, sprich nur jede Sekunden erhöht wird, dann Funktioniert die Darstellung. Aber das hat natürlich zur Folge, dass das hoch/runter Zählen einfach viel zu lange dauert.

Ich würde mich sehr über eine Hilfestellung sehr freuen und möchte mich im Voraus für deine Anteilnahme bedanken.

Gruß
Sebastian

Ps.: Ich nutze ein OLED-Display mit der Bib SSD1309, SPI

Sind das nicht die gleichen Probleme wie hier?

Zumal der TO dort sagt, es ist gelöst, aber die Lösung nicht bekannt gibt.
Solchen Leuten werde in nicht mehr helfen.

Gruß Tommy

Hallo
Such Mal hier im Forum nach drei Tasten Menü , ich glaube da habe ich vor einiger Zeit mal was gemacht
Heinz

@Tommy56

Ich habs hinbekommen indem ich einfach die clear()-Funktion an unterschiedlichen stellen meines Programmiercodes eingefühgt habe und dann geschaut habe, ob das einen Einfluss auf das Flackern hat. Irgendwan hat es dann geklappt. Warum es dann so und nicht anders geklappt hat, kann ich dir nicht sagen. Deswegen und weil ich dann meinen Programmiercode, der für jmd anderen geschrieben wurde, hier als Beispiel hätte veröffentlichen müssen, bin ich nicht näher darauf eingegangen.

Gruß

@Moko

Moin,

nein, das war ein ganz anderes Problem, welches ich zu diesen Zeitpunkt hatte. Da habe ich auch ein OLED-Display mit der Bib SSD1305 und nicht SSD1309 verwendet. Ob es da jetzt einen große Unterschiede gibt, weiß ich nicht genau. Ich hab natürlich schon mal geschaut, ob ich in meinen alten Programmiercode eine Lösung finde.

Leider nicht. Hat aber wahrscheinlich auch damit zu tun, dass ich da anders vorgegangen bin, bez. kein Taster zum Einsatz kam. Und somit auch nicht die Möglichkeit die Zahlen per Dauerdrücken des Tasters hoch/runter zählen zu lassen.

Ich schätze, dass dieser Fehler aber wieder mit der Art und Weise, wo und wie ich in meinem Programmiercode vorgehe auftritt.

Ja, jetzt könnte ich euch gerne den Programmiercode hier hochladen. Ich glaube aber, dass das nach meiner Erfahrung her zu mehr Verwirrung führen würde. Ich müsste dann wahrscheinlich erst mal im Deteil erklären, was mein Programmiercode macht, da ich nur ein Teil des gesamten Projektes hier veröffentlichen würden....

@Rentner
Danke für dein Tipp, das werde ich tun

Gruß

Dann kürze den Code soweit, dass der Fehler noch auftritt, und zeige ihn.

Was ist das denn für eine Ausrede ?

Tja, da hat wohl irgendwo eine Blockade im Code zugeschlagen oder gar ein bouncen.
Aber Ohne Code ist das raten ins blaue - und das sowas ausarten kann, hab ich grad an anderer Stelle erlebt, wie man aneinander vorbei redet.

@HotSystems

Ausrede? Soll ich dann jedes Mal mein Programmiercode so bearbeiten, dann man als Außenstehender alles genau nachvollziehen kann?

Ist doch Quatsch!

Abgesehen davon, kann man die Lösung meines Problemes nicht pauschalisiert werden.

Starke Worte.

Wenn Du davon überzeugt bist, dann mach Dir mal Gedanken darüber wie Dir geholfen werden soll.

Nö.
Nur so, das er lesbar ist und das Problem aufgezeigt wird.

Neee, musst du nicht. Dann erwarte hier auch keine Hilfe.

ist okay. ist ja nicht so, dass man sich dazu verpflichtet fühlen soll mir zu helfen. trotzdem großen dank an alle

Was erwartest Du denn mehr als "In Deinem Sketch ist ein Fehler. Finde und beseitige ihn." ?

Das geht nicht um eine Verpflichtung, sondern darum, wie man sich in diesem Vorum verhält. Dazu solltest du zwingend mal den Beitrag "diese Forum nutzen" durchlesen.
Dann verstehst du evtl. auch, was dir geschrieben wurde.

Ich hab meine Zeitanzeige/Zeiteinstellung mal neu programmiert. Eigentlich nichts besonderes. Wollte meine Lösung dennoch hier teilen. Vielleicht könnte es in Zukunft jmd weiter helfen.

Ehrlich gesagt steige ich nicht mehr so ganz durch meinen alten Code durch. Da ich aber eh die schrittweise Erhöhung der Sekunden wechseln wollte, hab ich das gleich mit gemacht. Jetzt werden die Sekunden in 5er Schritten erhöht/verringert.

So funktioniert diese und jetzt werd ich das mal in meinuhrsprüngliches Programm einbauen. Hoffentlich bekomme ich das auch hin. :wink:

Sofern ihr Verbesserungvorschläge meines Programmier-Stils ect. habt, dann gerne raus damit. Lerne immer gerne dazu. Danke im Voraus.

// -------------------------------------- OLED --------------------------------------
#include "U8glib.h"
//Arduino-Pinbelegung: SCK = 13, MOSI = 11, CS = 10, DC = 9, RES = 8
U8GLIB_SSD1309_128X64 u8g( 13, 11, 10, 9, 8);

// ------------------------------------- TESTER -------------------------------------
#define TASTER_HOCH        16
#define TASTER_BESTAETIGEN 15
#define TASTER_RUNTER      14

//Zeitvariablen
byte sekunden = 0;
byte minuten  = 0;
byte stunden  = 0;

//Prototypen
void _tasterAbfrage();

//Programm-Voreinstellungen
void setup() {
    //Serielle Kommunikation
    Serial.begin(9600);
    //TASTER
    pinMode(TASTER_HOCH,        INPUT); 
    pinMode(TASTER_BESTAETIGEN, INPUT);
    pinMode(TASTER_RUNTER,      INPUT);
    
    //OLED-Display Schriftart
    u8g.setFont(u8g_font_9x18);    
  }

//Ausführbares Hauptprogramm
void loop() {
    //Tasterabfrage
    _tasterAbfrage();
    
    //Displayansteuerung SSD1309
    u8g.firstPage();
    do {_zeitDisplay();}
    while(u8g.nextPage());  
}

//Displayausgabe
void _zeitDisplay() {
    //SEKUNDEN
    u8g.drawStr(10,10, "Sekunden");
    u8g.setPrintPos(90,10);
    u8g.print(sekunden);
    //MINUTEN
    u8g.drawStr(10,30, "Minuten");
    u8g.setPrintPos(90,30);
    u8g.print(minuten);
    //STUNDEN
    u8g.drawStr(10,50, "Stunden");
    u8g.setPrintPos(90,50);
    u8g.print(stunden);
}

//Tasterabfrage
void _tasterAbfrage() {
    // ---------- Taster HOCH ----------
    if(digitalRead(TASTER_HOCH) == HIGH) {
        delay(50);
        if(digitalRead(TASTER_HOCH) == HIGH) {
            //Sekunden erhöhen, bis 55 erreicht wird
            if(sekunden >= 0 && sekunden < 55) {sekunden = sekunden +5;}
            //Minuten erhöhen, wenn Sekunden 55 erreicht hat
            else if(sekunden == 55) {
                minuten ++;
                sekunden =0; //Sekunden zurück setzten auf 0
        
                //Stunden erhöhen, wenn Minuten 59 erreicht hat
                if(minuten == 60) {
                    stunden ++;
                    minuten =0; //Minuten zurücksetzten auf 0
                }                          
            }                  
        }
        Serial.print("sekunden: "); Serial.println(sekunden);
        Serial.print("minuten:  "); Serial.println(minuten);
        Serial.print("stunden:  "); Serial.println(stunden); 
        Serial.println(); delay(125);      
    }   
    
     
    // ---------- Taster RUNTER ----------
    if(digitalRead(TASTER_RUNTER) == HIGH) {
        delay(50);
        if(digitalRead(TASTER_RUNTER) == HIGH) {
            //Sekunden verringern, bis 0 erreicht wird
            if(sekunden > 0) {sekunden = sekunden -5;}
            //Minuten verringern, wenn Sekunden 0 erreicht hat
            //Sofern Minuten zuvor erhöt wurden            
            else if(sekunden == 0 && minuten > 0) {
                  minuten    --;
                  sekunden = 55; //Sekunden zurücksetzten auf 55
            }
            //Stunden verringern, sofern Minuten 0 erreicht hat
            else if(sekunden == 0 && minuten == 0 && stunden > 0) {
                  stunden    --;
                  minuten  = 59; //Minuten zurück setzten auf 59
                  sekunden = 55; //Sekunden zurücksetzten auf 55
            }
        }
        Serial.print("sekunden: "); Serial.println(sekunden);
        Serial.print("minuten:  "); Serial.println(minuten);
        Serial.print("stunden:  "); Serial.println(stunden); 
        Serial.println(); delay(125);
    }     
}     

mach da const draus. Werte die sich nicht ändern: const.

Das hab ich doch auch schon mal gesehn - das ist Mist. Und das wurde Dir IMHO auch schon mal gesagt.
In den Beispielen: blinkWithout delay und dann die Daten ohne delay und mit debounce auf millis()-Basis.

Und das versteh ich nicht.

Bist Du sicher, das das funktioniert?
Wenn Sekunden 3 ist und du davon 5 abziehst....

@my_xy_projekt
Du hast absolut recht. Ich habe die delay()-Funktion gegen millis() ausgetausch. Das habe ich auch in meinen anderen Programmiercode so gemacht und sehe an, dieser funktioniert jetzt ohne das sprunghafte Anzeigen der Zahlen und auch ohne die Verzerung der Zahlen bei der Darstellung!

Alles funktioniert jetzt perfekt!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.