Hi,
ich versuche ein Display Menü zu basteln, nachdem ich mir zich
unterschiedliche Möglickeiten angesehen habe und mir keines richtig
einleuchtete. Hab überlegt, dass es doch mit der switch methode gehen
müsste, nun aber mittendrin frag ich mich, ob das zu "dirty" ist, obs
überhaupt funktioniert und wie ich die Tasterfunktion mit rein bringe,
sollen drei Taster dran, zwei Richtungen und Menü/Ok. Hier mal der
bisherige Versuch.
Mfg
1
//MENU
2
switch(menu)
3
{
4
casemainPage://Main page
5
6
display.clearDisplay();
7
8
//Display time
9
display.setCursor(16,1);//Position text cursor for time display
10
if(t.hour<10){
11
display.print(" ");//Add leading space if single-digit hour
@ Ardu (Gast)
>ich versuche ein Display Menü zu basteln, nachdem ich mir zich>unterschiedliche Möglickeiten angesehen habe und mir keines richtig>einleuchtete. Hab überlegt, dass es doch mit der switch methode gehen>müsste,
Kann man machen.
> nun aber mittendrin frag ich mich, ob das zu "dirty" ist,
Nein.
> obs>überhaupt funktioniert
Man sollte KEIN display.clearDisplay(); machen, denn das flackert immer
beim Neuaufbau. Deutlich besser und schneller ist ein ÜBERSCHREIBEN das
aktuellen Displays, incl. Leerzeichen natürlich.
>und wie ich die Tasterfunktion mit rein bringe,>sollen drei Taster dran, zwei Richtungen und Menü/Ok. Hier mal der>bisherige Versuch.
Die Taster liest man per Timer und Entprellung in einem Interrupt ein,
siehe Entprellung, der Codeschnipsel von Peter ist ja schon legendär
;-)
https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29
Dann gibt es eine Funktion, welche die Tasten ausliest. Damit geht man
dann in den switch und reagiert entsprechend. Etwa so.
Juhu, eine Antwort :D ...
Du meinst die Bereiche des alten Bildes mit Leerzeichen im neuen
überschreiben?
Die Taster entprelle ich so:
1
//Menu/set button open menu - outside time/display update processing for faster button response
2
if(!digitalRead(8)){//Read menu/set button
3
delay(25);//25ms debounce time
4
if(!digitalRead(8)){//Activate setting mode change after 100ms button press
5
menu=menu;//Increment the setting mode on each button press
6
}
7
while(!digitalRead(8)){}//Wait for button release
8
}
Naja, ich werds erstmal so versuchen...
Cool, so habe ich auch gedacht, die Taster-If's in die Switch-Ebenen
einzubauen und darauf hoffen, dass sie dann entsprechen innerhalb der
Switch-Ebenen funktionieren, d.h. dass der Menü-Button automatisch zum
Ok-Button wird. Denke ich so richtig?
Vielen lieben Dank soweit, nur eine Antwort, aber absolut perfekt :)
seehr wartbar, dieses eeeelllllenlaaaaange switch statement; aber sowas
von.
Der Übersicht halber, sollte so eine Verzweigungsleiter doch +/-
innerhalb 1 Bildschirmseite Platz finden, auch nach künftigen
Erweiterungen.
Also vllt. Funktionen schreiben:
1
:
2
switch(menuContext->wahl) {
3
case MENU1: f_MENU1(menuContext); break;
4
case MENU2: f_MENU2(menuContext); break;
5
case MENU3: f_MENU3(menuContext); break;
6
default: implVersemmelt(menuContext);
7
}
Der aufmerksame Codeleser sieht aber dass sowas nach Funktionstabellen
riecht, usw...
@Ardu (Gast)
>Du meinst die Bereiche des alten Bildes mit Leerzeichen im neuen>überschreiben?
Ja.
>Die Taster entprelle ich so:
Nicht wirklich gut, vor allem weil du auf das Loslassen des Tasters
wartest. Das ist unnötig und kontraproduktiv. Denn wenn der Anwender,
warum auch immer, die Taste gedrückt hält, steht dein Programm!
Wichtig ist die logische Trennung von Tastenentprellung und
Weiterverarbeitung in deiner Statemachine. Die ist in deinem
Beispiel NICHT drin, das ist unbrauchbar. Wie es richtig geht habe ich
dir schon gesagt.
Für den ersten schnellen Test kann man es so machen, später ist ein
Timer DRINGEND zu empfehlen.
1
#define KEY_MENU_UP 1
2
#define KEY_MENU_DOWN 2
3
#define KEY_MENU_OK 4
4
#define KEY_MENU_ESCAPE 8
5
6
7
uint8_tget_key(void){
8
staticuint8_tkey_old;
9
uint8_tkey,press;
10
11
key=0;
12
13
// sample multiple keys
14
if(digital_read(8))key|=KEY_MENU_UP;
15
if(digital_read(9))key|=KEY_MENU_DOWN;
16
if(digital_read(10))key|=KEY_MENU_OK;
17
if(digital_read(11))key|=KEY_MENU_ESCAPE;
18
19
press=key&~old_key;// active edge of keys
20
delay(10);//10ms debounce time
21
key_old=key;
22
returnpress;
23
}
24
25
//....
26
27
menu_key=get_key();
28
29
if(menu_key&KEY_MENU_UP){// mach was bei Taste MENU_UP
30
}
31
32
if(menu_key&KEY_MENU_OK){// mach was bei Taste MENU_OK
33
}
34
35
// etc.
>Cool, so habe ich auch gedacht, die Taster-If's in die Switch-Ebenen>einzubauen und darauf hoffen, dass sie dann entsprechen innerhalb der>Switch-Ebenen funktionieren, d.h. dass der Menü-Button automatisch zum>Ok-Button wird. Denke ich so richtig?
Ja.
Ahaaa, super, das sind mal super Wegweiser, so ergibt sich auch mehr ein
Sinn aus den Beispielen, die ich so ergoogelt habe, und zwar eure beiden
Antworten. Das mit den Funktionen, also "void menu", "void submenu"
etc., die dann über die Tasten-Switches abgerufen werden, und in diesem
Zusammenhang auch das Tasterbeispiel, welches sich ebenso in den
Beispielen findet, aber komplizierter und mit timer, aber da das jetzt
mehr Sinn für mich ergibt, werden ich die noch einige Male lesen, bis
ich wieder "ahaa" denke ;P
Hab mit folgendem Code angefangen zu lernen, bin noch Anfänger, verstehe
aber schon recht viel, bin erstaunt darüber, wie verhätnismäßig einfach
Arduino ist, liegt zwar auch daran, dass ich Visual Basic, HTML und Java
gelernt habe, da bin ich etwa fortschrittlicher Anfänger, aber
dennoch...
Jedenfalls ist da eine "flash"-Funktion eingebaut, die den Timer
darstellt, verstehe diese aber erstens nicht ganz und zweitens gefällt
mir auch nicht, dass das Blinke des Rechtecks, (display.drawRect),
ungleichmäßig ist, etwa vier Mal und dann kurzer Hänger, so reagieren
auch die I/O, also Taster und LED, diese Blinken exakt im selben Takt,
ist zwar nur einen Software-Bastelei zum Üben, aber wenn ich weiter gehe
und über Transistoren schalten will, ist das wohl sehr unvorteilhaft.
Andereseits sorgt das "flash"en für eine saubere Aktualisierung des
Displays, die Sekunden fangen an bei einer Verzögerung von 250ms zu
stocken. Weiss also nicht so konkret wie ich da vorgehen soll.
Ich merke aufgrund der langen Antwortzeiten und weiss, dass das Thema
nicht so reizvoll ist und vielleicht sogar nervt, aber als Anfänger
braucht man eben diese Denkanstöße, daher bin ich euch sehr dankbar
dafür und für weitere Hilfe.
Wünsche euch noch ein schönes Wochenende und vielen lieben Dank nochmals
:)
Code:
1
#include<SPI.h> //Library for Adafruit communication to OLED display
@ Ardu (Gast)
>Jedenfalls ist da eine "flash"-Funktion eingebaut, die den Timer>darstellt, verstehe diese aber erstens nicht ganz
Das ist eine ganz normale Variable, welche als bool-Wert genutzt wird.
Bei jedem Aufruf deines Riesenkonstrukts
>if ((now - prev > interval)) { //Determine whether to start a time and screen
update
wird flash invertiert.
> if(flash == 0){flash = 1;}else{flash = 0;} //Toggle flash flag for cursor
blinking later
Das kann man auch deutlich einfacher schreiben.
flash = !flash;
Damit wechselt (eng. toggle) der Wert bei jedem Durchlauf des
Konstrukts, damit kann man ein Blinken eines Cursors steuern. Und genau
das wird auch gemacht.
>und zweitens gefällt>mir auch nicht, dass das Blinke des Rechtecks, (display.drawRect),>ungleichmäßig ist, etwa vier Mal und dann kurzer Hänger, so reagieren>auch die I/O, also Taster und LED, diese Blinken exakt im selben Takt,
Tja, das ist das Problem der blockierenden Programmierweise. Sagte ich
bereits. Es gibt KEINEN Grund, auf das Loslassen der Taste zu warten.
Man muss den Zustandswechsel der Taste erkennen und auswerten. Siehe
mein Beispiel!
Weiterhin sind an einigen Stellen ein paar eher aufwändige Rechnungen
drin, die dauern eine Weile, das könnte der Grund für das ungleichmäßige
Anzeigen sein, denn diese Anzeigen sind von der Variablen flash
abhängig.
Das hier z.B.
1
//Position and draw hour tick marks
2
for(intz=0;z<360;z=z+30){
3
//Begin at 0° and stop at 360°
4
floatangle=z;
5
angle=(angle/57.29577951);//Convert degrees to radians
6
intx2=(64+(sin(angle)*20));
7
inty2=(40-(cos(angle)*20));
8
intx3=(64+(sin(angle)*(20-5)));
9
inty3=(40-(cos(angle)*(20-5)));
10
display.drawLine(x2,y2,x3,y3,WHITE);
11
}
>ist zwar nur einen Software-Bastelei zum Üben, aber wenn ich weiter gehe>und über Transistoren schalten will, ist das wohl sehr unvorteilhaft.>Andereseits sorgt das "flash"en für eine saubere Aktualisierung des>Displays, die Sekunden fangen an bei einer Verzögerung von 250ms zu>stocken.
Wie meinst du das? Welche Verzögerung und wo?
Noch ein Tipp. Die Formatierung deines Quelltextes ist
verbesserungsfähig. Sowas macht man nicht!
1
if(t.hour==0){display.print("12");}//Convert zero hour for 12-hour display
2
elseif(t.hour<13&&t.hour>=10){display.print(t.hour);}//Just display hour if double digit hour
3
elseif(t.hour<10){display.print(" ");display.print(t.hour);}//If single digit hour, add leading space
4
elseif(t.hour>=13&&t.hour>=22){display.print(t.hour-12);}//If double digit and PM, convert 24 to 12 hour
5
else{display.print(" ");display.print(t.hour-12);}//If single digit and PM, convert to 12 hour and add leading space
Ok, ja, ich hatte überlegt, ob ich die .ino dranhängen soll oder den
Code komplett so, das ist auch der Ursprungscode, den habe ich stark
abgeändert, ging ja erstmal hauptsächlich um die flash funktion und
damit das klarer ist und meine Veränderungen nicht verwirren, habe ich
den originalen gepostet. die RTC_Clock.ino habe ich auf dem Handy meinen
Code auf dem PC, kann ich ja posten, wenn ich später am PC bin.
Ich entschuldige mich erstmal für die fehlende Nettiquette und für meine
langen und teils schwer verständlichen Texte, aber das ist ein Problem,
das ich so nicht lösen kann.
Die von dir angemerkten Fehler habe ich nicht mehr in meinem Code, die
meisten Spielereien sind draussen. Das Konstrukt ist jetzt nicht mehr
ganz so riesig, aber für meinen Geschmack immer noch zu groß. Ich nutze
ein anderes Display, das PCD8544, und will auch nicht, dass der Cursor
blinkt, das soll eigentlich garnichts blinken, will aber eine Markierung
des ausgewählten Menüpunktes, so wie es bei z.B. einem Nokia 3310 ist,
denke auch einfach die Farbe des gewählten zu invertieren, anstatt des
Rechtecks, aber das ist im Moment total irrelevant, eine spitze Klammer
reicht auch zum Basteln.
Ich meine diese Verzögerung:
1
unsignedlongprev,interval=100;//Variables for display/clock update rate
2
byteflash=0;//Flag for display flashing - toggle once per update interval
Habe in meinem Code auch eine Strukturierung rein gebracht und viele
Anmerkungen und Überschriften geändert und ergänzt, habs nur englisch
gehalten. Auch lasse ich den Code regelmäßig von der Arduino IDE
automatisch formatieren. Grad als Anfänger finden ich das ist die
absolute Basis, dass man es auch richtig lernen kann, deswegen brauche
ich ja immer wieder eure Hilfe, weil viele der Beispiele nach dem Motto
"hauptsache Speichesparend und funktional" geschrieben sind und aus der
Sicht von Leuten, die es einfach drauf haben, ich weiss aus anderen
Bereichen, dass dann einem die Sicht des Anfängers verloren gehen kann,
die Anmerkungen sind meist nicht gleich schlüssig, deswgen ist es gut,
dass du konkrete Beispiele postest und sie kurz erläuterst, ich kenne
sie aus Beispielen und kann sie eben durch unschlüssige Anmerkungen
nicht verstehen, so aber klickts ;)
@ Ardu (Gast)
>Ich meine diese Verzögerung:>unsigned long prev, interval = 100; //Variables for display/clock update >rate
Wie ich bereits sagte. Die Funktion loop() wird beim Arduino in einer
Endlosschleife aufgerufen. Im "echten" C würde das so aussehen.
main () {
setup();
while(1) loop();
}
In deiner loop() Funktion wird geprüft, ob die Differenz zwischen now
und prev > intervall ist. Wenn ja, wird dein Konstrukt ausgeführt,
sprich, ein Menuupdate. now ist eine Variable aus dem Arduino-Framework,
sie wird mittles Timer-Interrupt im 1ms Takt hochgezählt. Siehe
Arduino-Doku.
https://www.arduino.cc/en/Reference/Millis
1
if((now-prev>interval)){//Determine whether to start a time and screen update
Das habe ich ja verstanden, aber du hattest gefragt welche Verzögerung
und wo, wenn ich da den Wert höher setze, stocken wie erwähnt die
Sekunden, aber eigentlich müssten die Sekunden auch so im Loop immer im
richtigen Takt angezeigt werden, oder?
Bin auch nicht sicher, ob diese kurze Verzögerung nach allen ca. 4
"flash"es irgendwas mit dem Kodensator am PCD8544 zutun hat, dass es auf
das Loslassen des Tasters wartet klingt für mich schon logischer.
Ansonsten will ich ja das flashen komplett weg haben und nur einen Timer
zum Entprellen der Taster, es ist nur wegen den Sekunden und dem Display
noch drin, weil dieses damit auch etwas besser läuft, in meinen ersten
Versuchen mit der PCD8544 Library von carlosefr blinkt das Display auch
bei jedem Loop-Beginn, das Flackern ist also so ein grundsätzliches
Problem, könnte auch, wie du es erwähnt hast, am display.clearDisplay()
liegen, muss ich auch mal ausprobieren.
Das Menü-Update müsste doch eigentlich ebenso wie die Sekunden im Loop
aktualisiert werden, oder?
Was ein Loop ansich ist, ist mir schon klar, aber noch nicht genau der
Zusammenhang und der Einfluss den ich nehmen muss, damit das alles
ordentlich angezeigt wird und auch die I/O's nicht flackern.
Setzt mich später wenn ich Zeit hab vor den Rechner, ergänze und
verändere meinen Code dann soweit und hänge ihn hier mit dran, hoffe
du bist dann noch/wieder da :)
Last but not least, thanks again a lot :)
@ Ardu (Gast)
>Das habe ich ja verstanden, aber du hattest gefragt welche Verzögerung>und wo, wenn ich da den Wert höher setze, stocken wie erwähnt die>Sekunden,
Das sollte man aber auch so sagen, ich kann nicht hellsehen (weil ich ja
in Dunkeldeutschland wohne . . .)
Siehe Netiquette.
> aber eigentlich müssten die Sekunden auch so im Loop immer im>richtigen Takt angezeigt werden, oder?
Ja. Aber nur dann, wenn der Durchlauf deiner Anzeige nicht länger als
ein Timerzyklus ist, hier dein interval.
>Bin auch nicht sicher, ob diese kurze Verzögerung nach allen ca. 4>"flash"es irgendwas mit dem Kodensator am PCD8544 zutun hat,
HALLLOOOOO!!!! Ist dir auch schon mal EINE Sekunde in den Sinn gekommen,
daß ich NICHT neben dir sitze und nicht mal ANSATZWEISE sehe was du
siehst, geschweige denn was in deinem Kopf vorgeht?
https://www.mikrocontroller.net/articles/Netiquette#Klare_Beschreibung_des_Problems
Wenn du ein Problem des Schaltplans diskutieren willst, mußt du den
mitliefern!
> dass es auf>das Loslassen des Tasters wartet klingt für mich schon logischer.
Na dan mach den Unsinn doch endlich mal raus! Wie man es gescheit macht,
hab ich dir doch schon gezeigt!!!
>Ansonsten will ich ja das flashen komplett weg haben
Auch hier solltest du dich um eine klarere Sprache bemühen. "Flashen"
ist im Umfeld von Mikrocontrollern der Vorgang zum Programmieren der
Firmware. Du redest von der Variable flash in deinem Programm zum
Blinken.
Ausserdem, wo ist das Problem? Mach die Variable weg und alle Abfragen
darauf auch. Flashen weg.
> und nur einen Timer>zum Entprellen der Taster,> es ist nur wegen den Sekunden und dem Display>noch drin, weil dieses damit auch etwas besser läuft, in meinen ersten>Versuchen mit der PCD8544 Library von carlosefr blinkt das Display auch>bei jedem Loop-Beginn, das Flackern ist also so ein grundsätzliches>Problem, könnte auch, wie du es erwähnt hast, am display.clearDisplay()>liegen, muss ich auch mal ausprobieren.
Dann tu das doch einfach!
>Das Menü-Update müsste doch eigentlich ebenso wie die Sekunden im Loop>aktualisiert werden, oder?
Ja.
Wie geschrieben fällt es mir schwer mich schriftlich auszudrücken,
entschuldigung nochmals dafür.
Ich habe ja soweit alles verstanden und weiss wie ich das "flash"en
entferne, nur war mir bislang nicht klar wie wichtig das ist wegen der
Zeitanzeige und der Menü-Aktualisierungund, das geht doch aber aus
meinem Text klar hervor, du kannst ja einfach fragen, wenn Informationen
fehlen.
Das Display ist standartmäßig angeschlossen, wie in angehängter Grafik.
Ich will dir hier nicht dein Wochenende schlecht machen, sondern auch
ein Feedback geben, um dir eben auch zu schildern was und wie ich denke
und was ich vorhabe, bei den Fragen ist ein Fragezeichen am Ende und bei
den Aussagen nicht, diese kannst du natürlich gerne kommentieren, eben
in dem Fall, dass ich falsch denke, aber es sind keine wiederholten
Fragen, die beantwortest du perfekt, wie schon erwäht. Da verstehe ich
dein Problem nicht, denke da liegt ein Missverständnis vor. Kritik ist
immer gerne willkommen, aber bitte gerechtfertigt.
@ Ardu (Gast)
>Das Display ist standartmäßig angeschlossen, wie in angehängter Grafik.
Ist OK, der Kondensator hat mit dem Flackern nichts zu tun. Es ist ein
Entkoppelkondensator für das LCD.
https://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator>dein Problem nicht, denke da liegt ein Missverständnis vor.
Scheint wohl so.
Also dann, viel Spaß noch beim Programmieren.
Ardu schrieb:> Kritik ist> immer gerne willkommen, aber bitte gerechtfertigt.
OK
Ardu schrieb:> standartmäßig
weil der Spruch so toll ist zitier ich mal:
In Africa gibt es einen Stamm dort stehen sie gerne auf einem Bein, weil
das ihre Standart ist ist das bei denen Standard
Danke Falk, geniess dein Wochenende, soweit es möglich ist :) Komme erst
heute Abend dazu das alles in die Tat umzusetzen, wenn ich nach der
Spätschicht noch die Energie dazu hab.
@ Joachim
Na das kriegste aber gleich zurück: Afrika schreibt man in der deutschen
Sprache mit "k". Nach "Stamm" muss ein Komma hin und danach "bei
dem...", "...Standart ist" Komma "ist...". Und selbstverständlich gehört
an das Ende eines Satzes ein Punkt. ;PPPP Das haste davon! Und nu zähl
mal meine Fehler auf... wir schreiben uns in ein paar Tagen ;P
Das Display wird eben so in den meisten Fällen angeschlossen, egal, ob
am LPT-Port oder am Mikrocontroller, da muss ein
10müh-Fahrrad-Kondensator hin, daher ist es die Standart-Beschaltung.
> liegt zwar auch daran, dass ich Visual Basic, HTML und Java> gelernt habe,
Aber weder Strukturierte/Modulare Programmierung noch sowas wie
"Algorithmen & Datenstrukturen", wie an deinem Code ersichtlich.
Erweiterungen wie z.B. Anzeigetexte in wählbarer Sprache verbockst Du
Dir so.
1
constchar[12][5]MONATE={
2
"Jan ",
3
"Feb ",
4
:
5
"Dez "
6
};
7
8
voidprintMonth(constintmonth,constchar[]lang)
9
{
10
if((0<=month)or(month<12))
11
display.print(lang[month]);
12
else
13
display.print("--- ");
14
}
15
16
17
constchar[7][5]WOCHENTAGE={
18
"Mon ",
19
"Die ",
20
:
21
"Son "
22
};
23
24
voidprintDay(constintdayofweek,constchar[]lang)
25
{
26
if((0<=dayofweek)or(dayofweek<7))
27
display.print(lang[dayofweek]);
28
else
29
display.print("--- ");
30
}
Legst Du dein Code beiseite und entdeckst z.B zum Jahresende (in 10
Mte.) eine Fehlanzeige: wie findest Du anhand der Anzeige die passende
Codestelle?
Bisher ist Dein Code unwartbar.
Du weisst dass deine Anzeige entweder 2x pro s (":" flasht In der
Zeitanzeige, Sek.Zeiger springt) oder 6x pro s beim einstellen.
--> schreibe eine möglichst einfache zeitgesteuerte Schleife welche
EXAKT alle 1/6tel s durchläuft und nix anderes tut als:
- entscheidet ob dieser Durchlauf übersprungen werden kann oder
folgendes zu tun ist:
- einen Buffer char[2][16] (oder wie gross auch immer dein Dosplay
ist) zum LCD screibt
- den Buffer m. " " (Leerschlag) kompl. füllt
- neuen Bufferinhalt f. nächsten Durchlauf berechnet
Erstmal ist nicht so wichtig wie und mit welcher genauigkeit die
1/6tel s eingehalten werden (trödeln und Ticks zählen).
Dies kann spaeter per zeitbasierten Interrupt geschehen. Noch spaeter
kann auch Schalfmodus/Aufwecken dazukommen (wg. Stromsparen)
Mach Dir ne Übersicht, welche Muster an Text char[2][16] (resp. Deine
Displaygrösse) vorkommen:
1
// 0....5...10...15.
2
// [0]"time hh:mm WWW "
3
// [1]"date YYYY-MM-DD"
In diesen "Masken" jeweils die Platzhalter durch die veränderlichen
Werte ersetzen.
Beim neubefüllen des Buffer, in einem Schlonz das Zeugs rüberkopieren
(memcpy() oder so).
Tritt nun ein Anzeigefehler auf, lässt sich die zugehörige Codestelle
mit der ähnlichsten Maske/Muster sehr direkt auffinden.
PS: man verzeihe mir ev. C-Syntaxverletzungen, es geht mir um bessere
Programmarchitektur. Syntax wird vom Compiler geschiedsrichtert.
Leuchte: Wie erwähnt ist das nicht mein Code, sondern die Basis von
meinem, der mittlerweile stark abgeändert ist. U.A. ist da nichts mehr
mit Datum, hab alles so weit abgespeckt, dass ich im Grunde eine Uhr mit
zwei Weckern und einem Menü habe, das ist kein Projekt, sondern Lernen,
bis auf das erwähnte "flash"en ist nichts mehr in dem Code, das ich
nicht verstehe, bzw. verstehe ich das jetzt dank Falk, aber es wird
ebenso entfernt und die empfohlene Methode angewendet. Mir ist klar,
dass solche Dinge wie Datum schon deutlich komplexer sind, daher ist das
alles weg, auch Zeichnungen mit der Adafruit_GFX Bibliothek, wobei diese
leicht zu verstehen ist, aber einfach im Moment unnötig.
Entschuldige Leuchte, hab den Rest erst garnicht wahr genommen, hatte
den originalen Code eigentlich gepostet, weil ich Verwirrungen vermeiden
wollte, hab sie aber erst dadurch ausgelöst. Am besten ist, wenn ich
meinen vervollständige und dann hier anhänge. Ich nutze die
Adafruit_PCD8544 Bibliothek, die hat einen Buffer,hab mich noch nicht
damit beschäftigt wie ich den nutzen soll, wenn es besser ist, hänge ich
das ganze Projekt dran, mit allen Bibliotheken, da bitte bescheid sagen.
Wenn mein Code hier steht, kannst du mir ja auszugsweise Beispiele
zeigen, wie genau du das meinst, da würde ich mir überaus freuen.
Finde es auch super, dass du die Wartbarkeit so in den Fordergrund
stellst, weil das auf jeden Fall gegeben sein muss, so will ich das auch
von Anfang an umsetzen, egal, ob Basteleien oder ernste Projekte.
LG