- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 44

Thema: Uno R3 mit 128x64 Pixel Display und Dreh-Encoder grafische Anzeigeprobleme

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    Wenn man nun bei einer Dezimalzahl die letzte Ziffer "isolieren" möchte, bietet sich eben das Modulo mit 10 an, da ja bei einer Division durch 10 als Rest immer die Einerstelle bleibt. (Möchte man zB die letzten beiden Ziffern isolieren, nimmt man Modulo 100).
    Danke, genau so habe ich das nun auch gemacht, um die 3-stellige Zahl in 2-stellig / 1-stellig zu transformieren, die dann mit Doppelpunkt zwischen angezeigt werden können, so das es nach Uhrzeit aussieht.

    Der Uno ist nun voll (100% Programmspeicher, ich bin schockiert), ich habe daraufhin alle "int" auf "byte" gesetzt,da ich keine Werte über 255 habe.
    Sonst hätten mir nur ein paar Bytes zur Fertigstellung gefehlt. (nun 98%)
    Ich habe mir heute erstmal noch einen Mega R3 bestellt. Das nächste Projekt ist ja ein Farb-LCD 480x272 mit Touchscreen...
    Alle Teile übrigens, außer dem Uno und dem Breadboard, sind vom Schrott. Ich bin so der Resteverwerter beim Basteln.

    Ich wollte eigentlich noch die Displaybeleuchtungssteuerung ins Menü bekommen, aber durch meine unzureichende Kenntnisse ist der Code bestimmt
    sehr ineffizient und dadurch so groß geworden. Ist ja auch mein allererstes Projekt auf dem Arduino... Ein Wunder dass das überhaupt läuft.
    Die digitalen und PWM Ports sind auch alle belegt, deshalb der Mega.

    Ich stelle den fertigen Sketch in Kürze hier ins Forum bei Projekte ein.Wer dann ganz viel Langeweile hat, kann sich den ja ansehen.
    Den meisten Platz belegt die U8G2 Lib. Da sind es schon 76% Auslastung. Ich habe bislang keine anfängerfreundliche Alternative dafür gefunden,
    die sehr viel ressourcenschonender ist.


    Vielen Dank an Euch nochmals, ich kümmere mich jetzt um den LED Treiber mit PWM Eingang...

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    Ich will nicht einen neuen Thread aufmachen, da die Frage jetzt nichts mehr mit dem Titel gemein hat.
    Also, ich habe eine "Funktion" in meinem Sketch, die, wenn aufgerufen solo läuft. as klappt auch alles.
    Dazu habe ich in der Main loop die Abfrage nach dem Taster, der das Umschalten bewirkt und eine Variable, die den Zustand anzeigt.

    Sinngemäß so:
    Wenn ((Taster 1 == HIGH)&&( X==0)) dann X=1;
    while X==1 Funktion();

    In der Funktion frage ich den Taster dann wieder ab, um wieder zurück zur Main loop zu kommen:

    Wenn ((Taster 1 ==HIGH)&&(X==1) dann X=0;

    Was mich stört ist, dass wenn man den Taster festhält, es immer rein und raus und rein und raus geht. Man darf also immer nur kurz drücken. Klar, so steht es ja auch im Sketch...
    Ich grübele, wie ich das verbessern kann, dass der Zustand für jedes Umschalten nur einmal läuft.
    Mir fehlt da wieder eine Gehirnwindung. Helft mir mal auf die Sprünge. Wie macht man das richtig?

  3. #3
    HaWe
    Gast
    du könntest meine Button Class verwenden, die abfragt, ob ein Button KURZ gedrückt wurde
    (Rückgabewert: short press=1):

    https://github.com/dsyleixa/Arduino/...er/ButtonClass

    Alternative Rückgabewerte:
    2 (double click)
    3 (long press)
    0 (no press)

    ____
    ( PS: ich schließe mich Searcher an, dass bei neuen, anderen Problemen auch ein neues Topic aufgemacht werden sollte)
    Geändert von HaWe (14.02.2019 um 20:35 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Zitat Zitat von Wolle62 Beitrag anzeigen
    Ich will nicht einen neuen Thread aufmachen, da die Frage jetzt nichts mehr mit dem Titel gemein hat.
    Neuer thread wär kein Problem und fänd ich auch besser.

    Sinngemäß so:
    Wenn ((Taster 1 == HIGH)&&( X==0)) dann X=1;
    while X==1 Funktion();

    In der Funktion frage ich den Taster dann wieder ab, um wieder zurück zur Main loop zu kommen:

    Wenn ((Taster 1 ==HIGH)&&(X==1) dann X=0;

    Was mich stört ist, dass wenn man den Taster festhält, es immer rein und raus und rein und raus geht. Man darf also immer nur kurz drücken.
    So ganz klar ist mir der gewollte Ablauf nicht. Wenn Du in der Funktion nicht auf Taster HIGH abfragst sondern auf Taster==LOW, dann muß der Taster erst losgelassen werden damit X zu 0 wird. In der Folge wird in der main das X nicht mehr zu 1, es sei denn Taster wird erneut zu HIGH.

    Also in der Funktion "Wenn ((Taster 1 ==LOW)&&(X==1) dann X=0;"

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Das geht relativ einfach. Wird in der SPS-Programmierung häufig verwendet. Man findet einiges wenn man nach Flankenauswertung sucht.
    Aber prinzipiell geht es so:
    Man benötigt eine Hilfsvariable, um den vorhergehende Zustand zu kennen und je nach Zustand muss man reagieren.
    Die Hilfsvariable nenne ich "taste_alt", die Taste selbst nenne ich "taste". Das Programm reagiert auf pos. Flanke.
    Code:
    wenn ((taste == 1) && (taste_alt == 0))
    {
    x ^= x
    }
    
    taste_alt = taste
    MfG Hannes

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    x ^= x
    das verstehe ich nicht. Was für ein Operator ist das "^="?
    Ist das die Auswertung auf eine ansteigende Flanke?
    So etwas hatte ich gesucht, aber nicht gefunden.

    Ich habe es nun so gelöst:
    Code:
    void loop(){
    
    tasterstatus3=digitalRead(taster3);                                                     //Der Taster fürs Einstellmenü
    if ((tasterstatus3==LOW)&&(Einstellmenu==2))Einstellmenu=0;
    if ((tasterstatus3==HIGH)&&(Einstellmenu==0))Einstellmenu=3;
    
    
    while ((Einstellmenu==3)||(Einstellmenu==1))einstell(); 
    
    }
    
    void einstell(){                                                                                    //Das Menü zu Einstellen des Timer
    
    tasterstatus3=digitalRead(taster3);       //damit man wieder rauskommt 
    if ((tasterstatus3==LOW)&&(Einstellmenu==3))Einstellmenu=1;
    if ((tasterstatus3==HIGH)&&(Einstellmenu==1))Einstellmenu=2;
    
    }
    Wie gesagt, die Funktion läuft solo, wenn gesetzt(while..). Daher muss der Ausstieg in der Funktion selbst erfolgen.
    Nun ist sicher, dass der Taster erst wieder losgelassen werden muss, bevor man mit dem nächsten Druck aus der Funktion zurück in die Loop kommt.
    Umständlich, aber geht.
    Der Tipp mit einer zusätzlichen Variablen war genau richtig! Danke!!!

    Das nächste Problem dann in einem neuen Thread, verstanden!
    Geändert von Wolle62 (15.02.2019 um 12:58 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Die Zeile "x ^= x" ist falsch, da x immer 0 bleiben würde. Das sollte eigentlich "x ^= 0xff;" heißen. Diese Zeile ist gleichbedeutend mit "x = x ^ 0xff;", das Zeichen "^" bedeutet in der Sprache C "bitweises XOR". Die Wahrheitstabelle eines XOR ist (A & B sind Eingänge, Q ist der Ausgang):
    A B Q
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    Sprich wenn A und B unterschiedlich sind, ist der Ausgang 1, sonst 0.

    Das kann man z.B. zum Invertieren einer Led nutzen. Z.B. "PORTB ^= (1<<PB0);" ändert jedes mal den Ausgang PB0.

    Das mit dem XOR habe ich geschrieben, weil du oben geschrieben hast ".....(x == Low) dann x = high" und dann "...(x == high) dann x = low", das wäre eine einfache Invertierung.

    MfG Hannes

  8. #8
    HaWe
    Gast
    verständlicher wäre
    x= !x;
    wenn man wechselweise von 1 auf 0 switchen will und wieder zurück

Ähnliche Themen

  1. Dreh-Encoder gibt "Rückschlag-Impuls" ab - wieso nur?
    Von t0bias im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 03.03.2014, 16:08
  2. Dreh-Encoder und Tasten gleichzeitig abfragen
    Von DerSchatten im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 13.05.2011, 20:16
  3. LCD-Display 128x64 mit dem Controler T6963c
    Von heri im Forum PIC Controller
    Antworten: 8
    Letzter Beitrag: 05.06.2007, 22:04
  4. Funktioniert der Pollin-Dreh-Encoder mit BASCOM?
    Von felack im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 27.06.2006, 17:52
  5. Hyundai 128x64 LC-Display
    Von ShadowPhoenix im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 01.12.2005, 21:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress