Почему мой код python не останавливается при использовании потоковой передачи

#python #multithreading #server #sensors

Вопрос:

Это моя попытка остановить код в «if Request = =» выкл.»: «Я использую программу mit appinventer для включения и выключения кода через сервер. Я хочу, чтобы он останавливал датчик, двигатель и линейные приводы, когда я нажимаю на приложение. Он может включиться, но не выключится. Датчик измерит расстояние и запустит двигатель. Теперь, если объект находится слишком близко, линейные приводы будут выдвигаться, а также останавливаться на определенном расстоянии.

 from http.server import BaseHTTPRequestHandler, HTTPServer

import time
import board
import busio
import adafruit_vl6180x

from threading import Thread

i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_vl6180x.VL6180X(i2c)

import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

GPIO.setup(9,GPIO.OUT)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(10,GPIO.OUT)
pwmA = GPIO.PWM(10,100)
pwmA.start(0)

GPIO.setup(27,GPIO.OUT)
GPIO.setup(22,GPIO.OUT)
GPIO.setup(17,GPIO.OUT)
pwmB = GPIO.PWM(17,100)
pwmB.start(0)

GPIO.setup(14,GPIO.OUT)
GPIO.setup(15,GPIO.OUT)
GPIO.setup(18,GPIO.OUT)
pwmC = GPIO.PWM(14,100)
pwmC.start(0)

GPIO.setup(8,GPIO.OUT)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(1,GPIO.OUT)
pwmD = GPIO.PWM(8,100)
pwmD.start(0)

Request = None
text = None

class RequestHandler_httpd(BaseHTTPRequestHandler):
  def do_GET(self):
    global Request, text
    messagetosend = bytes('Running',"utf")
    self.send_response(200)
    self.send_header('Content-Type', 'text/plain')
    self.send_header('Content-Length', len(messagetosend))
    self.end_headers()
    self.wfile.write(messagetosend)
    Request = self.requestline
    Request = Request[5 : int(len(Request)-9)]
    print(Request) 
    
    if Request == 'on':# Motors
        def right(x=100, t=0):
            GPIO.output(9,True)
            GPIO.output(11,False)
            GPIO.output(27,True)
            GPIO.output(22,False)
            pwmA.ChangeDutyCycle(x)
            pwmB.ChangeDutyCycle(x)
            time.sleep(t)

        def left(x=100,t=0):
            GPIO.output(9,False)
            GPIO.output(11,True)
            GPIO.output(27,False)
            GPIO.output(22,True)
            pwmA.ChangeDutyCycle(x)
            pwmB.ChangeDutyCycle(x)
            time.sleep(t)
            
        # Linear Actuators
        def inl(x=100,t=0):
            GPIO.output(7,True)
            GPIO.output(1,False)
            GPIO.output(15,True)
            GPIO.output(18,False)
            pwmC.ChangeDutyCycle(x)
            pwmD.ChangeDutyCycle(x)
            time.sleep(t)
            
        def out(x=100,t=0):
            GPIO.output(7,False)
            GPIO.output(1,True)
            GPIO.output(15,False)
            GPIO.output(18,True)
            pwmC.ChangeDutyCycle(x)
            pwmD.ChangeDutyCycle(x)
            time.sleep(t)
            
        def stop(t=0):
            pwmA.ChangeDutyCycle(0)
            pwmB.ChangeDutyCycle(0)
            time.sleep(t)
            
                
        def run1():
            while True:
                range_mm = sensor.range
                print("Range: {0}mm".format(range_mm))
            
                if range_mm == 255: #and range_mm == 25.4:    
                    inl(0)
                    out(0)
                
                elif range_mm < 25:
                    out(100)
                
                elif range_mm > 25 and range_mm < 254:
                    inl(100)

        def run2():
            while True:
                range_mm = sensor.range
                print("Range: {0}mm".format(range_mm))
            
                if range_mm == 255:
                    right(0)
                    left(0)
                elif range_mm < 100: 
                    right(100, 5)
                    left(100, 5)
                    
        if __name__ == '__main__':
            Thread(target = run1).start()
            Thread(target = run2).start()

            
    if Request == 'off':
        def right(x=0, t=0):
            GPIO.output(9,True)
            GPIO.output(11,False)
            GPIO.output(27,True)
            GPIO.output(22,False)
            pwmA.ChangeDutyCycle(x)
            pwmB.ChangeDutyCycle(x)
            time.sleep(t)

        def left(x=0,t=0):
            GPIO.output(9,False)
            GPIO.output(11,True)
            GPIO.output(27,False)
            GPIO.output(22,True)
            pwmA.ChangeDutyCycle(x)
            pwmB.ChangeDutyCycle(x)
            time.sleep(t)
            
        # Linear Actuators
        def inl(x=0,t=0):
            GPIO.output(7,True)
            GPIO.output(1,False)
            GPIO.output(15,True)
            GPIO.output(18,False)
            pwmC.ChangeDutyCycle(x)
            pwmD.ChangeDutyCycle(x)
            time.sleep(t)
            
        def out(x=0,t=0):
            GPIO.output(7,False)
            GPIO.output(1,True)
            GPIO.output(15,False)
            GPIO.output(18,True)
            pwmC.ChangeDutyCycle(x)
            pwmD.ChangeDutyCycle(x)
            time.sleep(t)
            
        def stop(t=0):
            pwmA.ChangeDutyCycle(0)
            pwmB.ChangeDutyCycle(0)
            time.sleep(t)
            def run2():
                while True:
                    if range_mm > 0:
                        right(0)
                        left(0)
                        inl(0)
                        out(0)
                    
            if __name__ == '__main__':
                    Thread(target = run1).stop()
                    Thread(target = run2).stop()
                    Thread(target = run3).start()
            
        

server_address_httpd = ('172.20.10.5',8080)
httpd = HTTPServer(server_address_httpd, RequestHandler_httpd)
print('Starting Server:')
httpd.serve_forever()
GPIO.cleanup()
 

Комментарии:

1. if __name__ Должна ли строка находиться внутри stop() функции? Обычно это используется только на верхнем уровне в файле, который может быть либо модулем, либо основным сценарием.

2. Ваш проект переопределения всех функций в зависимости от Request параметра кажется плохой идеей. Я думаю, что это переопределит функции, используемые в других потоках.