繁体   English   中英

检测脉冲物镜c

[英]detect pulse objective c

目前,我正在创建一个iOS应用程序,以可视化arduino的端口状态。 因此,iPad正在通过Arduino的串行电缆接收信息。 Arduino每100毫秒发送一个包含其当前端口状态的包。 在iPad上可以看到此状态。 端口是输入端口。 我已经意识到我正在读取的设备正在向端口发送脉冲,因此Arduino会交替读取高电平和低电平。 这会在可视化中产生闪烁。 我的问题是现在如何检测电平是否升高或输入是否闪烁。 端口高电平持续x秒,低电平持续y秒,然后重复。 如果端口在z秒内处于低电平,则需要在可视化中将端口设置为低电平。 否则就很高。

- (void) readBytesAvailable:(UInt32)numBytes {
int bytesRead = [manager read:rxBuffer Length:numBytes];

 if(rxBuffer[i]==48){
        [self setButtonRed];
    }else if(rxBuffer[i]==49){
        [self setButtonWhite]
        }
    }

https://www.dropbox.com/s/bhy5lbm8lkdhnoy/3wire.png?dl=0

如果我理解得很清楚,情况就是这样的:您想确定输出是交替改变其状态还是卡在地上。 您没有指定周期/上下时间或引脚数,所以我假设您有四个连接到arduino引脚1,2,3,5的按钮,我将使用文字。

您必须将CHECK_PERIOD设置为适当的采样周期,以便可以为每种状态采样4/5次输入,并设置CHECK_ITERATIONS以便还可以遗漏一些点。

例如,如果正常波为100ms高和100ms低,则将CHECK_PERIOD设置为20,将CHECK_ITERATIONS设置为3或4。

long previousInputCheck;
#define NUM_INPUTS 4
const int inputPins[] = { 1, 2, 3, 5}
unsigned char inputCounter[NUM_INPUTS];
unsigned char inputStates[NUM_INPUTS];

... THEN, INTO THE MAIN ...
if ((millis() - previousInputCheck) >= CHECK_PERIOD)
{
    previousInputCheck += CHECK_PERIOD;
    unsigned char i;
    for (i = 0; i < NUM_INPUTS; i++)
    {
        if (digitalRead(inputPins[i]) == LOW)
        {
            if (inputCounter[i] <= CHECK_ITERATIONS)
                inputCounter[i]++;
            if (inputCounter[i] == CHECK_ITERATIONS)
            {
                inputStates[i] = LOW;
            }
        }
        else
        { // HIGH
            inputCounter[i] = 0;
            inputStates[i] = HIGH;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM