#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
параметра кажется плохой идеей. Я думаю, что это переопределит функции, используемые в других потоках.