Как подать команду останова на шаговые двигатели, используя Flask? - PullRequest
0 голосов
/ 08 февраля 2020

Описание

Моя конечная цель в этой программе - спроецировать веб-приложение Flask, кто-то подключится к нему, и они могут управлять шаговыми двигателями с помощью Adafruit. Шаговый двигатель HAT. На данный момент визуальный код немного беспорядок из-за того, что я хочу иметь систему входа в систему и понимаю, что в связи с моим ограниченным временем, чтобы это сделать, мне нужно сосредоточиться на том, чтобы заставить его работать ...

Что не так?

В данный момент шаговые двигатели работают нормально. Пользователь нажимает кнопку (что сейчас называется), и двигатели вращаются, и нажимает кнопку остановки двигателей, чтобы остановиться. Вот в чем проблема ... Двигатели не останавливаются, они просто замедляются до мучительного темпа, и веб-страница застревает, пытаясь загрузить бесконечное число l oop. Как мне это остановить?

Попытайтесь понять, что я занимался этим неделю и выполнил каждый трюк, который я знаю. Код немного запутан с глобальными переменными, и теперь все из-за моего отчаяния просто заставить его работать.

Код включен сюда:

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;
}

И вот снимок экрана веб-страницы enter image description here

Спасибо за любую помощь, и если мне нужно что-то уточнить, пожалуйста, спросите.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Я решил это для будущей помощи ...

У меня была система входа в систему, которая выдавала токен, и я удалял все, кроме этого ..., поэтому каждый раз, когда кто-то вводил команду, он останавливал ее. Все было исправлено и работает.

0 голосов
/ 08 февраля 2020

Согласно Python документации

В Python переменные, на которые есть ссылки только внутри функции, неявно являются глобальными. Если переменной присваивается значение в любом месте тела функции, оно считается локальным, если явно не объявлено как глобальное.

Вам необходимо добавить 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

исправляет проблему

...