如何使用 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;
}
这是网页的截图
感谢您的帮助,如果我需要澄清一些问题,请询问。
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
解决问题
为了以后的帮助我解决了这个问题...
我有一个已发布令牌的登录系统,我删除了除此之外的所有内容...所以每次有人发出命令时它都会停止它。一切都已修复并且可以正常工作。
描述
我使用这个程序的最终目标是投影一个 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;
}
这是网页的截图
感谢您的帮助,如果我需要澄清一些问题,请询问。
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
解决问题
为了以后的帮助我解决了这个问题...
我有一个已发布令牌的登录系统,我删除了除此之外的所有内容...所以每次有人发出命令时它都会停止它。一切都已修复并且可以正常工作。