76005浏览
查看: 76005|回复: 0

[项目] Arduino动手做(126)---红外测距GP2Y0A02YK0F几个参考案例

[复制链接]
本帖最后由 驴友花雕 于 2023-10-21 17:38 编辑

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百二十六:夏普GP2Y0A02YK0F 红外测距传感器模块 20-150cm 距离传感器

Arduino动手做(126)---红外测距GP2Y0A02YK0F几个参考案例图1

GP2Y0A02YK0F
是夏普的一款距离测量传感器模块。它由PSD(位置灵敏探测器)和IRED 红外发射二极管)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输出电压值对应探测的距离。通过测量电压值就可以得出所探测物体的距离,所以这款传感器可以用于距离测量、避障等场合。


Arduino动手做(126)---红外测距GP2Y0A02YK0F几个参考案例图2

基于三角测量法
是通过测量目标点与固定基准线的已知端点角度来测量观测目标的距离。三角测量运用到天文测距时,可以根据地球自转一天或一周时与观测目标产生的视觉差距,也称作“周日地平视差”,来计算地月距离,此方法因地球半径长度限制,只适合测量太阳系内天体间的距离。光学三角测量法是一种最常用的一种光学三维测量技术,以传统的三角测量为基础,通过待测点相对于光学光学基准线偏移产生的角度变化计算该点的深度信息。根据具体的照明方式的不同,三角法可以分为被动三角法和主动三角法。

红外传感器基于三角测量原理。红外发射器按照一定的角度发射红外光束,当遇 到物体以后,光束会反射回来,如图所示。反射回来的红外光线被 CCD 检测器检测到以后,会获得一 个偏移值 L,利用三角关系,在知道了发射角度 a,偏移距 L,中心矩 X,以及滤镜的焦距 f 以后,传感器 到物体的距离 D 就可以通过几何关系计算出来了。


Arduino动手做(126)---红外测距GP2Y0A02YK0F几个参考案例图3

红外测距传感器GP2Y0A02YK0F结合Arduino和OLED显示屏可以实现距离测量和显示功能。下面是对该组合的主要特点、应用场景以及需要注意的事项的详细说明:

主要特点:

非接触式测量:GP2Y0A02YK0F红外测距传感器使用红外线发送和接收器件,可以实现非接触式的距离测量。它可以测量目标物体与传感器之间的距离,而无需物理接触。

高精度测量:该传感器具有较高的测量精度和稳定性,可以提供准确的距离测量结果。它可以在较短的距离范围内实现较高的分辨率。

简单的Arduino集成:GP2Y0A02YK0F传感器可以直接与Arduino开发板连接,通过模拟输入引脚(如A0)读取距离值。它与Arduino的集成相对简单,适用于初学者和快速原型开发。

OLED显示屏:OLED显示屏是一种具有自发光特性的显示技术,可以提供高对比度、高亮度和广角的显示效果。它适用于小型设备,如Arduino项目,可以直接连接到Arduino开发板。

应用场景:

距离测量和监控:GP2Y0A02YK0F与Arduino和OLED显示屏的组合可用于测量和监控应用,例如测量物体与传感器之间的距离,并在显示屏上实时显示距离值。这在机器人导航、自动门控制和安全监控等领域有广泛应用。

障碍物检测和避障:通过将GP2Y0A02YK0F与Arduino和OLED显示屏结合使用,可以实现障碍物检测和避障功能。传感器可以测量车辆或机器人与障碍物之间的距离,并在显示屏上显示相关警告信息,实现智能避障。

距离报警系统:利用距离传感器和OLED显示屏,可以构建距离报警系统。当检测到距离超过或低于设定阈值时,系统可以通过显示屏提供视觉警示或触发其他报警设备,例如蜂鸣器或警示灯。

需要注意的事项:

测量范围和分辨率:GP2Y0A02YK0F传感器具有特定的测量范围和分辨率。在使用时,需要理解传感器的测量范围,并根据具体应用需求选择合适的传感器型号。

反射率和环境光影响:传感器的测量结果可能受到目标物体的反射率和环境光的影响。在特定应用中,可能需要进行校准或采取其他措施以获得准确的测量结果。

供电和连接:确保传感器和OLED显示屏正确供电并连接到Arduino开发板。遵循相关的电路连接和供电要求,以确保正常工作和可靠性。

数据处理和显示:在Arduino中编写适当的代码,将从传感器读取的距离值进行处理和显示。根据需要,可以使用移动平均滤波技术来平滑测量结果,以减少噪音和抖动。

确保安全:在操作或安装GP2Y0A02YK0F传感器和OLED显示屏时,确保遵循相关的安全操作。避免将传感器暴露在过高的温度、湿度或其他恶劣环境中,以免损坏设备或影响性能。

总结起来,GP2Y0A02YK0F红外测距传感器结合Arduino和OLED显示屏可用于实现距离测量和显示功能。它在距离测量和监控、障碍物检测和避障以及距离报警系统等应用场景具有广泛的用途。在使用时,需注意测量范围、分辨率、反射率和环境光影响、供电和连接、数据处理和显示,以及安全等方面的注意事项。


下图为实验接线示意图(D2脚开关可自定义是否使用,本图仅供参考)

Arduino动手做(126)---红外测距GP2Y0A02YK0F几个参考案例图5

案例一:测量距离并显示在OLED上

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>
  2. </div><div>#define SCREEN_WIDTH 128 // OLED屏幕宽度,单位:像素</div><div>#define SCREEN_HEIGHT 64 // OLED屏幕高度,单位:像素</div><div>#define SCLK 13</div><div>#define SDA 12</div><div>#define TRIGGER_PIN 9</div><div>#define ECHO_PIN 8</div><div>#define MAX_DISTANCE 400</div><div>
  3. </div><div>Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);</div><div>
  4. </div><div>void setup() {</div><div>  pinMode(TRIGGER_PIN, OUTPUT);</div><div>  pinMode(ECHO_PIN, INPUT);</div><div>  Serial.begin(9600);</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.clearDisplay();</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  long duration, distance;</div><div>  digitalWrite(TRIGGER_PIN, LOW);</div><div>  delayMicroseconds(2);</div><div>  digitalWrite(TRIGGER_PIN, HIGH);</div><div>  delayMicroseconds(10);</div><div>  digitalWrite(TRIGGER_PIN, LOW);</div><div>  duration = pulseIn(ECHO_PIN, HIGH);</div><div>  distance = (duration / 2) / 29.1;</div><div>  if (distance > MAX_DISTANCE || distance == 0) {</div><div>    display.clearDisplay();</div><div>    display.setTextSize(1);</div><div>    display.setTextColor(WHITE);</div><div>    display.setCursor(0, 0);</div><div>    display.println("Out of range");</div><div>  } else {</div><div>    display.clearDisplay();</div><div>    display.setTextSize(1);</div><div>    display.setTextColor(WHITE);</div><div>    display.setCursor(0, 0);</div><div>    display.print("Distance: ");</div><div>    display.print(distance);</div><div>    display.println(" cm");</div><div>  }</div><div>  display.display();</div><div>  delay(500);</div><div>}</div>
复制代码




要点解读:
使用Adafruit_GFX和Adafruit_SSD1306库来驱动OLED屏幕。
定义了触发引脚、回声引脚、最大距离等参数。
在循环中,通过发送触发信号并接收回声信号来计算距离。
如果距离超出最大距离或无法测量到距离,则在OLED屏幕上显示"Out of range"。
否则,显示实际测量到的距离。

案例二:测量距离并根据距离调整蜂鸣器音量

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>#include <NewPing.h></div><div>#include <Servo.h></div><div>
  2. </div><div>#define SCREEN_WIDTH 128 // OLED屏幕宽度,单位:像素</div><div>#define SCREEN_HEIGHT 64 // OLED屏幕高度,单位:像素</div><div>#define SCLK 13</div><div>#define SDA 12</div><div>#define TRIGGER_PIN 9</div><div>#define ECHO_PIN 8</div><div>#define MAX_DISTANCE 400</div><div>#define BUZZER_PIN 7</div><div>#define BUZZER_FREQ 1000</div><div>
  3. </div><div>Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);</div><div>NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);</div><div>NewPing sonar2(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);</div><div>Servo buzzer;</div><div>
  4. </div><div>void setup() {</div><div>  pinMode(TRIGGER_PIN, OUTPUT);</div><div>  pinMode(ECHO_PIN, INPUT);</div><div>  pinMode(BUZZER_PIN, OUTPUT);</div><div>  Serial.begin(9600);</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.clearDisplay();</div><div>  buzzer.attach(BUZZER_PIN);</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  long duration, distance;</div><div>  digitalWrite(TRIGGER_PIN, LOW);</div><div>  delayMicroseconds(2);</div><div>  digitalWrite(TRIGGER_PIN, HIGH);</div><div>  delayMicroseconds(10);</div><div>  digitalWrite(TRIGGER_PIN, LOW);</div><div>  duration = pulseIn(ECHO_PIN, HIGH);</div><div>  distance = (duration / 2) / 29.1;</div><div>  if (distance > MAX_DISTANCE || distance == 0) {</div><div>    display.clearDisplay();</div><div>    display.setTextSize(1);</div><div>    display.setTextColor(WHITE);</div><div>    display.setCursor(0, 0);</div><div>    display.println("Out of range");</div><div>  } else {</div><div>    display.clearDisplay();</div><div>    display.setTextSize(1);</div><div>    display.setTextColor(WHITE);</div><div>    display.setCursor(0, 0);</div><div>    display.print("Distance: ");</div><div>    display.print(distance);</div><div>    display.println(" cm");</div><div>    buzzer.write(map(distance, 0, MAX_DISTANCE, 0, BUZZER_FREQ));</div><div>  }</div><div>  display.display();</div><div>  delay(500);</div><div>}</div>
复制代码



要点解读:
引入NewPing库来测量距离。
使用Servo库来控制蜂鸣器的音量。
根据测量到的距离调整蜂鸣器的音量。


案例三:显示测得距离

  1. <div>#include <Wire.h>  </div><div>#include <Adafruit_GFX.h>  </div><div>#include <Adafruit_SSD1306.h>  </div><div>  </div><div>#define OLED_RESET 4  </div><div>Adafruit_SSD1306 display(OLED_RESET);  </div><div>  </div><div>GP2Y0A02YK0F IRDistance sensor;  </div><div>  </div><div>void setup() {  </div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 0x3C 是 OLED 的 I2C 地址  </div><div>  display.display(); // 显示欢迎屏  </div><div>  delay(2000);  </div><div>  display.clearDisplay(); // 关闭欢迎屏  </div><div>  </div><div>  sensor.begin(); // 初始化传感器  </div><div>}  </div><div>  </div><div>void loop() {  </div><div>  float distance = sensor.readCentimeters(); // 读取距离(厘米)  </div><div>  display.clearDisplay(); // 清除屏幕  </div><div>  display.setCursor(0,0); // 设置光标位置  </div><div>  display.println(distance); // 显示距离  </div><div>  display.display(); // 更新屏幕  </div><div>  delay(1000); // 延时以实现动态显示  </div><div>}</div>
复制代码


这个程序会通过OLED显示传感器测得的与前方物体的距离,以厘米为单位。首先在setup()函数中初始化OLED和GP2Y0A02YK0F传感器,然后在loop()函数中,每秒读取一次距离,清除屏幕后将距离显示在屏幕上,然后更新屏幕。

案例四:当距离变化时触发警报

  1. <div>#include <Wire.h>  </div><div>#include <Adafruit_GFX.h>  </div><div>#include <Adafruit_SSD1306.h>  </div><div>  </div><div>#define OLED_RESET 4  </div><div>Adafruit_SSD1306 display(OLED_RESET);  </div><div>  </div><div>GP2Y0A02YK0F IRDistance sensor;  </div><div>bool previousDistance = false;  </div><div>bool currentDistance = false;  </div><div>int distanceChangeThreshold = 5; // 距离变化阈值(厘米)  </div><div>bool alarmSounding = false;  </div><div>  </div><div>void setup() {  </div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 0x3C 是 OLED 的 I2C 地址  </div><div>  display.display(); // 显示欢迎屏  </div><div>  delay(2000);  </div><div>  display.clearDisplay(); // 关闭欢迎屏  </div><div>  sensor.begin(); // 初始化传感器  </div><div>}  </div><div>  </div><div>void loop() {  </div><div>  float distance = sensor.readCentimeters(); // 读取距离(厘米)  </div><div>  if(distance > previousDistance + distanceChangeThreshold || distance < previousDistance - distanceChangeThreshold) {  </div><div>    if(!alarmSounding) { // 如果之前没有触发警报,则播放警报并显示当前距离  </div><div>      alarmSounding = true;  </div><div>      beep(500, 100); // 播放警报声,持续500毫秒,间隔100毫秒,可以根据需要修改参数  </div><div>      display.clearDisplay(); // 清除屏幕内容  </div><div>      display.setCursor(0,0); // 设置光标位置  </div><div>      display.println(distance); // 在屏幕上显示当前距离  </div><div>      display.display(); // 更新屏幕内容  </div><div>    } else { // 如果之前已经触发过警报,则仅显示当前距离,不播放警报声。  </div><div>      alarmSounding = false; // 关闭警报声音播放标志位。注意,在实际应用中可能需要一个更大的延时才能避免多次触发警报。此程序对于快速变化的物体可能过于敏感。如果要增加延时或修改灵敏度,可以在`loop()`函数中添加适当的延时或修改条件判断的阈值。此外,此程序假设了报警声是由`beep()`函数实现的,但在实际应用中可能需要其他方法来实现报警声音。</div>
复制代码



案例五:实时显示距离值

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>
  2. </div><div>#define OLED_RESET 4</div><div>Adafruit_SSD1306 display(OLED_RESET);</div><div>
  3. </div><div>const int distancePin = A0;</div><div>
  4. </div><div>void setup() {</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.clearDisplay();</div><div>  display.setTextSize(2);</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  int distance = analogRead(distancePin);</div><div>  float voltage = distance * (5.0 / 1023.0);</div><div>  float cm = 65.0 / (voltage - 0.5);</div><div>
  6. </div><div>  display.clearDisplay();</div><div>  display.setCursor(0, 0);</div><div>  display.print("Distance: ");</div><div>  display.print(cm);</div><div>  display.print(" cm");</div><div>  display.display();</div><div>
  7. </div><div>  delay(500);</div><div>}</div>
复制代码


要点解读:
代码使用Adafruit_SSD1306库来控制OLED显示屏,通过I2C协议连接。
使用analogRead函数读取红外测距传感器的模拟输入值。
根据传感器的输出电压计算距离值(以厘米为单位)。
在OLED显示屏上实时显示距离值。

案例六:显示距离范围

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>
  2. </div><div>#define OLED_RESET 4</div><div>Adafruit_SSD1306 display(OLED_RESET);</div><div>
  3. </div><div>const int distancePin = A0;</div><div>
  4. </div><div>void setup() {</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.clearDisplay();</div><div>  display.setTextSize(2);</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  int distance = analogRead(distancePin);</div><div>  float voltage = distance * (5.0 / 1023.0);</div><div>  float cm = 65.0 / (voltage - 0.5);</div><div>
  6. </div><div>  display.clearDisplay();</div><div>  display.setCursor(0, 0);</div><div>  display.print("Distance: ");</div><div>  display.print(cm);</div><div>  display.print(" cm");</div><div>
  7. </div><div>  if (cm < 20) {</div><div>    display.setCursor(0, 30);</div><div>    display.print("Too close!");</div><div>  } else if (cm > 100) {</div><div>    display.setCursor(0, 30);</div><div>    display.print("Too far!");</div><div>  }</div><div>
  8. </div><div>  display.display();</div><div>
  9. </div><div>  delay(500);</div><div>}</div>
复制代码


要点解读:
代码与前一个示例相似,但增加了距离范围的判断。
如果距离小于20厘米,显示"Too close!"。
如果距离大于100厘米,显示"Too far!"。
在OLED显示屏上实时显示距离值和距离范围。

案例七:距离阈值触发报警

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>#include <toneAC.h></div><div>
  2. </div><div>#define OLED_RESET 4</div><div>Adafruit_SSD1306 display(OLED_RESET);</div><div>
  3. </div><div>const int distancePin = A0;</div><div>const int buzzerPin = 9;</div><div>const float thresholdDistance = 30.0;</div><div>
  4. </div><div>void setup() {</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.clearDisplay();</div><div>  display.setTextSize(2);</div><div>  pinMode(buzzerPin, OUTPUT);</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  int distance = analogRead(distancePin);</div><div>  float voltage = distance * (5.0 / 1023.0);</div><div>  float cm = 65.0 / (voltage - 0.5);</div><div>
  6. </div><div>  display.clearDisplay();</div><div>  display.setCursor(0, 0);</div><div>  display.print("Distance: ");</div><div>  display.print(cm);</div><div>  display.print(" cm");</div><div>
  7. </div><div>  if (cm < thresholdDistance) {</div><div>    display.setCursor(0, 30);</div><div>    display.print("ALERT!");</div><div>    toneAC(buzzerPin, 1000);</div><div>  } else {</div><div>    noToneAC(buzzerPin);</div><div>  }</div><div>
  8. </div><div>  display.display();</div><div>
  9. </div><div>  delay(500);</div><div>}</div>
复制代码


要点解读:
代码与前一个示例相似,但增加了距离阈值的设置和报警功能。
定义了阈值距离为30厘米。
如果距离小于阈值,显示"ALERT!"并触发蜂鸣器发出声音。
如果距离大于等于阈值,停止蜂鸣器声音。
在OLED显示屏上实时显示距离值,并在需要时触发报警。

案例八:实时显示距离数据:

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>#include <SharpIR.h></div><div>
  2. </div><div>#define IR_PIN A0</div><div>#define OLED_WIDTH 128</div><div>#define OLED_HEIGHT 64</div><div>
  3. </div><div>Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, -1);</div><div>SharpIR sensor(GP2Y0A02YK0F, IR_PIN);</div><div>
  4. </div><div>void setup() {</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.clearDisplay();</div><div>  display.setTextSize(2);</div><div>  display.setTextColor(SSD1306_WHITE);</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  int distance = sensor.distance();</div><div>  display.clearDisplay();</div><div>  display.setCursor(0, 0);</div><div>  display.print("Distance: ");</div><div>  display.print(distance);</div><div>  display.print(" cm");</div><div>  display.display();</div><div>  delay(200);</div><div>}</div>
复制代码


这个例子使用了Adafruit SSD1306库和SharpIR库,通过I2C连接了OLED显示屏和红外测距传感器。在setup()函数中,我们初始化了显示屏并设置文本大小和颜色。在loop()函数中,我们使用sensor.distance()函数获取红外测距传感器的距离数据,并将数据显示在OLED屏幕上。通过不断循环这个过程,可以实时显示红外测距传感器的距离数据。

案例九:设置阈值并判断距离状态:

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>#include <SharpIR.h></div><div>
  2. </div><div>#define IR_PIN A0</div><div>#define OLED_WIDTH 128</div><div>#define OLED_HEIGHT 64</div><div>#define THRESHOLD 20</div><div>
  3. </div><div>Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, -1);</div><div>SharpIR sensor(GP2Y0A02YK0F, IR_PIN);</div><div>
  4. </div><div>void setup() {</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.clearDisplay();</div><div>  display.setTextSize(2);</div><div>  display.setTextColor(SSD1306_WHITE);</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  int distance = sensor.distance();</div><div>  display.clearDisplay();</div><div>  display.setCursor(0, 0);</div><div>  display.print("Distance: ");</div><div>  display.print(distance);</div><div>  display.print(" cm");</div><div>
  6. </div><div>  if (distance < THRESHOLD) {</div><div>    display.setCursor(0, 30);</div><div>    display.print("Object detected!");</div><div>  }</div><div>
  7. </div><div>  display.display();</div><div>  delay(200);</div><div>}</div>
复制代码


这个例子与第一个例子类似,但是增加了阈值的设置和距离状态的判断。在定义中,我们设置了THRESHOLD为20,表示距离阈值为20厘米。在loop()函数中,我们获取红外测距传感器的距离数据,并将数据显示在OLED屏幕上。如果距离小于阈值,即检测到物体,我们在屏幕上显示"Object detected!"。通过这种方式,可以根据设定的阈值判断距离状态,并在OLED屏幕上进行相应的显示。

案例十:平均距离测量:

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>#include <SharpIR.h></div><div>
  2. </div><div>#define IR_PIN A0</div><div>#define OLED_WIDTH 128</div><div>#define OLED_HEIGHT 64</div><div>#define SAMPLE_SIZE 5</div><div>
  3. </div><div>Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, -1);</div><div>SharpIR sensor(GP2Y0A02YK0F, IR_PIN);</div><div>
  4. </div><div>void setup() {</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.clearDisplay();</div><div>  display.setTextSize(2);</div><div>  display.setTextColor(SSD1306_WHITE);</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  float totalDistance = 0;</div><div>  for (int i = 0; i < SAMPLE_SIZE; i++) {</div><div>    totalDistance += sensor.distance();</div><div>    delay(50);</div><div>  }</div><div>  float averageDistance = totalDistance / SAMPLE_SIZE;</div><div>
  6. </div><div>  display.clearDisplay();</div><div>  display.setCursor(0, 0);</div><div>  display.print("Avg Distance: ");</div><div>  display.print(averageDistance);</div><div>  display.print(" cm");</div>
复制代码


这个例子通过对多次测量的距离取平均值来获得更稳定的距离数据。在`loop()`函数中,我们使用一个循环来进行多次测量,并将每次测量的距离值累加到`totalDistance`变量中。在每次测量之间,我们使用`delay(50)`进行短暂延时,以避免连续测量的干扰。最后,我们计算平均距离值,即将`totalDistance`除以`SAMPLE_SIZE`(样本大小)。在OLED屏幕上,我们显示平均距离值,并添加适当的文本。通过取多次测量的平均值,可以减少噪声和不稳定性,得到更可靠的距离数据。

案例十一:距离测量与显示

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>#include <SharpIR.h></div><div>
  2. </div><div>#define OLED_RESET 4</div><div>Adafruit_SSD1306 display(OLED_RESET);</div><div>
  3. </div><div>#define IR_PIN A0</div><div>SharpIR sensor(SharpIR::GP2Y0A02YK0F, IR_PIN);</div><div>
  4. </div><div>void setup() {</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.display();</div><div>  delay(2000);</div><div>  display.clearDisplay();</div><div>}</div><div>
  5. </div><div>void loop() {</div><div>  int distance = sensor.distance();</div><div>  display.setTextSize(2);</div><div>  display.setTextColor(WHITE);</div><div>  display.setCursor(0, 0);</div><div>  display.print("Distance: ");</div><div>  display.print(distance);</div><div>  display.print(" cm");</div><div>  display.display();</div><div>  delay(500);</div><div>  display.clearDisplay();</div><div>}</div>
复制代码


要点解读:
该程序使用了Adafruit_SSD1306库来控制OLED显示屏,并使用SharpIR库来读取GP2Y0A02YK0F红外传感器的距离值。
在setup()函数中,初始化OLED显示屏。
在loop()函数中,通过sensor.distance()获取红外传感器测得的距离值。
使用OLED显示屏显示距离值,并在每次显示前清除屏幕。
通过适当的延时,控制更新显示的频率。

案例十二:距离阈值报警

  1. <div>#include <Wire.h></div><div>#include <Adafruit_GFX.h></div><div>#include <Adafruit_SSD1306.h></div><div>#include <SharpIR.h></div><div>
  2. </div><div>#define OLED_RESET 4</div><div>Adafruit_SSD1306 display(OLED_RESET);</div><div>
  3. </div><div>#define IR_PIN A0</div><div>SharpIR sensor(SharpIR::GP2Y0A02YK0F, IR_PIN);</div><div>
  4. </div><div>const int threshold = 20; // 阈值,单位:厘米</div><div>
  5. </div><div>void setup() {</div><div>  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);</div><div>  display.display();</div><div>  delay(2000);</div><div>  display.clearDisplay();</div><div>}</div><div>
  6. </div><div>void loop() {</div><div>  int distance = sensor.distance();</div><div>  display.setTextSize(2);</div><div>  display.setTextColor(WHITE);</div><div>  display.setCursor(0, 0);</div><div>  display.print("Distance: ");</div><div>  display.print(distance);</div><div>  display.print(" cm");</div><div>  display.display();</div><div>  </div><div>  if (distance < threshold) {</div><div>    display.clearDisplay();</div><div>    display.setCursor(0, 0);</div><div>    display.setTextSize(2);</div><div>    display.setTextColor(WHITE);</div><div>    display.print("ALERT!");</div><div>    display.display();</div><div>    delay(1000);</div><div>    display.clearDisplay();</div><div>  }</div><div>  delay(500);</div><div>  display.clearDisplay();</div><div>}</div>
复制代码


要点解读:
该程序与案例1类似,但添加了距离阈值报警的功能。
在loop()函数中,检查距离是否小于预设的阈值。
如果距离低于阈值,显示屏将显示"ALERT!"警告字样,并在一秒后清除屏幕。
其余部分与前面案例相同。

案例十三: 平均距离计算

  1. #include <Wire.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
  4. #define OLED_RESET 4
  5. Adafruit_SSD1306 display(OLED_RESET);
  6. const int sensorPin = A0;  // 红外测距传感器连接到Arduino的模拟输入引脚A0
  7. const int numReadings = 10;  // 平均距离计算的读数次数
  8. int readings[numReadings];  // 存储读数的数组
  9. int index = 0;  // 当前读数索引
  10. int total = 0;  // 总和
  11. int averageDistance = 0;  // 平均距离
  12. void setup() {
  13.   // 初始化OLED显示屏
  14.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  15.   display.clearDisplay();
  16.   display.setTextSize(2);
  17.   display.setTextColor(WHITE);
  18.   display.setCursor(0, 0);
  19.   display.println("Average Distance");
  20.   display.display();
  21.   // 初始化读数数组
  22.   for (int i = 0; i < numReadings; i++) {
  23.     readings[i] = 0;
  24.   }
  25. }
  26. void loop() {
  27.   // 读取传感器距离值
  28.   int distance = analogRead(sensorPin);
  29.   // 移除最旧的读数并添加新的读数
  30.   total = total - readings[index];
  31.   readings[index] = distance;
  32.   total = total + readings[index];
  33.   index = (index + 1) % numReadings;
  34.   // 计算平均距离
  35.   averageDistance = total / numReadings;
  36.   // 在OLED显示屏上显示平均距离
  37.   display.clearDisplay();
  38.   display.setCursor(0, 0);
  39.   display.print("Avg Distance:");
  40.   display.setCursor(0, 16);
  41.   display.print(averageDistance);
  42.   display.display();
  43.   // 稍作延迟
  44.   delay(100);
  45. }
复制代码



此示例程序使用了Adafruit的SSD1306库来控制OLED显示屏。在编译和上传代码之前,你需要确保已经安装了该库。此外,你还需要将GP2Y0A02YK0F红外测距传感器正确连接到Arduino的模拟输入引脚A0。这个程序初始化了OLED显示屏,并设置了一个循环来读取传感器距离值并计算平均距离。它使用一个固定长度的读数数组来存储距离读数,并通过移除最旧的读数和添加新的读数来更新总和。然后,它计算平均距离并在OLED显示屏上显示结果。请根据你的具体硬件配置和需求进行适当的修改和调整。

这些示例代码演示了如何结合Arduino、红外测距传感器GP2Y0A02YK0F和OLED显示屏进行实际应用。通过这些代码,你可以获取实时距离数据、设置阈值并判断距离状态,以及进行平均距离测量。这些功能可用于许多项目和应用,例如避障机器人、距离监测系统等。你可以根据具体需求对代码进行修改和扩展。

请注意,以上案例只是为了拓展思路,可能存在错误、不适用或者不能通过编译的情况。不同的硬件平台、使用场景和Arduino版本可能会导致不同的使用方法。在实际编程中,您需要根据您自己的硬件配置、使用场景和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。


Arduino动手做(126)---红外测距GP2Y0A02YK0F几个参考案例图4

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail