【ESP32 C++教程】Unit4-3 红外接收和遥控

本小节主要讲解红外接收和遥控器件,以及遥控操作LED。

在我们身边红外遥控随处可见,如电视遥控、空调遥控、风扇遥控等等,具有使用便捷、成本低等特点。

红外遥控器用于红外信号的调制和发射,红外接收器件用于信息的接收和解调。

红外接收管是直接将电能转化为近红外光的器件,属于二极管类。红外接收头是一种接收、放大、解调装置,内部集成电路已完成解调,输出是数字信号。

【ESP32 C++教程】Unit4-3 红外接收和遥控
红外接收
【ESP32 C++教程】Unit4-3 红外接收和遥控
红外遥控
红外接收和遥控模块详情


示例:遥控LED

从 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输出测量的距离值

- 本文由用户 老张 发布,文中观点仅代表作者本人,不代表本站立场。
- 如需转载,请联系作者;如有侵权,请联系本站处理。

01-25   阅读(319)   评论(0)
 标签: 创客电子 ESP32 ESP32-ArduinoFx

涨知识
递归

递归简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

评论:
相关文章
MimiClaw应用与开发教程1:部署和测试

MimiClaw‌ 是一款基于 ‌ESP32-S3‌ 芯片的超轻量级AI助手,适合嵌入式AI与物联网开发者快速部署本地化AI代理。本系列教程基于MimiClaw的Arduino移植版本进行讲解,小节主要讲解部署和测试。


ESP32扫描wifi 热点列表

就像我们用手机打开WiFi功能后可以浏览附近的可用WiFi。要将手机连接到热点,通常需要打开Wi-Fi设置应用程序,列出可用的网络,然后选择所需的热点。然后输入密码(或不输入密码),可以使用ESP32进行相同的操作。


MimiClaw 配置飞书机器人和添加硬件控制技能

本文本介绍配置飞书机器人为MimiClaw的一个输入/输出端,和添加一个控制WS2812与LED的控制技能。


ESP32-S3 部署 MimicLaw 完整教程:从零到成功调用 DeepSeek

一块 30 块钱的开发板 + 一个大模型 API,就能做出可以听懂人话的智能硬件。 本文记录完整安装过程和踩坑经验,确保你跟着做就能跑通。


MimiClaw 架构全解析,把 “智能龙虾” 跑在 ESP32 上

本文将从手绘架构图入手,逐层拆解 MimiClaw 的分层设计、核心模块、数据流转与底层实现,带你解剖这只“智能虾”的技术骨架,看懂在 C 语言加持下,AI 智能体如何以可穿戴设备的形态,在你身边稳稳运行、离线服务、主动响应。


如何用 platform.local.txt 深度定制 ESP32 编译流程?

本文介绍如何在不脱离 ArduinoIDE 可视化开发的前提下,通过一个名为 platform.local.txt 的小文件,实现对 ESP32 编译流程的精准控制。


优化Arduino-ESP32程序体积

本文将系统分析程序体积增长的五大根源,并提供经过验证的优化方案,帮助减小固件大小。


开发ESP32大模型AI语音助手-从软件到硬件

本文所DIY的语音助手设备端使用的是MicroPython、服务端是Python,对于很多开发者来说MicroPython入门没难度。


【ESP32 C++教程】Unit10-2:音频录制

本小节使用音频开发框架实现一个音频录制到文件的示例。


ESP32 I2S 接口深度解析:从时序、格式到 ESP-IDF 驱动实战

I2S协议通过BCLK、LRCLK和DATA三线精准传输音频数据,但时序边沿、帧格式、时钟源等细节常引发噪声或断连。本文详解ESP32的I2S实现,从协议原理到ESP-IDF v5.x代码配置,助你避开常见陷阱,确保音频稳定传输。