所以基本上我正在尝试构建一个带有覆盆子pi 0的led项目。我已经在我的flask web项目中使用了led python脚本。但我希望只需点击pi生成的网页上的按钮即可更改LED灯条上的图案。我目前正在使用flask运行Web服务器并更新发送给它。我也使用execnet从python 2文件运行模式方法,因为NeoPixel库只在python 2而不是3。
from flask import Flask, render_template, request
import execnet
CURRENT_PATTERN = "No Pattern Running"
app = Flask(__name__)
def callPython2(Version, Module, Function, Args):
gw = execnet.makegateway("popen//python=python%s" % Version)
channel = gw.remote_exec("""
from %s import %s as the_function
channel.send(the_function(*channel.receive()))
""" % (Module, Function))
channel.send(Args)
@app.route("/")
def index():
CURRENT_PATTERN = 'BootUp'
callPython2("2.7", "lakeboot", "startUp", "")
templateData = {
'title' : 'LED Pattern Status',
'pattern' : CURRENT_PATTERN,
}
return render_templates("index.html', **templateData)
@app.route("/<patternName>/<action>")
def action(patternName, action):
if action == 'stop':
CURRENT_PATTERN = 'No Pattern Running"
callPython2("2.7", "lakeboot", "turnOff", "")
if patternName == 'TheaterChase':
CURRENT_PATTERN = 'Theater Chase'
callPython2("2.7", "lakeboot", "runTheater", "")
#More Pattern calls like above
templateData = {
'title' : "LED Pattern Status',
'pattern' : CURRENT_PATTERN,
}
return render_template('index.html', **templateData)`
这就是我的webPage.py文件的样子。模式更改调用工作,但它只执行所选模式的一次迭代,但我希望它循环,直到告知停止或选择新模式。
P.S。对不起,如果格式不好以前从未在这里发布过,也只是使用python几个月。
编辑: 这是index.html
<!DOCTYPE html>
<head>
<title>LED Status</title>
<link rel="stylesheet" href='../static/style.css'/>
</head>
<body>
<h2> Status </h2>
<h3> Current Pattern ==> {{ pattern }}</h3>
<br>
<h2> Commands </h2>
<h3>
Run Bootup ==>
<a href="/bootup/start" class="button">TURN ON</a>
<a href="/bootup/stop" class="button">TURN OFF</a>
</h3>
<h3>
Run Theater Chase ==>
<a href="/TheaterChase/start" class="button">TURN ON</a>
<a href="/TheaterChase/stop"class="button">TURN OFF</a>
</h3>
<h3>
Run Pattern Three ==>
<a href="/ledGrn/start" class="button">TURN ON</a>
</h3>
</body>
</html>
答案 0 :(得分:0)
一种不寻常但不完全疯狂的方法是在线程中运行Flask,主线程控制LED。 LED侧和Flask侧将通过共享数据结构进行通信,如果您执行的操作比执行原子操作更复杂,则应安排锁定。
基本流程是:
对于任何超过单个州的值,州持有者都希望在内部锁定访问权。
我有一个控制相机here的工作示例。
关键部分,稍微编辑了
def webserver(control):
app.config['CONTROL'] = control
# It isn't safe to use the reloader in a thread
app.run(host='0.0.0.0', debug=True, use_reloader=False)
control = Control()
ui_thread = threading.Thread(target=webserver, args=(control,))
ui_thread.start()
while control.running():
# control the LEDs, periodically interrogating control
从Flask方面,
@app.route('/command', methods=['POST'])
def command():
control = app.config['CONTROL']
control.command(request.form.get('command'))
return redirect('/')