Seite 1 von 1

Zeile code Zeitverzögert ausführen

Verfasst: Freitag 22. Juli 2022, 16:35
von KeozFPV
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.

Re: Zeile code Zeitverzögert ausführen

Verfasst: Freitag 22. Juli 2022, 18:34
von __deets__
Wenn das micropython ist, dann hilft ggf das asyncio-Modul. https://github.com/peterhinch/micropyth ... UTORIAL.md

Re: Zeile code Zeitverzögert ausführen

Verfasst: Freitag 22. Juli 2022, 19:10
von pillmuncher
@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.

Re: Zeile code Zeitverzögert ausführen

Verfasst: Freitag 22. Juli 2022, 19:39
von KeozFPV
__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!