Display - Balken - Spielerei - Demos

Hallo,

mein Zeichengenerator heißt Excel. :slight_smile:

Zeichengenerator.png

grins Jawollja :slight_smile:
Warum soll ich es mir einfach machen, wenn ich es auch umständlich kann? lach

Ja, das ist in der Tat auch eine Möglichkeit, mit Sicherheit! Ich hatte mir das lediglich so gedacht, dass ich beim Senden von Texten aus Delphi heraus direkt einen (vorher) definierten (Teil-) Zeichensatz mitschicke (die 64 Byte Buffer-Größe berücksichtigend).

Vor einiger Zeit hatte ich mir dazu eine Matix mit 8x8 LEDs gebaut, die ich direkt am Arduino gemultiplext angeschlossen hatte. Diese Bytefolgen habe ich dann ebenso in Delphi als "große Laufschrift" vorgegeben und die einzelnen Strings in den µC geschoben. Das ergab die witzigsten Effekte, auch bei Spielereien wie Scrolling von oben nach unten oder hin und her usw. So oder ähnlich werde ich das bei Gelegenheit wahrscheinlich dann auch wieder machen.

Es eilt und brennt ja nix
Rudi

Den Zeichensatz könnte man ruhig auf dem Controller lassen. Man müsste nur die Sonderzeichen irgendwie kodieren (ähnlich wie man manche Zeichen auch in C mit \ maskieren muss). Und dann beim Parsen das auswerten und das entsprechende Zeichen aus dem PROGMEM ins custom character RAM des LCD kopieren.

Hmmmm, das ist ebenso ein interessanter Gedankengang!
Den werde ich demnächst mal untersuchen.
Danke für den Tipp
Rudi

Hallo,

ich habe die Sonderzeichen im Code hinterlegt, im Flash. Bei Bedarf lade ich die ins Display per Funktionsaufruf.
Wenn dein Zeichengenerator fertig ist, kannste den ruhig, wenn du magst, zur Verfügung stellen.
Parallel bastel ich auch noch in Excel rum, um dann je nach Grafik gleich eine fertige Byte Zeile zu erhalten für Copy & Paste, je nachdem wie die Grafik aussieht.

Da gibt es übrigens auch Online Tools dazu:

https://omerk.github.io/lcdchargen/
http://www.quinapalus.com/hd44780udg.html

Hallo,

aha, hättest du mir mal eher sagen können. :slight_smile:
Jetzt habe ich meinen eigenen offline Excel Code Generator fertig. :slight_smile:
Durch Verkettung Copy & Paste fähig.

Danke dennoch für die netten Links.

Zeichengenerator.jpg

EA-DOGM_Zeichen-Code-Generator_2.zip (30 KB)

na dat is ja cool…

Durch die gelieferten Links spare ich mir viel Arbeit und Gehirnschmalz :slight_smile:

Supi!

Ich habe mich mal hingesetzt und einen Character-Generator geschrieben (in AutoIt).
Screenshot:

Im ZIP-Archiv (Anhang) befindet sich das ausführbare Programm. Wer jetzt Bedenken hat, weil ich ja noch nicht so lange hier im Forum aktiv bin (dafür habe ich volles Verständnis), für den poste ich hier auch den kompletten Quellcode:

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Description=Arduino Char-Generator
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=Oscar (www.autoit.de)
#AutoIt3Wrapper_Res_SaveSource=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>

Opt('GUIOnEventMode', 1)

Global $hGui = GUICreate('Arduino Char-Generator v1.0', 780, 460)
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
GUISetBkColor(0xDDDDDD)
GUISetIcon(@ScriptName, 3, $hGui)

Global $aidCharBits[160]
For $iCount = 0 To 3
 For $iRow = 0 To 7
 For $iCol = 0 To 4
 $aidCharBits[$iCount * 40 + $iRow * 5 + $iCol] = GUICtrlCreateCheckbox('0', 30 + $iCol * 32 + $iCount * 180, 30 + $iRow * 32, 32, 32, $BS_PUSHLIKE)
 GUICtrlSetOnEvent(-1, '_ChangeCheckbox')
 Next
 Next
Next

Global $aidSetBit[4][2]
For $iCount = 0 To 3
 $aidSetBit[$iCount][0] = GUICtrlCreateButton('0', 30 + $iCount * 180, 10, 48, 20)
 GUICtrlSetFont(-1, 14, 800, 0, 'Courier New')
 GUICtrlSetOnEvent(-1, '_SetBits')
 GUICtrlSetTip(-1, 'Clear all bits')
 $aidSetBit[$iCount][1] = GUICtrlCreateButton('1', 142 + $iCount * 180, 10, 48, 20)
 GUICtrlSetFont(-1, 14, 800, 0, 'Courier New')
 GUICtrlSetOnEvent(-1, '_SetBits')
 GUICtrlSetTip(-1, 'Set all bits')
Next
Global $aidBitRow[4], $aidC2CB[4]
For $iCount = 0 To 3
 GUICtrlCreateLabel($iCount + 1, 106 + $iCount * 180, 10, 10, 20, $SS_RIGHT)
 GUICtrlSetFont(-1, 14, 800, 0, 'Courier New')
 GUICtrlCreateLabel($iCount + 1, 14, 304 + $iCount * 40, 10, 25, $SS_RIGHT)
 GUICtrlSetFont(-1, 14, 800, 0, 'Courier New')
 $aidBitRow[$iCount] = GUICtrlCreateInput('{ B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000 };', 30, 300 + $iCount * 40, 700, 25, BitOR($ES_READONLY, $ES_CENTER))
 GUICtrlSetFont(-1, 12, 400, 0, 'Courier New')
 GUICtrlSetBkColor(-1, 0xFFFFCC)
 $aidC2CB[$iCount] = GUICtrlCreateButton('CB', 735, 300 + $iCount * 40, 36, 25)
 GUICtrlSetTip(-1, 'Copy to Clipboard')
 GUICtrlSetOnEvent(-1, '_CopyToClipboard')
Next

GUISetState()
WinWaitClose($hGui)
Exit

Func _CloseGui()
 GUIDelete($hGui)
EndFunc

Func _SetBits()
 Local $iCount = Int((@GUI_CtrlId - $aidSetBit[0][0]) / 2), $iState = Mod((@GUI_CtrlId - $aidSetBit[0][0]), 2)
 For $iRow = 0 To 7
 For $iCol = 0 To 4
 GUICtrlSetData($aidCharBits[$iCount * 40 + $iRow * 5 + $iCol], $iState)
 GUICtrlSetState($aidCharBits[$iCount * 40 + $iRow * 5 + $iCol], $iState = 1 ? $GUI_CHECKED : $GUI_UNCHECKED)
 Next
 Next
 _ReadBitRow($iCount)
EndFunc

Func _ChangeCheckbox()
 Local $idCheckbox = @GUI_CtrlId - $aidCharBits[0]
 Local $iState = BitAND(GUICtrlRead($aidCharBits[$idCheckbox]), $GUI_CHECKED)
 GUICtrlSetData($aidCharBits[$idCheckbox], $iState)
 Local $iCount = Int($idCheckbox / 40)
 _ReadBitRow($iCount)
EndFunc

Func _ReadBitRow($iCount)
 Local $sBitRow = '{ '
 For $iRow = 0 To 7
 $sBitRow &= 'B'
 For $iCol = 0 To 4
 $sBitRow &= BitAND(GUICtrlRead($aidCharBits[$iCount * 40 + $iRow * 5 + $iCol]), $GUI_CHECKED)
 Next
 $sBitRow &= ', '
 Next
 $sBitRow = StringTrimRight($sBitRow, 2) & ' };'
 GUICtrlSetData($aidBitRow[$iCount], $sBitRow)
EndFunc

Func _CopyToClipboard()
 Local $iCount = (@GUI_CtrlId - $aidC2CB[0]) / 4
 ClipPut(GUICtrlRead($aidBitRow[$iCount]))
EndFunc

Der Code ist in der Programmiersprache "AutoIt" geschrieben. AutoIt ist Freeware und gibt es unter folgender URL zum downloaden: AutoIt. Damit könnt ihr dann aus dem Quelltext eine eigene Exedatei erstellen.

Arduino_Char_Gen.zip (426 KB)

Ja aber Hallo,
wird hier auf dem Rücken von Doc_Arduino ein Wettbewerb veranstaltet, wer das sinnigste Programm oder die coolsten Links zu Zeichensatz-Generatoren liefert? Da will ich doch direkt mitmischen… :slight_smile:
Mein kleines Progrämmchen ist heute in Delphi entstanden und bietet ein paar Funktionen, die ich bisher in allen anderen Fassungen irgendwie vermisst hatte. Aber auch hier geht dann der Export via Clipboard, direkt in einem Rutsch mit allen relevanten Anweisungen und so.
FF … Fiel Fagnügen
Rudi

ArduinoCHR.zip (359 KB)

Hallo,

für solche schicken Zeichen zu Code Generatoren halte ich meinen Rücken gern hin. :slight_smile:
Alle beide sehr hübsch.

In der Zwischenzeit gibts auch noch eine Update von mir. Da ich doch heimlich Detail verliebt bin, wollte ich noch unbedingt speziell für Zelle 0 und 15 den Zeichensatz anpassen. Damit das perfekt aussieht von Anfang bis Ende.
Die “Abwärtsverzögerung” habe ich rausgenommen.
Die restliche minimale Verzögerung, innerhalb Zelle 0, “down”, bis vollständig auf 0 hängt mit der Eingangsmittelwertfilterung zusammen. Demnach technisch bedingt, muß so sein. :wink:

Flanken_1.jpg Flanken_2.jpg Flanken_3.jpg

Edit:
@ Rudi:
rotieren macht das gleiche wie verschieben?
Die Ausgabe kannste gleich noch verbessern, indem du den Code für das vorhalten im Flash änderst.
Vorschlag:

// Deklarationen
const byte Char0[8] PROGMEM =    // Zelle 0
  { B00100, B01110, B11111, B00100, B00100, B00100, B00100, B00000 };
const byte Char1[8] PROGMEM =    // Zelle 1
  { B00000, B00100, B00100, B00100, B00100, B11111, B01110, B00100 };


// void setup()
DOGM_Zeichensatz_laden();


// void loop()
lcd.write((byte)0);
lcd.write((byte)1);


// Funktionen
void DOGM_Zeichensatz_laden ()
{
  byte DOGM_Zeichen[8] = { };  // Dummyarray
  memcpy_P( DOGM_Zeichen, Char0, sizeof DOGM_Zeichen ); lcd.createChar(0, DOGM_Zeichen);
  memcpy_P( DOGM_Zeichen, Char1, sizeof DOGM_Zeichen ); lcd.createChar(1, DOGM_Zeichen);
}

@ slarttbartfast: mir gefällt an deinem Gen. die sachliche klare optische Nüchternheit. 1 setzen. :slight_smile:

EA_DOGM_Demo_PWM_Anzeige_v3.ino (16.4 KB)

Da ich doch heimlich Detail verliebt bin...

dat kommt mir irgendwie bekannt vor :wink:

Wie auch immer, durch deine (unsere) Erfolge mit den Displays strömen echt viele Ideen auf mich ein, was ich mit diesem und größeren Displays anstellen könnte... daher muss ich mal in mich gehen und mit "Bruder Innerlich" quatschen (und vom o.g. "Hasilein" 'ne Genehmigung einholen...) :slight_smile:

Gruß, Rudi

Hallo Rudi,

dann bin ich mal gespannt was du so für Ideen hast. Dank des internen Displayspeichers, kann man nämlich durch geschicktes umladen der eigenen Sonderzeichen die tollsten grafischen Dinge Pixel fein darstellen. Weil alle anderen Zellen die man gerade nicht beackert erhalten bleiben. Das nutze ich aus mit meinen 3 Zeichensätzen, die je nach Bedarf geladen werden.

Dann frag mal dein Hasilein ... :slight_smile:

Hallöle Doc_Arduino,

ach, Ideen hätte ich genügend unterm Hut. Ich muß nur 'n Kompromiss zwischen Kosten und Nutzen finden, denn "brauchen" brauche ich keinen Arduino und seine Geschwister. Is alles nur Grundlagenforschung. Aber das bekomme ich wohl noch auf die Reihe. "Hasilein" wird eben entsprechend "programmiert" und dann klappt dat auch :wink:

Das mit dem PROGMEM schaue ich mir am WE in Ruhe an, das ist ein guter Gedanke. Evtl. sogar individuell schaltbar. Beim Umschaufeln der Zeichensätze habe ich heute auch schon feststellen können, dass man (lt. GitHub) nach dem "Create" immer ein lcd.home() oder lcd.setCursor(x,y) senden muss. Dadurch kann ich in der Tat die schönsten Dinge aufs Display zaubern.

Ähm, und "Verschieben" != "Rotieren". "Verschieben" schiebt nur hinten oder anderswo raus und ist verloren. Bei "Rotieren" ist es so: Was du vorne rauswirfst hommt durch die Hintertür wieder rein... wie im wirklichen Leben, da rotiert man dann auch manchmal :wink:

Bis denne
Rudi

Hallo Rudi,

verschieben != rotieren … alles klar, hab’s geschnallt. :slight_smile:

lcd.home() oder lcd.setCursor(x,y). Du mußt nicht, du kannst, je nachdem was du nach dem umladen weiter machen möchtest. Der Cursor bleibt unverändert stehen wo du aufgehört hast bzw. springt normal weiter zur nächsten Zelle.

Hallo Doc_Arduino,

da ich am WE (leider) ein paar andere Dinge außerhalb der Arduino-Welt erledigen muß, habe ich das Update für den Zeichensatz-Editor vorgezogen. Mit der bekannten Liebe zum Detail - habe ich nicht nur deinen Vorschlag eingearbeitet, sondern noch ein paar andere nette Spielereien. Sogar ein internes Clipboard, um vom jeweiligen Zeichen schnell Kopien zum Ändern anlegen zu können :smiley: :smiley: :smiley:

Auch wenn ich hier mit Kanonen auf Spatzen schieße…
macht es echt Spaß, eigene Zeichen darzustellen!
Ich wünsche noch 'n schönes Weekend
Rudi

ArduinoCHR101.zip (363 KB)

Hallo,

sehr schön. Die neue Displayfarbe gefällt mir auch. :slight_smile:
Danke für die Namenserwähnung. Wäre nicht nötig gewesen. Bekommst dein erstes Karma von mir.

Hey Wow! Danke Danke :slight_smile:

Doch doch, deine Erwähnung war nötig und ist nicht mehr wie Recht - habe ich doch erst durch deine eigenen Erfolgserlebnisse eine Spielwiese für mich entdeckt, die ich vorher gar nicht wirklich im Auge hatte.

Oki doki, dann bis zum nächsten Experiment, oder so.
Gruß, Rudi

@Doc_Arduino
Wie hast Du das Display angeschlossen? Bei mir tut sich nichts. Habe das DOGM162L-A.

Habe die Pins so dran:
RS --> 4
CSB --> 10
SI --> 11
CLK --> 13

Alle anderen Pins nach dem Schaltbild von hier (5V SPI). Lib und Test Sketch von hier.

Hallo,

naja, du kannst jetzt nicht das Display wie du lustig bist an irgendwelche Pins klemmen und dann irgendeinen (meinen) Code nehmen und hoffen das es 1:1 klappt. Weder in meinem Sketch noch mit der EA Lib werden solche Pinnummer defaultmäßig eingestellt. Ich nutzte außerdem Hardware SPI. Kein Software SPI. Steht im Kommentar. Das heißt die Pinkonfig kann so nicht funktionieren. Dann wäre ja noch die Frage, welchen Arduino hast du überhaupt?

Mit der EA Lib sollte mein Code auch funktionieren. Aber! Die nutzen andere Befehle/Funktionsnamen. Du müßtest den kompletten Sketch überarbeiten.

Was hast du geändert bis jetzt?

Reset. Fangen wir mal klein an. Hast du die Libs auf deinem Rechner?
DogLcd bekommste hier: GitHub - wayoda/DogLcd: An Arduino library for Dog character LCD's
Bekommste damit die beiden Bsp. zum laufen?
Bevor das nicht funktioniert brauchen wir nicht weiter machen.

Bounce2 gibts hier: https://github.com/thomasfredericks/Bounce2/archive/master.zip
GitHub - thomasfredericks/Bounce2: Debouncing library for Arduino and Wiring

Jetzt klemmste das Display erstmal so an wie in dem Bsp. Sketch beschrieben. Wenn das läuft, kannste meinetwegen die Pins ändern. Das ist dann alles Software SPI. Spielt aber keine Rolle.

Und dann müßtest du nur die gesamte funktionierende LCD Konfig in meinen Code übernehmen/ersetzen. Dann sollte es laufen. Weitere Pinkonfig beachten. Taster usw. Da mußte alles bis ins setup durchgehen, überprüfen und ggf. abändern.

DogLcdSPI lcd(22, 24);

Pin 22 ist bei mir RS und 24 CSB. Der Rest liegt bei mir wie gesagt auf der Hardware SPI Schnittstelle.
Dann mußte noch die Zeile ändern wie im Bsp. Code. Von 163 auf 162.

lcd.begin(DOG_LCD_M163);

Und die 3. Zeile mußte im Code komplett rausnehmen. Sind Debugausgaben die ich noch dringelassen habe, damit man sieht, hoffentlich, was der Code so einigermaßen macht.