传感器

作者: 董立权 | 来源:发表于2017-07-20 06:56 被阅读0次
    • 加速计 陀螺仪 磁力计 距离传感器 计步器 摇一摇
    • 传感器是一种感应 检测装置
    • 作用:用于感应 检测设备周边信息
      在地图应用中,能判断出手机头面向的方向
      一关灯,iphone会自动降低亮度,让屏幕显得不是那么刺眼
      打电话时,人脸贴近iPhone屏幕时,屏幕会自动锁屏,达到省电的目的
    • iphone5内置传感器:
      运动传感器 加速度传感器
      环境光传感器 :感应周边环境光线的强弱(自动调节屏幕亮度)
      距离传感器:感应是否有其他物体靠近设备屏幕(打电话自动锁屏)
      磁力计传感器:感应周边的磁场(盒盖锁屏)
      内部温度传感器:感应设备内部的温度(提醒用户降温,防止设备损伤)
      湿度传感器:感应设备是否进水(方便维护人员)
      陀螺仪:感应设备的持握方式(赛车类游戏)
      加速计:感应设备的运动(摇一摇,计步器)
      气压传感器:测量大气压的气压计(测算海拔高度)iphone6新增

    摇一摇

    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
        NSLog(@"开始摇手机");
    }
    -(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
        NSLog(@"结束摇手机");
    }
    -(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
        NSLog(@"取消");
    }
    

    距离传感器

        //打开距离传感器(默认是关闭)
        [UIDevice currentDevice].proximityMonitoringEnabled = YES;
        //接受距离传感器的通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChangeNotification) name:UIDeviceProximityStateDidChangeNotification object:nil];
    
    -(void)proximityStateDidChangeNotification {
        if([UIDevice currentDevice].proximityState == YES){
            NSLog(@"有人靠近");
        }else {
            NSLog(@"走了");
        }
    }
    

    CoreMotion框架的使用

    加速计(Accelerometer)

    //导入框架
    CoreMotion.framework
    //导入头文件
    #import <CoreMotion/CoreMotion.h>
    
    • push方式
    //运动管理者
    @property (nonatomic,strong)CMMotionManager *manager;
    //-----------------------------------------------------------
        //1.创建运动管理者
        CMMotionManager *manager = [[CMMotionManager alloc] init];
        self.manager = manager;
        
        //2.判断加速计是否可用
        if(self.manager.isAccelerometerAvailable == NO){
            NSLog(@"加速计不可用");
        }
        
        //3.获取加速计数据
        
        //push方式
        //设置数据的更新频率
        self.manager.accelerometerUpdateInterval = 1.0;
        //获取数据
        [self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            if(error){
                NSLog(@"%@",error);
            }
            //1表示一个重力加速度 g
            NSLog(@"x:%f y:%f z:%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
        }];
    
    • pull方式
    //运动管理者
    @property (nonatomic,strong)CMMotionManager *manager;
    //------------------------------------------------------------
    //1.创建运动管理者
        CMMotionManager *manager = [[CMMotionManager alloc] init];
        self.manager = manager;
        
        //2.判断加速计是否可用
        if(self.manager.isAccelerometerAvailable == NO){
            NSLog(@"加速计不可用");
        }
        
        //3.开始获取加速计更新数据
        [self.manager startAccelerometerUpdates];
    
    //pull方式
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        NSLog(@"x:%f y:%f z:%f",self.manager.accelerometerData.acceleration.x,self.manager.accelerometerData.acceleration.y,self.manager.accelerometerData.acceleration.z);
    }
    

    磁力计(Magnetometer)

    //导入框架
    CoreMotion.framework
    //导入头文件
    #import <CoreMotion/CoreMotion.h>
    
    • push方式
    //运动管理者
    @property (nonatomic,strong)CMMotionManager *manager;
    //-----------------------------------------------------------
        //1.创建运动管理者
        CMMotionManager *manager = [[CMMotionManager alloc] init];
        self.manager = manager;
        
        //2.判断磁力计是否可用
        if(self.manager.isMagnetometerAvailable == NO){
            NSLog(@"磁力计不可用");
        }
        
        //3.获取磁力计数据
        //push方式
        //设置数据更新频率
        self.manager.magnetometerUpdateInterval = 1.0;
        [self.manager startMagnetometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {
            if(error){
                NSLog(@"%@",error);
            }
            //磁力计的单位:T 特斯拉
            NSLog(@"x:%f y:%f z:%f",magnetometerData.magneticField.x,magnetometerData.magneticField.y,magnetometerData.magneticField.z);
        }];
    
    • pull方式
    //运动管理者
    @property (nonatomic,strong)CMMotionManager *manager;
    //-----------------------------------------------------------
        //1.创建运动管理者
        CMMotionManager *manager = [[CMMotionManager alloc] init];
        self.manager = manager;
        
        //2.判断磁力计是否可用
        if(self.manager.isMagnetometerAvailable == NO){
            NSLog(@"磁力计不可用");
        }
        
        //3.获取磁力计数据
      
       [self.manager startMagnetometerUpdates];
    
    //pull方式
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        NSLog(@"x:%f y:%f z:%f",self.manager.magnetometerData.magneticField.x,self.manager.magnetometerData.magneticField.y,self.manager.magnetometerData.magneticField.z);
    }
    

    陀螺仪(Gyro)

    //导入框架
    CoreMotion.framework
    //导入头文件
    #import <CoreMotion/CoreMotion.h>
    
    • push方式
    //运动管理者
    @property (nonatomic,strong)CMMotionManager *manager;
    //-----------------------------------------------------------
        //1.创建运动管理者
        CMMotionManager *manager = [[CMMotionManager alloc] init];
        self.manager = manager;
        //2.判断陀螺仪是否可用
        if(self.manager.isGyroAvailable == NO) {
            NSLog(@"陀螺仪不可用");
        }
        //设置更新频率
        self.manager.gyroUpdateInterval = 1.0;
        //获取数据
        [self.manager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
            if(error){
                NSLog(@"%@",error);
            }
            NSLog(@"x:%f y:%f z:%f",gyroData.rotationRate.x,gyroData.rotationRate.y,gyroData.rotationRate.z);
        }];
    
    • pull方式
    //运动管理者
    @property (nonatomic,strong)CMMotionManager *manager;
    //-----------------------------------------------------------
        //1.创建运动管理者
        CMMotionManager *manager = [[CMMotionManager alloc] init];
        self.manager = manager;
        //2.判断陀螺仪是否可用
        if(self.manager.isGyroAvailable == NO) {
            NSLog(@"陀螺仪不可用");
        }
        //获取数据
        [self.manager startGyroUpdates];
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        NSLog(@"x:%f y:%f z:%f",self.manager.gyroData.rotationRate.x,self.manager.gyroData.rotationRate.y,self.manager.gyroData.rotationRate.z);
    }
    

    计步器的使用(CMStepCounter CMPedometer)

    • iOS8.0之前
    //导入框架
    CoreMotion.framework
    //导入头文件
    #import <CoreMotion/CoreMotion.h>
    
    //计算步数
    @property(nonatomic,strong)CMStepCounter *stepCounter;
    //-------------------------------------------------------------
    //1.判断计步器是否可用
        if(!CMStepCounter.isStepCountingAvailable){
            NSLog(@"计步器不可用");
        }
        //2.创建计算步数对象
        self.stepCounter = [[CMStepCounter alloc] init];
        //授权 info.plist NSMotionUsageDescription
        //3.开始计算步数
        //Queue:队列
        //updateOn:从几步开始计算步数
        [self.stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:1 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
            if(error){
                NSLog(@"%@",error);
            }
            self.stepLabel.text = [NSString stringWithFormat:@"%zd",numberOfSteps];
        }];
    
    //计算步数授权
    <key>NSMotionUsageDescription</key>
        <string></string>
    
    • iOS8.0之后
    //导入框架
    CoreMotion.framework
    //导入头文件
    #import <CoreMotion/CoreMotion.h>
    
    //iOS8之后计算步数
    @property(nonatomic,strong)CMPedometer *pedometer;
    //1.判断计步器是否可用
        if(![CMPedometer isStepCountingAvailable]){
            NSLog(@"计步器不可用");
        }
        
        //2.创建计算步数对象
        self.pedometer = [[CMPedometer alloc] init];
        
        //3.开始计算步数
        //FromDate :从何时开始计步
        [self.pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
            if(error){
                NSLog(@"%@",error);
            }
            NSLog(@"%@",pedometerData.numberOfSteps);
        }];
    
    //计算步数授权
    <key>NSMotionUsageDescription</key>
        <string></string>
    

    小球运动(传感器应用)

    //导入框架
    CoreMotion.framework
    //导入头文件
    #import <CoreMotion/CoreMotion.h>
    
    //运动管理者
    @property(nonatomic,strong)CMMotionManager *motionManager;
    //速度
    @property(nonatomic,assign)CGPoint spend;
    //小球
    @property (weak, nonatomic) IBOutlet UIImageView *ballView;
    
    //-----------------------------------------------------------
    //1.创建运动管理者对象
        self.motionManager = [[CMMotionManager alloc] init];
        //2.判断加速计是否可用
        if(self.motionManager.isAccelerometerAvailable == NO){
            NSLog(@"加速计不可用");
        }
        //设置跟新时间
        self.motionManager.accelerometerUpdateInterval = 1/30.0;
        //3.获取加速计数据
        [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            if(error){
                NSLog(@"加速度获取失败");
            }
            //在这个block中,时间是固定的,并且一段时间就会调用这个block
            NSLog(@"x:%f y:%f z:%f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
            //x y 是x轴和y轴的加速度
            //将加速度转换成速度
            _spend.x += accelerometerData.acceleration.x;
            _spend.y -= accelerometerData.acceleration.y;
            //改变小球的位置
            CGRect ballFrame = self.ballView.frame;
            ballFrame.origin.x += _spend.x;
            ballFrame.origin.y += _spend.y;
            //防止小球超出四个边界
            //左边
            if(ballFrame.origin.x <= 0){
                ballFrame.origin.x = 0;
                //添加空气阻力效果
                _spend.x *= -0.7;
            }
            //右边
            if(ballFrame.origin.x >= self.view.bounds.size.width - ballFrame.size.width){
                ballFrame.origin.x = self.view.bounds.size.width - ballFrame.size.width;
                _spend.x *= -0.7;
            }
            //上边
            if(ballFrame.origin.y <= 0){
                ballFrame.origin.y = 0;
                _spend.y *= -0.7;
            }
            //下边
            if(ballFrame.origin.y >= self.view.bounds.size.height - ballFrame.size.height){
                ballFrame.origin.y = self.view.bounds.size.height - ballFrame.size.height;
                _spend.y *= -0.7;
            }
            //改变frame
            self.ballView.frame = ballFrame;
            
        }];
    
    

    相关文章

      网友评论

          本文标题:传感器

          本文链接:https://www.haomeiwen.com/subject/qxvlkxtx.html