0

我正在尝试通过arduino的簧片开关计算python中的rpm。我似乎做错了。有人可以帮我把代码弄好。我的结果不一致。

我的问题是我正在尝试计算每分钟的转数,但我遇到了分钟部分的问题。每次通过簧片开关时,转数计数器工作正常,计数增加 1、2、3、4、5、6(等)。但是,rpm 部分是 rev / ((time.time() - t)/60) 给我一个结果,即根据旋转速度不断增加值不会足够快地增加或减少。因此,当簧片开关以每分钟 30 转的速度通过时,它应该发出 30 RPM 的簧片;当簧片开关以每分钟 90 转的速度通过时,它应该发出 90 RPM 的簧片。我知道我需要为每一分钟计算一次转数,我想这是我很难编程的每一分钟。

感谢您帮助我,这已经困扰了我好几个月了。

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600) 
t = time.time()
a = ser.read()

rev = 0

while  (a == ser.read()):


    rev += 1
    print rev / ((time.time() - t)/60)

新问题,现在我正在尝试添加两个簧片开关。我可以让两者分别工作,但是当我通过第二个簧片开关时,脚本会终止。我现在为什么要终止脚本(如果为真,则为假终止),但我不确定如何正确编码。b'1' 和 b'2' 是从 arduino 进来的

我的目标是让两个芦苇同时阅读。

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600) 
a = ser.read()
t0 = time.time()


while(a == ser.read()):

    if a == b'2':
        t1 = time.time()
        try:
            print(1 / ((t1-t0)/60))
        except ZeroDivisionError:
            pass
        t0 = t1
    if a == b'1':
        t1 = time.time()
        try:
            print(1 / ((t1-t0)/60))
        except ZeroDivisionError:
            pass
        t0 = t1

我没有工作的代码,所以你可以了解我正在尝试做什么。如果我能以某种方式打破 b'1' 和 b'2'。在字体对象部分的下方,您将看到 m 和 r 需要去

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600)
import pygame, sys
from pygame.locals import *
t0 = time.time()

pygame.init()
DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('MPH!')

WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (148, 228, 255)
BLACK = (0, 0, 0)


while True:
    a = ser.read()

    if a == b'2':

        t1 = time.time()
        try:
            rpmm = (1 / ((t1-t0)/60))
            m = str((7.065 *rpmm * 60)/5280).strip("\n,\r")

        except ZeroDivisionError:
            pass
        t0 = t1
    if a == b'1':
        t1 = time.time()
        try:
            r = str((1 / ((t1-t0)/60))).strip("\n,\r")


        except ZeroDivisionError:
            pass
        t0 = t1



    fontObj = pygame.font.SysFont('digitaldream', 40)
    textSurfaceObj = fontObj.render('MPH:'+m, True, BLUE, BLACK)
    textRectObj = textSurfaceObj.get_rect()
    textRectObj.center = (200, 150)

    fontObj2 = pygame.font.SysFont('digitaldream', 40)
    textSurfaceObj2 = fontObj2.render('RPM:'+r, True, BLUE, BLACK)
    textRectObj2 = textSurfaceObj2.get_rect()
    textRectObj2.center = (200, 200)




    DISPLAYSURF.fill(BLACK)
    DISPLAYSURF.blit(textSurfaceObj, textRectObj)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()
4

2 回答 2

1

现在,您的代码将输出自读取开始以来的平均RPM。如果ser.read()每次旋转返回一次,您可以执行以下操作来获取瞬时旋转速度:

import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600) 
a = ser.read()
t0 = time.time()

while(a == ser.read()):
    t1 = time.time()
    try:
        print(1 / ((t1-t0)/60))
    except ZeroDivisionError:
        pass
    t0 = t1

如果您查看您的新代码,您应该意识到a在 while 循环期间没有为该变量分配任何新值。您只检查是否ser.read()等于进入 for 循环之前的值。这意味着如果ser.read()在进入 while 循环之前采用另一个值,则语句a == ser.read()将为False.

此代码适用于 ser.read() 的两个值。

import serial
import time


ser = serial.Serial('/dev/ttyACM0', 9600) 
t0 = time.time()

while True:
    a = ser.read()
    if a == b'2' or a == b'1':
        t1 = time.time()
        try:
            print(1 / ((t1-t0)/60))
        except ZeroDivisionError:
            pass
        t0 = t1
    else:
        break
于 2013-10-29T00:58:59.323 回答
0

如果您的第一次读取速度太快,您可能会被零除。

于 2013-10-28T17:15:04.197 回答