# 项目二十三 红外发射

## 1.实验说明

在这个套件中，有一个红外发射传感器，它主要用到了红外发射管。它是一个能发射出特定波长红外光的二极管。我们可以将传感器连接到单片机上，利用编程，控制传感器发射出38KHz调制信号，可适应市面上各种红外接收头，以便红外线接收传感器能接收到，从而实现红外无线通讯。

实验中，我们利用红外发射传感器发射对应数据，每发射一次数据，传感器上的D1 LED就闪烁一次。

## 2.实验器材

- keyes brick 红外发射传感器*1
- keyes UNO R3开发板*1
- 传感器扩展板*1
- 3P 双头XH2.54连接线*1
- USB线*1

## 3.接线图

![7a0b86725a72e316022a5cfbb726db9a](./media/7a0b86725a72e316022a5cfbb726db9a.png)

## 4.测试代码

编译上传之前我们先安装库文件`IRremote.h`与`SimpleTimer.h`，安装方法请看到Arduino 基础教程中查看。

**注意需要使用我们提供的库文件不要随意更新，否则可能出现不兼容情况。**

```c
// 引入红外遥控库，用于发送和接收红外信号
#include <IRremote.h>

// 引入SimpleTimer库，用于实现定时器功能（非阻塞式延迟）
#include <SimpleTimer.h>

// 创建一个红外发送对象，使用数字引脚3作为红外信号输出引脚
IRsend irsend_3(3);

// 创建一个SimpleTimer定时器对象
SimpleTimer timer;

// 定时器回调函数：当定时器触发时执行此函数
void Simple_timer_1() {
  // 发送一个32位的RC5红外编码信号，数据值为0x89ABCDEF
  irsend_3.sendRC5(0x89ABCDEF, 32);
}

// 初始化函数，在程序开始时执行一次
void setup() {
  // 设置定时器：每1000毫秒（1秒）触发一次Simple_timer_1函数
  // L后缀表示长整型，确保时间值正确
  timer.setInterval(1000L, Simple_timer_1);
}

// 主循环函数，会重复执行
void loop() {
  // 运行定时器，检查并执行到期的定时任务
  // 这种非阻塞方式允许在等待期间执行其他操作
  timer.run();
}
```

## 5.代码说明

1. `#include <IRremote.h>` 添加红外库，这个库包含发射红外信号与接收红外信号的功能
2. `IRsend irsend_3(3);` 创建红外发射对象，并设置红外信号的输出引脚为D3
3. `irsend_3.sendRC5(0x89ABCDEF, 32);` 发射数据值为0x89ABCDEF
4. `delay(1000);` 延时很重要，一定要有不然发射红外信号太快会乱的

## 6.测试结果

按照接线图接线，上传测试代码成功，红外发射模块就会每个一秒钟发射一次红外值，发射时模块上的红色LED灯会闪烁一下。

