如何使用 Flask 向步进电机发出停止命令?

How to issue a stop command to stepper motors using Flask?

描述

我使用这个程序的最终目标是投影一个 Flask 网络应用程序,有人连接到它,他们可以使用 Adafruit 步进电机 HAT 控制步进电机。目前,可视代码有点乱,因为我想要一个登录系统,并且意识到我的时间有限,我需要专注于让它工作...

怎么了?

目前,步进电机工作正常。用户按下(现在叫什么)登录按钮,电机旋转,然后按下停止电机按钮停止。这就是问题所在……电机不会停止,它们只是减速到痛苦的速度,并且网页在尝试加载无限循环时卡住。我该如何阻止它?

试着了解我已经在这里工作了一个星期,并且已经使用了我知道的所有技巧。代码与全局变量有点混乱,现在都是因为我不顾一切地让它工作。

此处包含代码:

Python

from flask import Flask, flash, redirect, render_template, request, session, abort
import os
import time
from adafruit_motorkit import MotorKit


kit = MotorKit()

app = Flask(__name__)

def set_z_to_zero():
    global z    # Needed to modify global copy of globvar
    z = 0

def set_z_to_one():   # Needed to modify global copy of globvar
    z = 1

def rel():
    kit.stepper1.release()
    kit.stepper2.release()
    set_z_to_one()

@app.route('/')
def home():
    rel()
    if not session.get('logged_in'):
        return render_template('login.html')
    else:
        return "Hello Boss!  <a href=/logout>Logout</a>"

@app.route('/stop', methods=['GET'])
def stop_motors():
    rel()
    return render_template('login.html')

def run():
    for i in range(100):
        kit.stepper1.onestep()
        kit.stepper2.onestep()
        if z == 1:
            break

@app.route('/login', methods=['GET'])
def start_motors():
    while z == 0:
        run()
        if z == 1:
            break
        set_z_to_zero()
    rel()
    return render_template('login.html')


if __name__ == "__main__":
    app.secret_key = os.urandom(12)
    set_z_to_zero()
    app.run(debug=True,host='0.0.0.0', port=3860)

HTML


<form action="/login" method="GET">

<div class="login">

<div class="login-screen">

<div class="app-title">
<h1>Login</h1>
</div>


<div class="control-group">
<input type="text" class="login-field" value="" placeholder="username" name="username">
<label class="login-field-icon fui-user" for="login-name">
</label>
</div>


<input type="submit" value="Log in" class="btn btn-primary btn-large btn-block">

</form>
<form action="/stop" method="GET">
<input type="submit" value="Stop Motors" class="btn btn-primary btn-large btn-block">
</form>

</div>
</div>

CSS

box-sizing: border-box;
}

*:focus {
outline: none;
}
body {
font-family: Arial;
background-color: #3498DB;
padding: 50px;
}
.login {
margin: 20px auto;
width: 300px;
}
.login-screen {
background-color: #FFF;
padding: 20px;
border-radius: 5px
}

.app-title {
text-align: center;
color: #777;
}

.login-form {
text-align: center;
}
.control-group {
margin-bottom: 10px;
}

input {
text-align: center;
background-color: #ECF0F1;
border: 2px solid transparent;
border-radius: 3px;
font-size: 16px;
font-weight: 200;
padding: 10px 0;
width: 250px;
transition: border .5s;
}

input:focus {
border: 2px solid #3498DB;
box-shadow: none;
}

.btn {
border: 2px solid transparent;
background: #3498DB;
color: #F0FFFF;
font-size: 16px;
line-height: 25px;
padding: 10px 0;
text-decoration: none;
text-shadow: none;
border-radius: 3px;
box-shadow: none;
transition: 0.25s;
display: block;
width: 250px;
margin: 0 auto;
}

.btn:hover {
background-color: #2980B9;
}

.login-link {
font-size: 12px;
color: #444;
display: block;
margin-top: 12px;
}

这是网页的截图

感谢您的帮助,如果我需要澄清一些问题,请询问。

根据Python documentation

In Python, variables that are only referenced inside a function are implicitly global. If a variable is assigned a value anywhere within the function’s body, it’s assumed to be a local unless explicitly declared as global.

您需要在修改变量的方法中添加global z。 在您的 set_z_to_one() 中,您在方法范围内启动了一个新变量 z,这与全局 z.

不同
def set_z_to_one():   # Needed to modify global copy of globvar
    z = 1


改为

def set_z_to_one():
    global z
    z = 1

解决问题

为了以后的帮助我解决了这个问题...

我有一个已发布令牌的登录系统,我删除了除此之外的所有内容...所以每次有人发出命令时它都会停止它。一切都已修复并且可以正常工作。