浅谈iOS开发实用技术之传感器

出处: 学修网 发布于:2022-02-26 06:35:09浏览(7680)

  传感器
 
  传感器(英文名称:transducer/sensor)是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。
 
  传感器的特点包括:微型化、数字化、智能化、多功能化、系统化、网络化。它是实现自动检测和自动控制的首要环节。传感器的存在和发展,让物体有了触觉、味觉和嗅觉等感官,让物体慢慢变得活了起来。通常根据其基本感知功能分为热敏元件、光敏元件、气敏元件、力敏元件、磁敏元件、湿敏元件、声敏元件、放射线敏感元件、色敏元件和味敏元件等十大类。
 
  主要作用
 
  人们为了从外界获取信息,必须借助于感觉器官。
 
  而单靠人们自身的感觉器官,在研究自然现象和规律以及生产活动中它们的功能就远远不够了。为适应这种情况,就需要传感器。因此可以说,传感器是人类五官的延长,又称之为电五官。
 
  新技术革命的到来,世界开始进入信息时代。在利用信息的过程中,首先要解决的就是要获取准确可靠的信息,而传感器是获取自然和生产领域中信息的主要途径与手段。
 
  在现代工业生产尤其是自动化生产过程中,要用各种传感器来监视和控制生产过程中的各个参数,使设备工作在正常状态或最佳状态,并使产品达到最好的质量。因此可以说,没有众多的优良的传感器,现代化生产也就失去了基础。
 
  在基础学科研究中,传感器更具有突出的地位。现代科学技术的发展,进入了许多新领域:例如在宏观上要观察上千光年的茫茫宇宙,微观上要观察小到fm的粒子世界,纵向上要观察长达数十万年的天体演化,短到 s的瞬间反应。此外,还出现了对深化物质认识、开拓新能源、新材料等具有重要作用的各种极端技术研究,如超高温、超低温、超高压、超高真空、超强磁场、超弱磁场等等。显然,要获取大量人类感官无法直接获取的信息,没有相适应的传感器是不可能的。许多基础科学研究的障碍,首先就在于对象信息的获取存在困难,而一些新机理和高灵敏度的检测传感器的出现,往往会导致该领域内的突破。一些传感器的发展,往往是一些边缘学科开发的先驱。
 
  传感器早已渗透到诸如工业生产、宇宙开发、海洋探测、环境保护、资源调查、医学诊断、生物工程、甚至文物保护等等极其之泛的领域。可以毫不夸张地说,从茫茫的太空,到浩瀚的海洋,以至各种复杂的工程系统,几乎每一个现代化项目,都离不开各种各样的传感器。
 
  由此可见,传感器技术在发展经济、推动社会进步方面的重要作用,是十分明显的。世界各国都十分重视这一领域的发展。相信不久的将来,传感器技术将会出现一个飞跃,达到与其重要地位相称的新水平。
 
  主要特点
 
  传感器的特点包括:微型化、数字化、智能化、多功能化、系统化、网络化,它不仅促进了传统产业的改造和更新换代,而且还可能建立新型工业,从而成为21世纪新的经济增长点。微型化是建立在微电子机械系统(MEMS)技术基础上的,已成功应用在硅器件上做成硅压力传感器。
 
  传感器的组成
 
  传感器一般由敏感元件、转换元件、变换电路和辅助电源四部分组成。
 
  敏感元件直接感受被测量,并输出与被测量有确定关系的物理量信号;转换元件将敏感元件输出的物理量信号转换为电信号;变换电路负责对转换元件输出的电信号进行放大调制;转换元件和变换电路一般还需要辅助电源供电。
 
  主要功能
 
  常将传感器的功能与人类5大感觉器官相比拟:
 
  光敏传感器——视觉
 
  声敏传感器——听觉
 
  气敏传感器——嗅觉
 
  化学传感器——味觉
 
  压敏、温敏、
 
  流体传感器——触觉
 
  敏感元件的分类:
 
  物理类,基于力、热、光、电、磁和声等物理效应。
 
  化学类,基于化学反应的原理。
 
  生物类,基于酶、抗体、和激素等分子识别功能。
 
  通常据其基本感知功能可分为热敏元件、光敏元件、气敏元件、力敏元件、磁敏元件、湿敏元件、声敏元件、放射线敏感元件、色敏元件和味敏元件等十大类(还有人曾将敏感元件分46类)。

  一 传感器

  什么是传感器

  传感器是一种感应\检测周围环境的一种装置

  传感器的作用

  用于感应\检测设备周边的信息

  不同类型的传感器, 检测的信息也不一样

  iPhone内置的传感器有

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

  环境光传感器(Ambient Light Sensor)

  距离传感器(Proximity Sensor)

  磁力计传感器(Magnetometer Sensor)

  内部温度传感器(Internal Temperature Sensor)

  湿度传感器(Moisture Sensor)

  陀螺仪(Gyroscope)

  … …

  二 距离传感器

  默认情况下,每一个应用程序距离传感器都是关闭状态

  如果需要,需要通过代码将其打开

  // 过期代码 [UIApplicaTIon sharedApplicaTIon].proximitySensingEnabled

  [UIDevice currentDevice].proximityMonitoringEnabled = YES;123

  三 加速计信息获取##

  UIAccelerometer方法,该方法已过期

  - (void)viewDidLoad {

  [super viewDidLoad];

  // 1.获取单例对象

  UIAccelerometer *acceleromter = [UIAccelerometer sharedAccelerometer];

  // 2.设置代理

  acceleromter.delegate = self;

  // 3.设置采样间隔

  acceleromter.updateInterval = 1.0 / 5;

  }12345678910

  #pragma mark - 实现UIAccelerometer的代理方法

  - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleraTIon *)acceleration

  {

  NSLog(@“x:%f y:%f z:%f”, acceleration.x, acceleration.y, acceleration.z);

  }12345

  四 CoreMotion方法##

  Core Motion获取数据的两种方式

  push:实时采集所有数据(采集频率高)

  pull:在有需要的时候,再主动去采集数据

  加速计信息获取(pull/push)

  // 1.创建运动管理者对象

  CMMotionManager *mgr = [[CMMotionManager alloc] init];

  // 2.判断加速计是否可用

  if (!self.mgr.isAccelerometerAvailable) {

  NSLog(@“加速计不可用,请更换手机”);

  return;

  }

  // 3.设置采样间隔

  self.mgr.accelerometerUpdateInterval = 1.0;

  // 4.开始采样

  [self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {

  if (error) {

  NSLog(@“%@”, error);

  return;

  }

  // 获取加速计的值

  CMAcceleration acceleration = accelerometerData.acceleration;

  NSLog(@“x:%f y:%f z:%f”, acceleration.x, acceleration.y, acceleration.z);

  }];123456789101112131415161718192021

  // 开始采样

  [self.mgr startAccelerometerUpdates];12

  陀螺仪信息获取(pull/push)

  // push方式获取陀螺仪信息

  // 1.判断陀螺仪是否可用

  if (!self.mgr.isGyroAvailable) {

  NSLog(@“设备小于iPhone4,或者陀螺仪损坏”);

  return;

  }

  // 2.设置采样

  self.mgr.gyroUpdateInterval = 1.0 / 10;

  // 3.开始采样

  [self.mgr startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {

  if (error) {

  NSLog(@“%@”, error);

  return;

  }

  // 获取陀螺仪的信息

  CMRotationRate rotationRate = gyroData.rotationRate;

  NSLog(@“x:%f y:%f z:%f”, rotationRate.x, rotationRate.y, rotationRate.z);

  }];123456789101112131415161718

  // 开始采样

  [self.mgr startGyroUpdates];12

  五 摇⼀摇功能##

  监控摇一摇的方法

  方法1:通过分析加速计数据来判断是否进行了摇一摇操作(比较复杂)

  方法2:iOS自带的Shake监控API(非常简单)

  判断摇一摇的步骤:实现3个摇一摇监听方法

  - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 检测到摇动 */

  - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 摇动取消(被中断) */

  - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 摇动结束 */12345

  六 计步器##

  CMStepCounter方法,已过期

  // 1.判断计步器是否可用

  if (![CMStepCounter isStepCountingAvailable]) {

  NSLog(@“计步器不可用”);

  return;

  }

  // 2.开始计步

  // 2.1.创建计步器

  CMStepCounter *stepCounter = [[CMStepCounter alloc] init];

  // 2.2.开始计步

  // updateOn : 用户走了多少步之后,更新block

  NSOperationQueue *queue = [[NSOperationQueue alloc] init];

  [stepCounter startStepCountingUpdatesToQueue:queue updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {

  if (error) return;

  NSString *stepString = [NSString stringWithFormat:@“您一共走了%ld步”, numberOfSteps];

  [self.stepLabel performSelectorOnMainThread:@selector(setText:) withObject:stepString waitUntilDone:YES];

  }];123456789101112131415161718

  新方法CMPedometer

  // 1.判断计步器是否可用

  if (![CMPedometer isStepCountingAvailable]) {

  return;

  }

  // 2.开始计步

  // 2.1.创建计步对象

  CMPedometer *pedometer = [[CMPedometer alloc] init];

  // 2.2.开始计步

  // FromDate : 从什么时间开始计步

  NSDate *date = [NSDate date];

  [self.pedometer startPedometerUpdatesFromDate:date withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {

  if (error) {

  NSLog(@“%@”, error);

  return;

  }

  NSLog(@“您一共走了%@步”, pedometerData.numberOfSteps);

  }];

  12345678910111213141516171819

  案例:计算7天一共走了多少步

  NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

  fmt.dateFormat = @“yyyy-MM-dd”;

  NSDate *fromDate = [fmt dateFromString:@“2015-9-26”];

  NSDate *toDate = [fmt dateFromString:@“2015-9-28”];

  [self.pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {

  NSLog(@“%@”, pedometerData.numberOfSteps);

  }];

声明:本文为原创文章,如需转载,请注明来源学修网