You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派基于Flask的IoT Python应用架构:LED控制与定时任务并行实现

解决方案

你可以使用Python标准库自带的threading模块实现需求,无需引入额外服务或第三方依赖,非常适合树莓派的轻量运行场景。

实现思路

  • 定义全局控制变量,用来动态切换LED闪烁的启停状态
  • 将LED闪烁逻辑封装为独立函数,放到后台守护线程中运行,不会阻塞Flask Web服务的主线程
  • 新增Flask路由处理Web端的启停请求,通过修改控制变量实现对闪烁逻辑的动态控制

可运行代码示例

# main.py
import time
import threading
from flask import Flask
import RPi.GPIO as GPIO

# 初始化GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)

app = Flask(__name__)

# 闪烁控制全局变量
blink_enabled = False
blink_thread = None

def blinking():
    global blink_enabled
    while True:
        if blink_enabled:
            GPIO.output(8, GPIO.HIGH)
            time.sleep(1)
            GPIO.output(8, GPIO.LOW)
            time.sleep(1)
        else:
            # 未开启闪烁时降低CPU占用
            time.sleep(0.1)

# 定义Web路由
@app.route('/start')
def start_blink():
    global blink_enabled
    blink_enabled = True
    return "LED闪烁已开启"

@app.route('/stop')
def stop_blink():
    global blink_enabled
    blink_enabled = False
    GPIO.output(8, GPIO.LOW) # 立即熄灭LED
    return "LED闪烁已关闭"

@app.route('/')
def index():
    status = "运行中" if blink_enabled else "已停止"
    return f"""
    <h1>LED闪烁控制</h1>
    <p>当前状态:{status}</p>
    <button onclick="window.location.href='/start'">开启闪烁</button>
    <button onclick="window.location.href='/stop'">停止闪烁</button>
    """

if __name__ == '__main__':
    # 启动闪烁守护线程
    blink_thread = threading.Thread(target=blinking, daemon=True)
    blink_thread.start()
    # 启动Flask服务,注意不要开启debug模式,避免重复启动线程
    app.run(host='0.0.0.0', port=5000, debug=False)
    
    # 程序退出时清理GPIO
    GPIO.cleanup()

注意事项

  • 运行后访问树莓派IP的5000端口即可打开控制界面,/start和/stop接口也可以直接被其他服务调用
  • 务必关闭Flask的debug模式,调试模式的进程重载机制会导致重复创建多个闪烁线程,出现异常
  • 如果你需要更复杂的定时任务调度(比如多个定时任务、动态调整间隔),可以引入APScheduler库替换原生threading实现,功能更丰富。

内容的提问来源于stack exchange,提问作者Philipp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:36:00