魔法翻书器:使用 ESP8266 和红外传感器实现隔空翻页

“魔法翻书器”是一款基于 ESP8266 与红外传感器的隔空翻页装置。通过双路红外接收头识别挥手方向,自动发送 NEXT/PREV 指令,电脑端 Python 脚本模拟键盘翻页。无需摄像头、成本低、响应快,适用于 PPT 或 PDF 演示,实现卫生、便捷的无接触交互体验。
1
安装串口驱动

首先需要安装CK341SER驱动程序,以支持后续的硬件连接与调试。
2
设置ESP8266下载地址




12
在Arduino IDE的开发板管理器中,添加ESP8266的下载源地址:http://arduino.esp8266.com/stable/package_esp8266com_index.json。
3
添加电阻





123
使用一个红外发射管(IR LED),其长引脚为正极(阳极),短引脚为负极(阴极)。请在正极引脚上串联一个 100Ω 的限流电阻,再连接至微控制器的输出引脚;负极直接接地(GND)。
4
连接电路




12
第一张图是整体接线示意图,各元件与 ESP8266(NodeMCU)的连接关系如下:
- 红外发射管:
- 正极(长引脚)通过一个 100Ω 限流电阻连接至 ESP8266 的 D1 引脚,负极(短引脚)直接连接至 GND。
- 红外接收模块(HX1838):
- 每个模块共有三个引脚,从靠近字母 “S” 的一侧开始,依次为:信号(S)、正极(VCC)、负极(GND)。
- 第一个接收模块的 信号引脚接 D5,VCC 接 3.3V,GND 接 GND。
- 第二个接收模块的 信号引脚接 D6,VCC 接 3.3V,GND 接 GND。
5
Arduino代码

/*
* 魔法翻书器
*/
const int IR_EMIT = 5; // D1
const int LEFT_SENSOR = 14; // D5
const int RIGHT_SENSOR = 12; // D6
// 防抖与稳定参数
const unsigned long DEBOUNCE_MS = 600; // 增加至 600ms,避免快速挥手误判
const unsigned long VALID_HOLD_MS = 100; // 遮挡需持续至少 100ms 才视为有效
void setup() {
Serial.begin(115200);
pinMode(IR_EMIT, OUTPUT);
pinMode(LEFT_SENSOR, INPUT);
pinMode(RIGHT_SENSOR, INPUT);
digitalWrite(IR_EMIT, LOW);
Serial.println("魔法翻书器启动成功!请在暗处测试");
}
// 持续发射 38kHz
void emit38kHz() {
digitalWrite(IR_EMIT, HIGH);
delayMicroseconds(13);
digitalWrite(IR_EMIT, LOW);
delayMicroseconds(13);
}
// 带去抖的稳定读取
bool readStableState(int pin, bool targetState) {
static unsigned long lastChange[2] = {0, 0}; // [0]=left, [1]=right
int index = (pin == LEFT_SENSOR) ? 0 : 1;
if (digitalRead(pin) == targetState) {
if (millis() - lastChange[index] >= VALID_HOLD_MS) {
return true;
}
} else {
lastChange[index] = millis(); // 重置计时
}
return false;
}
void loop() {
emit38kHz();
// 读取稳定后的遮挡状态(遮挡 = HIGH)
bool leftBlocked = readStableState(LEFT_SENSOR, HIGH);
bool rightBlocked = readStableState(RIGHT_SENSOR, HIGH);
static bool wasLeftBlocked = false;
static bool wasRightBlocked = false;
static unsigned long lastFlipTime = 0;
// 严格的方向判断逻辑
// 左→右:左已遮 + 右刚遮(且左仍遮)
if (wasLeftBlocked && !wasRightBlocked && rightBlocked && leftBlocked) {
if (millis() - lastFlipTime > DEBOUNCE_MS) {
Serial.println("NEXT");
lastFlipTime = millis();
}
}
// 右→左:右已遮 + 左刚遮(且右仍遮)
else if (wasRightBlocked && !wasLeftBlocked && leftBlocked && rightBlocked) {
if (millis() - lastFlipTime > DEBOUNCE_MS) {
Serial.println("PREV");
lastFlipTime = millis();
}
}
wasLeftBlocked = leftBlocked;
wasRightBlocked = rightBlocked;
delayMicroseconds(50); // 保持高频发射
}
6
python代码




12
使用Python连接电脑串口来控制PPT的翻页。
在设备管理器中找到端口来查看ESP88266占用的端口号,快捷方式为win+X。
"""
魔法翻书器 - 电脑端控制脚本
接收 ESP8266 的 NEXT/PREV 指令,模拟键盘翻页
"""
import sys
from pynput.keyboard import Key, Controller
from serial import Serial, SerialException
# === 配置 ===
COM_PORT = "COM9" # ← 改为你的 COM 号
BAUD_RATE = 115200
# 初始化
keyboard = Controller()
try:
ser = Serial(COM_PORT, BAUD_RATE, timeout=1)
print(f" 已连接 {COM_PORT},挥手即可翻页(Ctrl+C 退出)")
except SerialException as e:
print(f"串口错误: {e}\n请检查 COM 号、USB 线及 Arduino 串口是否关闭")
sys.exit(1)
# 主循环
try:
while True:
line = ser.readline().decode('utf-8', errors='ignore').strip()
if line == "NEXT":
keyboard.press(Key.page_down); keyboard.release(Key.page_down)
print("→ 下一页")
elif line == "PREV":
keyboard.press(Key.page_up); keyboard.release(Key.page_up)
print("← 上一页")
except KeyboardInterrupt:
ser.close()
print("已退出")
7
实现效果
0
0
0
qq空间
微博
复制链接
分享 更多相关项目
猜你喜欢
评论/提问(已发布 0 条)
0