从Arduino计算Python中的每分钟转数

时间:2013-10-28 16:51:49

标签: python arduino pyserial

我正在尝试通过arduino中的簧片开关来计算python中的rpm。 我似乎无法做对。有人可以帮助我正确的代码。 我的结果不一致。

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

感谢帮助我,这几个月一直困扰着我。

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()

2 个答案:

答案 0 :(得分: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

如果您查看新代码,您应该意识到在while循环期间变量a未分配任何新值。您只检查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

答案 1 :(得分:0)

如果你的第一次阅读太快,你可能会得到除法。