Internet mit esp

  • Hallo,


    ich habe nun nach Anleitung von Kai, das Programm geändert.

    Die Uhrzeit wird nun richtig in das OLED-Display geschrieben und laufend angezeigt.

    Mit der Formatierung der Anzeige habe ich noch meine liebe Not, aber in der nächsten Lektion wird sich das wohl klären.


    Gruss an alle

    Brocki

  • Hallo Brocki,


    globale Variablen sollten möglichst vermieden werden. Es ist besser, Werte als Parameter zu übergeben.

    Besonders in Python haben globale Variablen ihre Tücken.


    In einem einfachen Beispiel funktioniert alles wie erwartet:

    Code
    1. globalVar = "global"
    2. def print_text(text):
    3. print(globalVar)
    4. print(text)
    5. print_text("Hallo")

    Das gibt

    global

    Hallo

    aus.


    Wenn ich aber schreibe

    Code
    1. globalVar = "global"
    2. def print_text(text):
    3. print(globalVar)
    4. globalVar = "geändert"
    5. print(text)
    6. print_text("Hallo")

    bekomme ich einen Fehler. Durch die Zuweisung globalVar = "geändert" wird innerhalb der ganzen Funktion print_text() die Variable als neue lokale Variable angelegt. print(globalVar) wird deshalb nicht mehr funktionieren.


    Es gibt aber eine funktionierende Lösung. Ich muss innerhalb von print_text() mit Hilfe von global deklarieren, dass ich die globale Variable verwenden möchte.

    Code
    1. globalVar = "global"
    2. def print_text(text):
    3. global globalVar
    4. print(globalVar)
    5. globalVar = "geändert"
    6. print(text)
    7. print_text("Hallo1")
    8. print_text("Hallo2")

    gibt

    global

    Hallo1

    geändert

    Hallo2

    aus.


    Also zusammengefasst:

    Wenn du innerhalb einer Funktion einen Wert einer globalen variablen zuweisen möchtest, dann muss du sie mit

    global variablenName

    als global deklarieren.


    Gruss

    René

  • Vielleicht machst du die Variable nicht global, sondern fügst an die Funktion zeige_zeit() die Befehlszeile return zeit an.

    Code
    1. def zeige_zeit():
    2. #print(time.localtime())
    3. #time.localtime:YYYY, MM, DD, HH, MM, SS, day of week (0=Mon), day of year
    4. zeit = time.localtime()
    5. sekunden = time.mktime(zeit) + 3600
    6. zeit = time.localtime(sekunden)
    7. print(zeit)
    8. return zeit


    Dann kannst Du den Befehl text_line(str(time.localtime()[3]),5,1)#Std in text_line(str(zeige_zeit()[3]),5,1)#Std ändern ;).


    Nur so als "quick hack" (schön ist anders). Wenn ich den Quelltext (auf die schnelle) richtig verstehe, ist die Funktion zeige_zeit() nur dazu da, um die Zeit auf der Konsole auszugeben aber nicht auf dem OLED Display.


    Gruß Kai

  • Hallo,


    Danke an René u. Kai.


    Wie mache ich nun eine Varialbe Global, damit sie überall sichtbar ist?.

    In C++ definiere ich das ja vor der setup Routine.

    Habe ich da was verschlafen?


    Gruss

    Brocki

  • Hallo Brocki,


    René hat es im Prinzip ja schon beantwortet. Ich möchte nur mehr darauf eingehen warum die Fehlermeldung "zeit ist nicht definiert" erscheint.


    Wenn Du in dem an diesen Post angehangenen Code nur die Zeile "text_line(str(time.localtime()[3]),5,1)#Std" in der Funktion anzeigen() geändert hast, muss die genannte Fehlermeldung zwangsläufig kommen, weil die Variable "zeit" nur in der Funktion zeige_zeit() definiert ist. Es ist keine globale Variable und deshalb in der Funktion anzeigen() nicht bekannt.


    Gruß Kai

  • Hallo Brocki,


    der Name des Befehls time.localtime() ist etwas irreführen. Es handelt sich dabei nicht um die Lokalzeit. Du musst also deine Zeitzone selbst korrigieren. Wie das geht, findest du in den Begleitunterlagen auf Seite 32.


    Wenn zeit als nicht definiert angezeigt wird, fehlt eine Zuweisung. Irgendwo vorher müsste stehen:


    zeit = time.localtime()


    Oder mit Korrektur der Zeitzone:

    Code
    1. sek = time.mktime(time.localtime()) # Anzahl Sekunden seit dem 1.1.2000
    2. zeit = time.localtime(sek + 3600) # Korrigiert die Zeit um 1 Stunde

    Gruss

    René

  • Hallo René,


    ich habe eine art Lösung erarbeitet. Allerdings hat sie einen Fehler, die Zeit wird falsch angezeigt (-1Std).

    Warum kann ich die Zeile :


    text_line(str(time.localtime()[3]),5,1)#Std


    nicht durch


    text_line(str(zeit[3]),5,1)#Std


    ersetzen ohne die Fehlermeldung " zeit ist nicht definiert" zu erhalten?


    Ich kann mir keinen Reim darauf machen.

    Gruss Brocki