传感器

什么是传感器

传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上

传感器的作用

用于感应\检测设备周边的信息
不同类型的传感器, 检测的信息也不一样

iPhone中的下面现象都是由传感器完成的
在地图应用中, 能判断出手机头面向的方向
一关灯, iPhone会自动降低亮度让屏幕显得不是那么刺眼
打电话时, 人脸贴近iPhone屏幕时, 屏幕会自动锁屏, 达到省电的目的

传感器的类型

iPhone内置的传感器有
运动传感器\加速度传感器\加速计(Motion/Accelerometer Sensor)
环境光传感器(Ambient Light Sensor)
距离传感器(Proximity Sensor)
磁力计传感器(Magnetometer Sensor)
内部温度传感器(Internal Temperature Sensor)
湿度传感器(Moisture Sensor)
陀螺仪(Gyroscope)

环境光传感器(Ambient LightSensor)

是iOS、Mac设备中最为古老的传感器成员

它能够让你在使用 Mac、iPhone、iPad时,眼睛更为舒适
从一个明亮的室外走入相对黑暗的室内后,iOS设备会自动调低亮度,让屏幕显得不再那么光亮刺眼
当你使用iPhone拍照时,闪光灯会在一定条件下自动开启
几乎所有的Mac 都带有背光键盘,当周围光线弱到一定条件时,会自动开启键盘背光

距离传感器(ProximitySensor)

用于检测是否有其他物体靠近设备屏幕
当你打电话或接电话时将电话屏幕贴近耳边,iPhone会自动关闭屏幕 ,好处是
节省电量
防止耳朵或面部不小心触摸屏幕而引发一些不想要的意外操作

磁力计传感器(MagnetometerSensor)

可以感应地球磁场, 获得方向信息, 使位置服务数据更精准
可以用于电子罗盘和导航应用
iPad的Smart Cover盒盖睡眠操作就是基于磁力计传感器

内部温度传感器(InternalTemperature Sensor)

从 iPad一代开始,iOS设备都加入了一个内部温度传感器,用于检测内部组件温度,当温度超过系统设定的阈值时,会出现以下提示
内部温度传感器,对于提升iOS设备自身安全性与稳定性有很大的帮助

湿度传感器(MoistureSensor)

湿度传感器跟其他基于微电子的传感器不同,是一个简单的物理传感器

简单来说,湿度传感器就是一张遇水变红的试纸

Apple的维修人员就是通过检测试纸是否变红,来判断设备是否进水
(设备进水不在保修范围之内)

陀螺仪(Gyroscope)

陀螺仪是随着iPhone4的上市首次出现在iOS设备上的传感器
陀螺仪可以用于检测设备的持握方式
陀螺仪的原理是检测设备在X、Y、Z轴上所旋转的角速度

陀螺仪在赛车类游戏中有重大作用:
模拟汽车驾驶时方向盘旋转的动作
使得这类游戏的操控体验更为真实

运动传感器\加速度传感器\加速计(Motion/Accelerometer Sensor)

最早出现在iOS设备上的传感器之一
加速计用于检测设备在X、Y、Z轴上的加速度(哪个方向有力的作用)

传感器总结
传感器_第1张图片
传感器.png
距离传感器的使用
//开启距离感应功能
[UIDevicecurrentDevice].proximityMonitoringEnabled= YES;
//监听距离感应的通知
[[NSNotificationCenterdefaultCenter]addObserver:self
selector:@selector(proximityChange:)
name:UIDeviceProximityStateDidChangeNotification
object:nil];

-(void)proximityChange:(NSNotificationCenter*)notification {
 if([UIDevicecurrentDevice].proximityState== YES){
 NSLog(@"某个物体靠近了设备屏幕");// 屏幕会自动锁住
 }else{
 NSLog(@"某个物体远离了设备屏幕");// 屏幕会自动解锁
 }
}
```

---
#####磁力、加速计、陀螺仪`代码`
```
#import "ViewController.h"
#import 
@interface ViewController ()
/** 运动管理 */
@property (nonatomic, strong) CMMotionManager *mgr;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // 获取磁力计传感器的值
    // 1.判断磁力计是否可用
    if (!self.mgr.isMagnetometerAvailable) {
        return;
    }
    // 2.设置采样间隔
    self.mgr.magnetometerUpdateInterval = 0.3;
    // 3.开始采样
    [self.mgr startMagnetometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMagnetometerData *magnetometerData, NSError *error) {
        if (error) return;
        CMMagneticField field = magnetometerData.magneticField;
        NSLog(@"x:%f y:%f z:%f", field.x, field.y, field.z);
    }];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 1.获取加速计信息
    CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;
    NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
    // 2.获取陀螺仪信息
    CMRotationRate rate = self.mgr.gyroData.rotationRate;
    NSLog(@"x:%f y:%f z:%f", rate.x, rate.y, rate.z);
}
#pragma mark - 获取陀螺仪信息
- (void)pullGyro
{
    // pull
    // 1.判断陀螺仪是否可用
    if (![self.mgr isGyroAvailable]) {
        NSLog(@"手机该换了");
        return;
    }   
    // 2.开始采样
    [self.mgr startGyroUpdates];
}
- (void)pushGyro
{
    // push
    // 1.判断陀螺仪是否可用
    if (![self.mgr isGyroAvailable]) {
        NSLog(@"手机该换了");
        return;
    }   
    // 2.设置采样间隔
    self.mgr.gyroUpdateInterval = 0.3;
    // 3.开始采样
    [self.mgr startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData *gyroData, NSError *error) {
        if (error) return;
        CMRotationRate rate = gyroData.rotationRate;
        NSLog(@"x:%f y:%f z:%f", rate.x, rate.y, rate.z);
    }];
}
#pragma mark - 获取加速计信息
- (void)pullAccelerometer
{
    // pull
    // 1.判断加速计是否可用
    if (!self.mgr.isAccelerometerAvailable) {
        NSLog(@"加速计不可用");
        return;
    }
    // 2.开始采样
    [self.mgr startAccelerometerUpdates];
}
- (void)pushAccelerometer
{
    // push
    // 1.判断加速计是否可用
    if (!self.mgr.isAccelerometerAvailable) {
        NSLog(@"加速计不可用");
        return;
    }
    // 2.设置采样间隔
    self.mgr.accelerometerUpdateInterval = 0.3;
    // 3.开始采样
    [self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { // 当采样到加速计信息时就会执行
        if (error) return;
        // 获取加速计信息
        CMAcceleration acceleration = accelerometerData.acceleration;
        NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);
    }];
}
#pragma mark - 懒加载
- (CMMotionManager *)mgr
{
    if (_mgr == nil) {
        _mgr = [[CMMotionManager alloc] init];
    }
    return _mgr;
}
@end
```

#####摇一摇
```
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    NSLog(@"用户摇一摇");
}
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    // 摇一摇被打断(电话)
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    // 摇一摇结束
}
@end
```

>#####计步器
```
#import "ViewController.h"
#import 
@interface ViewController ()
/** 计步器对象 */
@property (nonatomic, strong) CMStepCounter *counter;
@property (weak, nonatomic) IBOutlet UILabel *stepLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.判断计步器是否可用
    if (![CMStepCounter isStepCountingAvailable]) {
        NSLog(@"计步器不可用");
        return;
    }
    // 2.开始计步
    [self.counter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate *timestamp, NSError *error) {
        if (error) return;       
        self.stepLabel.text = [NSString stringWithFormat:@"您一共走了%ld步", numberOfSteps];
    }];
}
#pragma mark - 懒加载代码
- (CMStepCounter *)counter
{
    if (_counter == nil) {
        _counter = [[CMStepCounter alloc] init];
    }
    return _counter;
}
@end
```

你可能感兴趣的:(传感器)