在我们身边红外遥控随处可见,如电视遥控、空调遥控、风扇遥控等等,具有使用便捷、成本低等特点。
红外遥控器用于红外信号的调制和发射,红外接收器件用于信息的接收和解调。
红外接收管是直接将电能转化为近红外光的器件,属于二极管类。红外接收头是一种接收、放大、解调装置,内部集成电路已完成解调,输出是数字信号。

红外接收
红外遥控
红外接收和遥控模块详情
从 https://gitee.com/billyzh/esp32-cpp-lesson 下载本教程的源码到本地硬盘文件夹,如d:\esp32-cpp-lesson
在VSCode中,选择【文件】->【打开文件夹...】选择上一步保存的文件夹打开
打开项目后,选择config.h文件,修改第10行为
#define APP_LESSON43 1
打开unit4-lesson43/board_config文件,设置器件使用的引脚,
#define IR_SENSOR_PIN GPIO_NUM_35
创建传感器实例,代码如下(unit4-lesson43/my_board.cpp):
MyBoard::MyBoard() : Board() {
Log::Info(TAG, "===== Create Board ...... =====");
Log::Info(TAG, "initial led.");
led_ = new GpioLed(BUILTIN_LED_PIN, false);
// 创建传感器对象
std::shared_ptr<IrSensor> irsensor_ptr = std::make_shared<IrSensor>(kIrSensor, IR_SENSOR_PIN);
AddSensor(irsensor_ptr);
Log::Info( TAG, "===== Board config completed. =====");
}
程序解读
1. 本例使用的红外接收传感器使用了特定协议来传送数据,故需要自定义传感器类IrSensor来实现数据获取。
红外接收传感器类,代码如下(unit4-lesson43/ir_sensor.h):
class IrSensor : public Sensor {
public:
IrSensor(const std::string& name, gpio_num_t pin) : Sensor(name) {
ir_recv_ = new IRrecv(pin);
ir_recv_->enableIRIn();
}
bool ReadValue(SensorValue *value) override {
if (ir_recv_->decode()) {
struct IRData *pIrData = &ir_recv_->decodedIRData;
value->setUlongValue(pIrData->decodedRawData);
ir_recv_->resume();
// 不等于0的码为有效码,返回true。
if (value->ulongValue() != 0) {
return true;
}
}
return false;
}
private:
IRrecv *ir_recv_ = nullptr;
};
程序解读
1.IrSensor类继承Sensor类,内部采用IRremote库读取数据;
2.在构造函数中创建IRrecv实例,然后开始接收红外信号;
3.在重载在ReadValue方法里,获取红外信号数据解码填充到SensorValue实例中,数据为unsigned long类型;
遥控LED
闪烁代码如下(unit4-lesson43/my_application.cpp):
void MyApplication::OnInit() {
// 启动传感器收集数据
std::shared_ptr<Sensor> irsensor_ptr = Board::GetInstance().GetSensor(kIrSensor);
irsensor_ptr->Start(100);
}
void MyApplication::OnLoop() {
Led *led = Board::GetInstance().GetLed();
switch (ir_code_) {
case 0xF30CFF00: // 遥控器上“1”键
led->TurnOn();
break;
case 0xE718FF00:
led->TurnOff(); // 遥控器上“2”键
break;
}
delay(100);
}
bool MyApplication::OnSensorDataEvent(const std::string& sensor_name, const SensorValue& value) {
// 处理传感器数据
if (sensor_name == kIrSensor) {
Log::Info(TAG, "ir code: %02X", value.ulongValue());
ir_code_ = value.ulongValue();
return true;
}
return Application::OnSensorDataEvent(sensor_name, value);
}
程序解读
1. 在OnInit方法中使用Board类的GetSensor方法取得传感器智能指针,然后调用Start方法启动传感器数据获取,参数是数据获取间隔时间(单位ms);
2. 在OnLoop方法中检测ir_code_的值,根据值点亮LED或熄灭。ir_code_是MyApplication类的一个私有变量,用于保存红外接收的值;
3. 重载Application类的OnSensorDataEvent方法实现业务,这里根据传感器的值来设置ir_code_变量;
编译项目并上传开发板检验
作业:
实现超声波测距传感器类,用Log::Info输出测量的距离值
结构化程序设计是采用顺序结构、选择结构(IF语句)、循环结构(FOR,WHILE语句)、子程序等来进行程序设计的一种编程典范。
本小节讲解模拟量传感器使用,旋转电位器,DHT11温湿度传感器和实现自定义传感器类。
本小节讲解Sensor类及派生类、数字量传感器使用和传感器的推荐交互流程。
本小节讲解ESP32内置触摸引脚的用法,
本小节主要介绍按键信号转换、Button类及派生类、和Button交互推荐流程。
本小节主要介绍Ws2812灯珠的使用、对父类进行扩展实现自定义功能,和指针向下强制转换的使用。
本小节主要介绍RGB三色LED的使用,以及多态的具体实现。
ESP32 Arduino Framework是专门针对ESP32开发板的Arduino应用开发框架,为用户开发IOT应用、HMI应用提供一致的开发体验。
ESPConnect是一个基于现代浏览器的管理器,在你需要快速验证、调试、管理文件、检查状态的时候,它能帮你省下大量打开和切换重型工具的时间。
本文介绍两种使用TEA5767收音机模块实现FM收音机的方案,感兴趣的朋友可在此基础上实现更丰富的功能。
GPIOViewer 是一个强大的 Arduino 库,专门为 ESP32 芯片设计,可以实时监控 ESP32 芯片上的所有 GPIO 引脚状态。它可以帮助你快速直观地了解每个引脚的当前状态,例如高电平、低电平、输入、输出、中断等等。