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

树莓派Web界面控制PWM调光故障排查及修复咨询

问题分析与修复方案

核心问题点

  • 变量作用域错误:DC、pwm_counter每次进入action函数都会被重置为0,点击按钮的操作无法累计数值,LED亮度永远不会变化。
  • 无效代码逻辑:return render_template之后的return pwm_counter, DC, Power永远不会执行,函数在第一个return就结束了。
  • 服务器阻塞导致循环失效:app.run()是阻塞式调用,之后的while True循环永远不会启动,无法更新PWM输出。
  • 缺失关键初始化代码:GPIO引脚初始化、PWM对象创建、UpdateScreen函数定义都缺失,代码无法正常驱动硬件。
  • 冗余变量逻辑:DC和pwm_counter功能重复,都是控制PWM占空比的变量,没必要同时维护两个。

修复后的完整代码

from flask import Flask, render_template
import RPi.GPIO as GPIO

app = Flask(__name__)

# 全局变量:保存PWM占空比,避免每次请求重置
pwm_duty_cycle = 0
# 硬件配置
LED_PIN = 18  # 根据你的实际接线修改引脚号
WATTAGE = 5000
LENGTH = 220
WIDTH = 100

# GPIO初始化
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
# 创建PWM对象,频率设为1000Hz(可根据需求调整)
pwm_output = GPIO.PWM(LED_PIN, 1000)
pwm_output.start(pwm_duty_cycle)

def calculate_power(duty_cycle):
    """计算功率值"""
    return round((((duty_cycle / 100) * WATTAGE) / (LENGTH * WIDTH)), 6)

@app.route("/<deviceName>/<action>")
def action(deviceName, action):
    global pwm_duty_cycle
    if deviceName == 'ledRed':
        if action == "on":
            if pwm_duty_cycle < 100:
                pwm_duty_cycle += 1
        elif action == "off":
            if pwm_duty_cycle > 0:
                pwm_duty_cycle -= 1
        # 实时更新PWM输出
        pwm_output.ChangeDutyCycle(pwm_duty_cycle)
    
    # 计算当前功率
    current_power = calculate_power(pwm_duty_cycle)
    # 准备模板数据,传递当前状态到页面
    templateData = {
        'ledRed_duty': pwm_duty_cycle,
        'current_power': current_power
    }
    return render_template('index.html', **templateData)

if __name__ == "__main__":
    try:
        app.run(host='0.0.0.0', port=1025, debug=True)
    finally:
        # 程序结束时清理GPIO资源
        pwm_output.stop()
        GPIO.cleanup()

额外说明

  1. 页面模板调整:你的index.html需要适配新的模板数据,示例代码如下:
    <p>当前LED亮度:{{ ledRed_duty }}%</p>
    <p>当前功率:{{ current_power }}</p>
    <a href="/ledRed/on"><button>亮度+1</button></a>
    <a href="/ledRed/off"><button>亮度-1</button></a>
    
  2. 权限注意事项:运行程序时需要使用sudo权限,否则无法访问树莓派的GPIO引脚。
  3. 并发场景优化:如果需要支持多用户操作,可将占空比存储到session或本地文件中,替代全局变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:07:38