gpt4 book ai didi

ios - 通过加速度计检测 iPhone 上任意位置的硬敲击

转载 作者:IT王子 更新时间:2023-10-29 08:06:44 26 4
gpt4 key购买 nike

我正在尝试检测可能在 iPhone 上的任何地方的水龙头,而不仅仅是 iPhone 屏幕。这是一个 link这表明这是可能的。

基本上我想做的是,如果用户在 iPhone 上轻按 3 次而手机放在口袋里,则发送提醒。我所取得的成就是我可以检测到 3 次点击,但在这些情况下我也会收到错误警报。 1) 如果用户走路,2) 挥动他的手机 3) 运行。我只需要检查用户是否按了他的 iPhone 3 次。

这是我的代码。

- (void)accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)acceleration
{
if (handModeOn == NO)
{
if(pocketFlag == NO)
return;
}

float accelZ = 0.0;
float accelX = 0.0;
float accelY = 0.0;

accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor));
accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor));
accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor));

self.z.text = [NSString stringWithFormat:@"%0.1f", -accelZ];

if((-accelZ >= [senstivity floatValue] && timerFlag) || (-accelZ <= -[senstivity floatValue] && timerFlag)|| (-accelX >= [senstivity floatValue] && timerFlag) || (-accelX <= -[senstivity floatValue] && timerFlag) || (-accelY >= [senstivity floatValue] && timerFlag) || (-accelY <= -[senstivity floatValue] && timerFlag))
{
timerFlag = false;
addValueFlag = true;
timer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
}

if(addValueFlag)
{
if (self.xSwitch.on)
{
NSLog(@"X sWitch is on");
[self.accArray addObject:[NSNumber numberWithFloat:-accelX]];
}
if (self.ySwitch.on)
{
NSLog(@"Y Switch is on");
[self.accArray addObject:[NSNumber numberWithFloat:-accelY]];
}
if (self.zSwitch.on)
{
NSLog(@"Z Switch is on");
[self.accArray addObject:[NSNumber numberWithFloat:-accelZ]];
}

}
//}
}

- (void)timerTick:(NSTimer *)timer1
{
[timer1 invalidate];
addValueFlag = false;
int count = 0;

for(int i = 0; i < self.accArray.count; i++)
{
if(([[self.accArray objectAtIndex:i] floatValue] >= [senstivity floatValue]) || ([[self.accArray objectAtIndex:i] floatValue] <= -[senstivity floatValue]))
{
count++;
[self playAlarm:@"beep-1" FileType:@"mp3"];
}

if(count >= 3)
{
[self playAlarm:@"06_Alarm___Auto___Rapid_Beeping_1" FileType:@"caf"];
[self showAlert];
timerFlag = true;
[self.accArray removeAllObjects];
return;
}
}
[self.accArray removeAllObjects];
timerFlag = true;
}

任何帮助将不胜感激。

谢谢

最佳答案

您应该对加速度计数据应用高通滤波器。这只会给您信号中的尖峰 - 尖锐的敲击声。

我快速搜索了“UIAccelerometer high pass filter”并找到了几个匹配项。最简单的代码采用加速度计输入的滚动平均值,然后从瞬时读数中减去该平均值以找出突然的变化。毫无疑问,还有更复杂的方法。

一旦您拥有可识别急促敲击的代码,您就需要制作可连续检测 3 次急促敲击的代码。

关于ios - 通过加速度计检测 iPhone 上任意位置的硬敲击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20156940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com