Zeile code Zeitverzögert ausführen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
KeozFPV
User
Beiträge: 12
Registriert: Montag 12. Juli 2021, 19:18

Hallo, ich versuche eine Zeile code zeitverzögert auszuführen. Ich möchte aber nicht wie mit time.sleep (2) einfach den ganzen code stoppen, sonder wirklich nur eine Zeiler code 2 Sekunden Verzögert ausführen, wärend der Rest einfach normal weiter Läuft.
Meine aktueller code ist:

Code: Alles auswählen

import rp2
import network
import ubinascii
import machine
import urequests as requests
import time
from secrets import secrets
import socket



rp2.country('DE')

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

# wlan.config(pm = 0xa11140)

# See the MAC address in the wireless chip OTP
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('mac = ' + mac)

# Other things to query
# print(wlan.config('channel'))
# print(wlan.config('essid'))
# print(wlan.config('txpower'))

# Load login data from different file for safety reasons
ssid = secrets['ssid']
pw = secrets['pw']

wlan.connect(ssid, pw)

# Wait for connection with 10 second timeout
timeout = 10
while timeout > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    timeout -= 1
    print('Waiting for connection...')
    time.sleep(1)

# Define blinking function for onboard LED to indicate error codes    
def blink_onboard_led(num_blinks):
    led = machine.Pin(17, machine.Pin.OUT)
    for i in range(num_blinks):
        led.on()
        time.sleep(.2)
        led.off()
        time.sleep(.2)
    
# Handle connection error
# Error meanings
# 0  Link Down
# 1  Link Join
# 2  Link NoIp
# 3  Link Up
# -1 Link Fail
# -2 Link NoNet
# -3 Link BadAuth

wlan_status = wlan.status()
blink_onboard_led(wlan_status)

if wlan_status != 3:
    raise RuntimeError('Wi-Fi connection failed')
else:
    print('Connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])
    
# Function to load in html page    
def get_html(html_name):
    with open(html_name, 'r') as file:
        html = file.read()
        
    return html

# HTTP server with socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('Listening on', addr)
led = machine.Pin(17, machine.Pin.OUT)

# Listen for connections
while True:
    
    try:
        cl, addr = s.accept()
        print('Client connected from', addr)
        r = cl.recv(1024)
        # print(r)
        
        r = str(r)
        led_on = r.find('?led=on')
        led_off = r.find('?led=off')
        print('led_on = ', led_on)
        print('led_off = ', led_off)
        if led_on == 10:
            print('LED ON')
            led.value(1)
            time.sleep (2)
            led.value(0)
            print('LED OFF')
            
          
            
            
            
        response = get_html('index.html')
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send(response)
        cl.close()
        
    except OSError as e:
        cl.close()
        print('Connection closed')
    

Aber eigendlich Spielt ja der ganze code ja keine Rolle. Es gibt auch noch eine "html" Datei und eine mit dem Wlan Passwort und dem Namen.
Es geht aber nur um:
[code] if led_on == 10:
            print('LED ON')
            led.value(1)
            time.sleep (2)
            led.value(0)
            print('LED OFF')
Also ich möchte nur den sleep befehl ersetzen, und das Nachfolgende 2 Sekunden zeitverzögert ausführen.

Das proplem ist nähmlich das ich hier Netzwerkcode habe und wenn der Microcontroler plötzlich pausiert, bearbeitet er auch keine eingehenden Befehle mehr, und die Verbindung zur website bricht ab.
Welche libary/funktion kann ich in dem fall am besten benutzen?
Schonmal danke im voraus.
Gruß Jakob.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn das micropython ist, dann hilft ggf das asyncio-Modul. https://github.com/peterhinch/micropyth ... UTORIAL.md
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@KeozFPV: Du verwendest socket.recv(bufsize) falsch. Mit bufsize gibt man an, wieviele bytes maximal empfangen werden sollen. Es können aber auch weniger ankommen, im schlimmsten Fall nur ein einziges byte. Deswegen muss man in einer Schleife solange abfragen, bis alle Daten empfangen wurden.
In specifications, Murphy's Law supersedes Ohm's.
KeozFPV
User
Beiträge: 12
Registriert: Montag 12. Juli 2021, 19:18

__deets__ hat geschrieben: Freitag 22. Juli 2022, 18:34 Wenn das micropython ist, dann hilft ggf das asyncio-Modul. https://github.com/peterhinch/micropyth ... UTORIAL.md
Ui, ja das wird die Lösung sein :D Das sieht sehr kompliziert aus. Aber ich werde mich mal dransetzen. Vielen Dank!
Antworten