Beiträge von lernkick

    Wir leben bereits im Zeitalter der "Vierten industriellen Revolution", die unter anderem mit Industrie 4.0, Arbeit 4.0 und dem IoT, dem Internet der Dinge (und Dienste) umschrieben wird. Bei dem IoT wissen die Dinge, wer und was sie sind, nämlich Objekte, die wissen, wer und was sie sind, was sie können. Demzufolge verfügen Objekte über Eigenschaften, die man Attribute nennt, und über Methoden, die beschreiben, wie sich bestimmte Dinge bewerkstelligen lassen. Dabei handelt es sich programmiertechnisch bei den Methoden um Funktionen einer Klasse. Und bei einem Objekt handelt es sich programmiertechnisch um das Instanziieren einer Klasse, die dadurch zu einer Instanz wird. Demzufolge handelt es sich bei einem Objekt um eine Instanz einer zugeordneten Klasse.


    Beim Objekt orientierten Programmieren (OOP) lassen sich aber nicht nur statische Objekte programmieren, die sich unendlich oft und lange in einem Programm aufrufen, starten und ausführen lassen, sozusagen bis zum nächsten Stromausfall, sondern auch dynamische Objekte mit einem Verfallsdatum. Wenn es sein muss, auch mit einem kalendarischen oder zeitlich begrenzten Verfallsdatum im Sinne eines Zeitfensters.


    Dynamische Objekte und deren Eigenschaften (= Attribute) sind also vergänglich und lassen sich so programmieren, dass sie das Zeitliche segnen, wenn sie ihren Zweck erfüllt haben. Im Python-Programm gibt es das dynamische Objekt im Programmkode zwar noch, bei der Programmausführung aber nicht mehr, falls es im Programm nach der Zweckerfüllung mittels des Statements "del" (= engl. delete, d.h. löschen) zwischenzeitlich bereits gelöscht wurde.


    Programmiertechnisch ist dabei besonders interessant, wie man aus einer Variablen nebst Variableninhalt einer Klasse oder einer Methode ein entsprechendes Attribut eines Objektes generiert bzw. instanziiert. Nämlich mittels eines speziellen Konstrukts, Konstruktors bei dem eine (Klassen-) Variable einer (Objekt-) Variablen im Sinne eines (Objekt-) Attributs zugeordnet wird. Anschaulich, bildlich könnte man auch von einer Metamorphose, d.h. der Umwandlung einer einfachen (Klassen-) Variablen in ein Attribut eines Objektes, sprechen. Programmiertechnisch nennt man das, wie gesagt, Instanziierung z.B. mittels eines speziellen Konstruktors.


    Attribute (= Eigenschaften eines Objekts) können also etwas bewerkstelligen, weil sie sich aus Methoden einer Klasse ableiten bzw. sich auf diese gründen.


    Wer sich früher oder später für das OOP interessiert, kann sich mit meinem Tutorial in das Thema und das OOP einarbeiten:


    http://electronics.bplaced.net…3/index.html#Seitenanfang


    http://electronics.bplaced.net…/index.html#Verfallsdatum


    Viel Spaß beim Ausprobieren und Programmieren


    wünscht


    Dieter alias lernkick

    Hallo Bernhard,


    wenn man Text in die Textchat-Zeile z.B. von WhatsApp, Skype oder in eine Online-Textverarbeitung wie z.B. Google Docs von Google Drive usw. eingibt und möchte dabei dann einen Zeilenumbruch veranlassen, um in der zweiten Textzeile weiteren Text einzugeben, dann muss man nur die Tastenfolge <Shift> (= Umschalttaste auf Großschreibung) plus <Return-/Entertaste> betätigen.


    Habe das soeben mit "Thonny" ausprobiert; es funktioniert!


    Viele Grüße


    Dieter

    Hallo zusammen,


    bei dem kleinen Python Programm


    micropython_teil_02_42.jpg


    frage ich mich allen Ernstes, wo die Variablen abgespeichert werden: in der Klasse oder in der Funktion?


    Auch wenn die beiden Variablen den gleichen Namen 'self.textStrVar_1' tragen, so handelt es sich trotzdem um zwei verschiedene Variablen! Während die eine in der Funktion_1 initialisiert wird, wird die andere gleichen Namens in der Funktion _2 deklariert, da sie den Variableninhalt erst nach dem Programmstart zugewiesen bekommt.


    Verständlicher wird das Ganze mit dem nächsten Programm


    micropython_teil_02_43.jpg


    Weitere Infos zum "self"-Sachverhalt finden sich im Tutorial von mir (siehe Abschnitt "Datentransfer mittels 'self'-Statement von Klasse 1 zu Klasse 2").


    Ich habe den Verdacht, dass es sich nur um eine Verlinkung mittels "self"-Statement von der Funktion 1 zur Klasse 1 (= Sender) und von der Klasse 2 zur Funktion 2 (= Empfänger) handelt.


    Bei der Funktion 1 hat die vorangestellte Stringvariable "self" den Stringinhalt "Klasse_1" und bei der Funktion 2 den Stringinhalt "Klasse_2". Das ist dann auch der Beweis dafür, dass es sich bei den beiden namensgleichen Variablen "self.textStrVar_1" um zwei verschiedene Variablen handelt!


    Das Statement "self.textStrVar_1" ist nichts anderes als das Statement "Klasse_1.textStrVar_1". Mit dem "print()"-Statement lässt sich das auch ausprobieren/anzeigen.


    Viele Grüße


    Dieter

    Hallo Hardy,


    dein Vorschlag ist wirklich interessant, aber würde dann sicherlich auf einer WLAN-Verbindung der ESP-Rechner untereinander und im selben WLAN voraussetzen. Ansonsten müsste man die Verbindung der ESP-Rechner untereinander im lokalen Netzwerk (LAN) realisieren. Dabei müssten dann die drei ESP-Rechner im LAN über USB-Kabel als LAN-Client ins Netz gehen.


    WLAN wäre dann wohl die komfortablere Lösung. Aber wenn ich das richtige sehe, bräuchte man für die WLAN-Clients mit den ESPs noch einen WLAN Hotspot im Sinne eines WLAN-Access-Points.


    Diesbezüglich nehme ich an, dass das Thema mit dem WLAN früher oder eher später auf einem YouTube-Video vom Hobbyelektroniker René behandelt wird.


    Gruß


    Dieter

    Hallo zusammen,


    das Umrahmen einer Textstring-Anzeige im OLED-Display (siehe oled_demo.py) hat mich wie folgt inspiriert:


    ... Als nächstes geht es darum, dass wir die fünfzeilige OLED-Anzeige noch attraktiver gestalten, indem wir einen optisch ansprechenden Effekt einbauen, z.B. so wie wir es von den noch mechanischen Anzeigetafeln bei den Ankünften oder Abflügen vom Flughafen her kennen. Mich hat dabei immer fasziniert, wenn neue Flugankünfte angekündigt wurden und dabei alle Anzeigefelder und -zeilen der ganzen Tafel auf einmal durchgeblättert wurden und das mechanische Geräusch beim Umblättern der einzelnen Buchstabenblätter nicht zu überhören war. Man nennt diese inzwischen veralteten, aber an Flughäfen noch immer zu sehenden Anzeigetafeln übrigens „Faltblattanzeige“.

    Ähnlich einer solchen Faltblattanzeige programmieren wir die Textstring-Umrandung unseres OLED-Displays, indem wir zum Schluss der Textanzeige den einzelnen Rahmen ein- bis zweimal komplett von oben nach unten „durchrattern“ lassen, um dann am Ende auf einer Textzeile stehen zu bleiben, die uns besonders wichtig ist und die wir deswegen besonders hervorheben wollen (siehe Video).

    [ Hier ] geht es weiter zum betreffenden Tutorial ... und [ hier ] folgt der Quellkode.

    Viel Spaß beim Ausprobieren wünscht


    Dieter

    Hallo zusammen,


    unter einer statischen Stringanzeige im OLED-Display verstehe ich das Anzeigen von Stringtexten, die als konstanter Text in Form eines statischen Strings, wie im kleinen Beispielprogramm oled_demo.py gezeigt, programmiert werden:


    # Einfache Demo mit OLED - Display

    ...

    ...

    # Das Hauptprogramm

    oled.fill(0)

    text_line("Hallo! Ich bin",0,1)

    text_line("ein ESP32,",1,3)

    text_line("programmiert in",2,0)

    text_line("Micropython",4,2)

    oled.rect(0,38,128,20,1)

    oled.show()


    Auf Dauer, d.h. beim weiteren Programmieren von kleinen Micropython-Programmen, möchte ich aber nicht jedes Mal kleine konstante Textstrings statisch programmieren, sondern diese vielmehr dynamisch, d.h. flexibel handhaben können, indem ich z.B. die anzuzeigenden Textstrings in einer Tabelle anlege und diese dann in einer "while"- oder "for"-Schleife abarbeite, d.h. im OLED-Display zur Anzeige bringe. Nachfolgend ein kleines Sahnehäubchen als Beispiel.


    Dabei schwebt mir vor, dass ich einen längeren, bis zu 16 Buchenstaben/Textzeile * 5 Textzeilen = 80 langen Textstring plus Leerzeichen zwischen den Worten als Ganzes in einer Textvariablen abspeichere, diese dann anhand der Leerzeichen als Feldtrennzeichen in mehrere Teilstrings aufspalte und in einer Tabelle abspeichere.


    Dabei soll eine kleine Optimierungs-Funktion dafür sorgen, dass die pro Zeile zur Verfügung stehenden 16 Buchen/Ziffern pro Zeile möglichst ausgenützt werden. Konkret bedeutet das, dass wenn zwei oder drei kurze Worte in eine Textzeile à 16 Buchstaben passen, dann sollen die einzeln in Felder abgespeicherten Worte wieder zu einem zusammenhängenden Textstring der max. Länge von 16 Buchstaben zusammen gesetzt werden.


    Da es für die Textstringanzeige bis auf Weiteres keine implementierte Silbentrennung ähnlich wie bei einer Textverarbeitung gibt, scheint mir die Optimierungs-Funktion ersatzweise ganz gut zu sein. Dabei scheint mir das Zusammensetzen mehrerer kurzer Worte zu einem Textstring der max. Länge von 16 Buchstaben natürlich eine kleine programmiertechnische Herausforderung zu sein, da man aus einer etwas umfangreichen "Einzel-Wort-Tabelle" eine neue Tabelle, die teils zwei bis drei kurze Worte pro Textstring bzw. Tabellenfeld enthält, halbwegs intelligent programmieren muss.


    Wer sich für die smarte Textstring-Anzeige im OLED-Display des kleinen ESP32 interessiert, kann sich hier im Tutorial eingehender informieren und den weiteren Programmierfortschritt im Laufe der nächsten Woche(n) mitverfolgen.


    Weiterhin viel Spaß beim (Micro-) Python-Programmieren wünscht


    Dieter


    P.S.

    Das IoE - Internet of Electronics (ähnlich dem IoT) findet sich hier:

    http://electronics.bplaced.net/

    Das kleine Einsteiger-Programm "hallo.py" hat es faustdick hinter den Ohren und lässt sich auf die Schnelle nicht tiefgründig verstehen, funktional hingegen schon.


    Der Grund dafür ist der, dass es im Programm die Funktion "sage_hallo(name)" gibt, die im Funktionskopf einen Namen einliest und mittels "print()"-Befehl in der Thonny-Shell anzeigt.


    Diesbezüglich muss der Einsteiger wissen, dass eine Funktion für sich alleine noch nichts bewirkt, sondern erst dann, wenn man diese z.B. vom Hauptprogramm aus aufruft. Und zwar mit dem Statement "sage_hallo(name)".


    Das Statement mit dem Funktionsaufruf befindet sich aber ausgerechnet in einer "for"-Schleife, die nur abgearbeitet wird, wenn die Bedingung "name in namen" erfüllt wird, d.h. zutreffend ist. Und bei bei "namen" handelt es sich um eine (Vornamens-) Liste vom Typ "tuple", die sich nicht erweitern lässt. Dazu muss der Einsteiger wissen, dass alle Vornamen in Form von Datenfeldern im Verborgenen indexiert (nicht indiziert!) sind und der Index stets bei Null beginnt.


    Demzufolge liefert das Statement print("Viele Grüße " + namen[2]) aus der Namensliste den Vornamen "Monika" zurück, weil dieser dem Index = 2 in der Namensliste entspricht. Aber genau das weiß der Einsteiger nicht, sodass er weder die "for"-Schleife, noch die Funktion "sage_hallo()" wirklich versteht!


    Das Problem dabei ist nun, dass der Einsteiger ein massives Verständnisproblem hat, zu dem er aber nichts kann! Er kommt sich etwas blöd vor, obwohl er nur etwas dumm, d.h. unwissend(!) ist und sich nicht traut, jemanden im Forum zu fragen, wie das Programm wirklich zu verstehen ist.


    Eine verständnisvollere Programmversion ohne "dubiose" Funktion wäre z.B.


    Kurz und gut, das kleine "Hallo"-Programm hat mich nicht nur intellektuell provoziert, sondern auch motiviert, diesem systematisch auf den Grund zu gehen.

    [ Hier ] das vorläufige Ergebnis meiner umfangreichen Bemühungen.


    Viel Spaß und Erfolgt wünscht


    Dieter