树莓派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()
额外说明
- 页面模板调整:你的
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> - 权限注意事项:运行程序时需要使用
sudo权限,否则无法访问树莓派的GPIO引脚。 - 并发场景优化:如果需要支持多用户操作,可将占空比存储到
session或本地文件中,替代全局变量。
内容的提问来源于stack exchange,提问作者Haziq Hasbulah
相关产品推荐
相关产品推荐

