在pi 0上运行Web服务器的最佳方法是改变同一pi上led灯条的模式?

时间:2018-05-18 09:00:24

标签: python flask raspberry-pi

所以基本上我正在尝试构建一个带有覆盆子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>

1 个答案:

答案 0 :(得分:0)

一种不寻常但不完全疯狂的方法是在线程中运行Flask,主线程控制LED。 LED侧和Flask侧将通过共享数据结构进行通信,如果您执行的操作比执行原子操作更复杂,则应安排锁定。

基本流程是:

  1. 创建共享状态持有者
  2. 将其注入Flask配置
  3. 以线程
  4. 启动Flask应用
  5. 做你的前景(在这种情况下控制LED)定期检查共享状态持有者的新设置/命令。
  6. Flask处理程序通过共享状态持有者查询/设置。
  7. 对于任何超过单个州的值,州持有者都希望在内部锁定访问权。

    我有一个控制相机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('/')