![](/img/trans.png)
[英]Detect Tap in UITextView Objective C uneditable and unselectable
[英]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]
}
}
如果我理解得很清楚,情况就是这样的:您想确定输出是交替改变其状态还是卡在地上。 您没有指定周期/上下时间或引脚数,所以我假设您有四个连接到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.