Beiträge von Der Hobbyelektroniker

    Textdaten bestehen aus Zeilen mit verschiedenen Längen. Darum ist es nicht möglich, direkt auf eine bestimmte Zeilennummer zu springen oder festzustellen, wieviele Zeile es hat, ohne dass man vorher den Text einliest und schaut, wieviel Zeilenumbrüche man hat. Selbstverständlich kannst du eine Funktion schreiben, die die Zeilenanzahl herausgibt oder eine bestimmte Zeile einliest. Das ändert aber nichts daran, dass du die Datei bis zur gewünschten Zeile einlesen musst. Im Fall der Ermittlung der Anzahl Zeilen muss immer die ganze Datei eingelesen werden. Dabei wird die Anzahl der Zeilenumbrüche in der Datei gezählt. Das ist in allen Programmiersprachen so, nicht nur bei Python. Ofz wird das im Hintergrung gemacht und du merkst gar nichts davon.


    Ein Betriebssystem bietet normalerweise die Möglichkeit die Grösse einer Datei zu ermitteln, ohne das sie geöffnet wird. Das sagt aber nichts über die Anzahl Zeilen aus. Selbst die Anzahl Zeichen lässt sich nicht zuverlässig daraus ableiten. So ist zum Beispiel bei UTF-8 nicht mehr jedes Zeichen 1 Byte gross.


    Python kann sehr gut mit solchen Daten umgehen. Vorausgesetz, du hast genügend RAM. Es wird alles ins RAM geladen und dort verarbeitet.

    Hallo BL007,


    es gibt es die Methode readline() in der File - Klasse.

    Ich bin aber nicht sicher, ob das File wirklich zeilenweise eingelesen wird oder nur der Text zeilenweise aus dem internen Buffer zurückgegeben wird.


    Code
    1. with open('text.txt','r') as file:
    2. line=file.readline()
    3. while line:
    4. print(line)
    5. line=file.readline()

    Es gibt auch diese Möglichkeit:

    Code
    1. with open('text.txt','r') as file:
    2. for line in file:
    3. print(line)

    Auch hier gelten die gleichen Unsicherheiten wie bei der ersten Methode.


    Gruss

    René

    Hallo Nicole,


    nur der Vollständigkeit halber. Der Code ist nur ein Beispiel, das hilft die Sache zu erklären. Zu kleine Codeschnipsel sagen oft nicht viel aus. Bei Erklärungen ist es aber immer wichtig, dass alle wesentlichen Elemente vorhanden sind. Die einfachste Art eine Variable einzuführen ist die Deklaration mit Wertzuweisung. In einem realen Programm kommt die Selektionsvariable normalerweise irgendwo aus den Tiefen des Programms.


    Gruss

    René

    Hallo Nicole,


    case ist ein etwas spezielles Konstrukt, das immer wieder zu Fehlern Anlass gibt. Da du keinen vollständigen Code gepostet hast, kann ich nicht sagen, ob du in die Falle getappt bist.


    Ein Beispiel:

    Code
    1. int zustand = 1;
    2. switch (zustand) {
    3.     case 1: eins();
    4.     case 2: zwei();
    5. }

    Das Resultat wird hier vielleicht nicht den Erwartungen entsprechen. Es wird nämlich eins() und zwei() ausgeführt, obwohl offensichtlich nur die erste case - Bedingung erfüllt ist. Das liegt daran, dass die Befehle, die nach dem übereinstimmenden case ausgeführt werden, nicht beim ; oder dem nächsten case stoppen. Es werden einfach alle nachkommenden Befehle ausgeführt.


    Um die Befehlsausführung zu stoppen, brauchst du noch das Schlüsselwort break. Bei diesem stoppt dann die Ausführung und der switch .. case - Block wird verlassen.


    Code
    1. int zustand = 1;
    2. switch (zustand) {
    3. case 1: eins();
    4.             break;
    5. case 2: zwei();
    6.             break;
    7. }

    Das zweite break könnte auch weggelassen werden, da der Befehl dann sowieso beendet ist.


    Gruss

    René

    Hallo Frank,


    auch bei mir ist keine Meldung gekommen. Keine Ahnung, ob Youtube eine Störung hatte oder ob irgend ein neuer 'genialer' Spamfilter etwas zu übereifrig ist. Ich hoffe, dass es das nächste Mal wieder funktioniert.


    Gruss

    René

    Hallo Ebby,


    ich vermute stark, dass das Display noch nie etwas angezeigt hat. Gemäss Fehlermeldung konnte der ESP32 keine Verbindung zum Display herstellen.

    Leider gibt es zwei Varianten des Heltec-Boards. Gleichzeitig wurde damals auch eine neue Thonny - Version veröffentlicht. Schau dir dazu die Lektionen 9 und 10 an. Sie zeigen die neue Thonny-Version und zeigen ebenfalls eine Methode zur Displayansteuerung, die mit beiden Boardvarianten funktioniert.


    Gruss

    René

    Hallo Rayko,


    der Funktion Wheel() muss ein Byte übergeben werden, das heisst, dass der Maximalwert 255 sein darf. Der Wert entsteht aus der Addition von zwei 16bit Werten. Da kann das Ergebnis grösser als 255 sein.

    Der & - Operator ist ein bitweises AND. Wenn (i + j) & 255 berechnet wird, werden nur die untersten 8 Bit verwendet. Alle höherwertigen Bits werden abgeschnitten.


    Beispiel:

    Code
    1. (i + j) 257 100000001
    2. AND 255 011111111
    3. gibt 1 000000001


    Dieser Wert kann als Byte weitergegeben werden. Eigentlich wird hier eine Modulo - Funktion ausgeführt (Modulo 256).

    Man hätte auch (i + j) % 256 schreiben können.


    Gruss

    René

    Python bietet gute Unterstützung zur Programmierung von Hintergrundoperationen. Leider ist das in Micropython nicht so. Es gibt dafür nur das Modul _thread und dieses ist auf verschiedenen Plattformen unterschiedlich implementiert. Trotzdem kann man damit bereits viel anfangen. _thread ist in Standardpython ein veraltetes Modul. Einige der dort beschriebenen Funktionen sind auch in Micropython für ESP32 implementiert. Die Dokumentation hält sich aber vornehm zurück: https://docs.micropython.org/en/latest/library/_thread.html


    Ich werde es ohne detaillierte Erklärungen in einem der Videos im September verwenden. Genauere Erklärungen wird es aber erst im Kurs 'Micropython Grundlagen' geben. Dort wird es aber noch eine Weile dauern, bis wir so weit sind.


    Gruss

    René

    Hallo Daniel


    Da Python keine fest deklarierte Datentype kennt, wirst du so ähnlich lautende Fehler immer wieder antreffen. Immer wenn etwas von 'NoneType' steht, hat die Erzeugung einer Variablen oder eines Objekts nicht geklappt. Manchmal ist es recht mühsam herauszufinden, wo das Problem entsteht.


    Gruss

    René

    Hallo Beduino,


    je grösser die Pause ist, um so mehr ruckelt der Servo. Wenn du kleinere Pausenwerte möchtest, musst du die Schritte verkleinern. Mit .write() arbeitest du immer mit Grad im Bereich 0 bis 180. Du kannst aber auch .writeMicroseconds() verwenden. Hier arbeitest du in einem Bereich von etwa 500 bis etwa 2500. Dadurch hast du 1500 Schritte anstelle von 180.


    Das muss ich aber selbst noch ausarbeiten, darum wird es noch eine Weile dauern.


    Gruss

    René

    Hallo Frank,


    das mit dem FTDI - Adapter ist eine saubere Lösung. Ich würde ihr den Vorzug geben. WebREPL wäre sicher bequem. Wenn ich aber sehe, dass gelegentlich schon Probleme über USB entstehen, zweifle ich etwas an der Zuverlässigkeit.


    Gruss

    René

    Hallo Frank,


    leider weiss ich das auch nicht. Mein Board ist noch eine alte Version und da gab es F1 noch gar nicht.

    Es könnte aber gut sein, dass deine Vermutung richtig ist. Du kannst diese Vermutung mit 3 Messungen erhärten:


    - Widerstand zwischen den beiden Enden muss 0 Ohm sein

    - Von F1 zum 5V - Anschluss des USBs müssen es ebenfalls 0 Ohm sein

    - Im laufenden Betrieb muss die Spannungsdifferenz zwischen den beiden Enden 0 V betragen.


    Falls das der Fall ist, kannst du eine Entfernung wagen.


    Gruss

    René

    Hallo Frank,


    grundsätzlich sollte jedes Board mit mindestens 4 MB PSRAM funktionieren. Das original LoLin - Board scheint leider in Deutschland kaum erhältlich zu sein.


    Der Beschreibung nach sollten diese Boards auch funktionieren:


    https://www.makershop.de/plattformen/arduino/ttgo-t8-esp32


    https://www.amazon.de/ILS-ESP32-WROVER-WiFi-Modul-Bluetooth-Development


    https://www.amazon.de/ILS-ESP32-PSRAM-ANTENNE-buletooth


    https://www.amazon.de/MAyouth-T-Energie-Esp32-Wrover-B-Bluetooth-Modul-Development


    Gruss

    René