【问题标题】:Raspberry Pi Speedometer树莓派车速表
【发布时间】:2022-06-13 18:31:54
【问题描述】:

我正在使用树莓派来跟踪来自动物跑轮的信息,例如行进距离和速度。

我正在使用脚本(来源:https://drive.google.com/file/d/1kKWoHWWLt008tQB-H_9C2gjgoBFygKR4/view?usp=sharing


import RPi.GPIO as GPIO
import time
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(6, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#get current data from file
file = open("/home/pi/current_count","r")
feet_traveled = float(file.readline())
high_mph = float(file.readline())
max_mph_time = file.readline()

prev_time = 0
mark_time = 0
prev_feet_traveled = 0
mph = 0

def increase_count(channel):
    global prev_time
    global feet_traveled
    global prev_feet_traveled
    global high_mph
    global max_mph_time
    global mph

    feet_traveled += 2.095
    mark_time = time.time()
    elapsed_time = mark_time - prev_time
    prev_time = mark_time
    fps = (feet_traveled - prev_feet_traveled) / elapsed_time
    prev_feet_traveled = feet_traveled
    mph = fps / 0.6818182

    if mph > high_mph:
        high_mph = mph
        max_mph_time = time.asctime(time.localtime(time.time()))

    print 'Feet per second  = ' + str(fps)
    print 'MPH = ' + str(mph)
    print 'Highest MPH ' + str(high_mph)

    # write mph log
    with open('/home/pi/mph_log', 'a+') as writer:
       localtime = time.asctime(time.localtime(time.time()))
       mph_log = localtime + ' MPH {0} fps {1}'.format(mph,fps) + '\n'
       writer.write(mph_log)

GPIO.add_event_detect(6, GPIO.RISING, callback=increase_count, bouncetime=300)

while True:
    miles_traveled = float(feet_traveled)/5280
    print "Distance traveled is {0:,.1f} feet or {1:.3f} miles".format(feet_traveled,miles_traveled)
    sleep(10)
    distance = "<h1>Distance traveled is {0:,.1f} feet or {1:.3f} miles".format(feet_traveled,miles_traveled)
    max_mph = '<h1>Peak MPH was {0:.2f} at '.format(high_mph) + str(max_mph_time)
    current_mph = '<h1>Last speed measured was {0:.2f}mph'.format(mph) 

    # write web page
    with open('/var/www/html/index.html', 'w') as writer:
       writer.write('<html><body>' + distance)
       writer.write('</h1>')
       writer.write(current_mph)
       writer.write('</h1>')
       writer.write(max_mph + '</body></html>')

    # write current count to disk
    with open('/home/pi/current_count', 'w') as writer:
       writer.write(str(feet_traveled) + '\n')
       writer.write(str(high_mph) + '\n')
       writer.write(max_mph_time)

    # write to log file
    with open('/home/pi/log_file', 'a+') as writer:
       localtime = time.asctime(time.localtime(time.time()))
       distance = localtime + ' Distance traveled is {0:,.1f} feet or {1:.3f} miles'.format(feet_traveled,miles_traveled) + '\n'
       writer.write(distance)

运行代码时出现以下错误:

Traceback(最近一次调用最后一次):文件“/home/pi/wheel.py”,行 55,在 miles_traveled = float (feet_traveled) / 5280 NameError: name 'feet_traveled' is not defined

在脚本中,我将 feet_traveled 定义为 2.09,因为这是一个轮子旋转过程中经过的距离。

我不知道为什么我会收到错误,但感谢任何帮助。

原创剧本的作者:https://www.reddit.com/r/RASPBERRY_PI_PROJECTS/comments/g4xkrd/made_a_speedometer_odometer_for_my_cat_wheel/

【问题讨论】:

  • 您只在increase_count() 函数中定义了miles_traveled。全局变量通常是错误代码的标志,因此不要使用它们,而是将适当的参数传递给函数,并在最后以列表、元组、字典或任何您喜欢的数据结构的形式返回适当的值。

标签: python raspberry-pi gpio


【解决方案1】:

您好feet_traveled,它仅在increase_count() 函数中定义和存在。如果您在函数范围之外需要它,请考虑返回它。


编辑

关键是feet_traveled 变量确实被定义为全局变量,并且它在函数范围之外也可用,但您只是更新变量:

feet_traveled += 2.095
 

没有先初始化。换句话说,您将 2.095 添加到甚至不能浮动的东西上。 所以我的建议是:用

初始化变量
feet_traveled = 2.095

你的错误就会消失。

【讨论】:

  • 我把foot_traveled作为函数内部的一个全局变量,难道我不能在函数外部使用它吗?
  • 嗨,很抱歉回答迟了。你是对的,但我认为关键是在global feet_traveled 之后,你只是用feet_traveled += 2.095 更新 变量,而没有先初始化它。您正在将 2.095 添加到甚至不能浮动的东西上。所以我的建议是:使用feet_traveled = 2.095 初始化变量或将feet_traveled = 0.0 初始化为零,然后根据需要更新feet_traveled += 2.095
  • 我正在相应地修复上述答案。如果解决方案适合您,请考虑接受答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2014-09-14
相关资源
最近更新 更多