まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを

iPhoneのセンサの数値を滑らかにする

メディア系で加速度センサなどの値を扱う場合、値を滑らかにするというか間引くことがよくあります。
内部処理では0.5秒ごとに数値を吐き出す必要があるけど、出力する数値は1秒ごとがいいとかそういう感じのものです。
iPhoneの場合、NSTimeを使います。
あ、数値を平均して何秒ごとに出力する方法もありますが、ここではそれには触れていません。

以下の例では加速度センサの値は0.5秒ずつ取っていますが、UILabelで表示されている数値は1秒ごとに表示されています。
分かりやすいように1秒ごとに数値が増えるタイマーも同時に表示しておきました。これで1秒ごとに数値が更新されているのが分かると思います。
UILabelの線の接続をお忘れなく。

ソースはこちらから。

ViewController.h

#import <UIKit/UIKit.h>

//加速度センサ使うよ宣言の<UIAccelerometerDelegate>
@interface ViewController : UIViewController <UIAccelerometerDelegate> {
    IBOutlet UILabel *sensorValueX;
    IBOutlet UILabel *sensorValueY;
    IBOutlet UILabel *sensorValueZ;
    
    //加速度センサの値出力用変数
    double x,y,z;

    //タイマー用ラベル
    IBOutlet UILabel *time;   
}
@end

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.

    //加速度センサ設定、updateIntervalは何秒ごとに値を出力するか
    UIAccelerometer *kasokudo = [UIAccelerometer sharedAccelerometer];
    kasokudo.updateInterval = 0.5;
    kasokudo.delegate = self;
    
    //加速度センサの値を間引く用(1秒ごと)
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(valueLabel:) userInfo:nil repeats:YES];
    
    //タイマー設定
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerLabel:) userInfo:nil repeats:YES];
    }

//タイマー動作
- (void)timerLabel:(NSTimer *)timer {
    int currentTime = [time.text intValue];
    int newTime = currentTime + 1;
    time.text = [NSString stringWithFormat:@"%d",newTime];
    }

//加速度センサを起動してどうするか
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    
    x = acceleration.x;
    y = acceleration.y;
    z = acceleration.z;
   }

//加速度センサの値を表示
- (void)valueLabel:(NSTimer *)timer {    
    sensorValueX.text = [NSString stringWithFormat:@"x = %f",x];
    sensorValueY.text = [NSString stringWithFormat:@"y = %f",y];
    sensorValueZ.text = [NSString stringWithFormat:@"z = %f",z];
     }
...