警告:部分红外传感器上的电位器位置可能略有不同。我参考了 https://grabcad.com/library/hw-201-1. 的模型进行设计,请务必确保您的电位器位置与之对齐。
此外,建议将电位器调整至一个已知的转速值。由于去抖动处理的影响,部分读数可能会偏高。请适当降低灵敏度,直至尽可能调低为止。
各部件均设计为采用胶粘方式固定到位。
请先将 OLED 显示屏的引脚焊下(移除黑色挡板垫片后效果会好很多),随后直接焊接到对应的焊盘上。
硬件:
Arduino Nano,配备 USB-C 接口,不带排针(我使用的是国产仿品)
128×64 I2C OLED 显示屏(白色字体,0.96 英寸)
红外接近传感器(含一颗透明 LED 和一颗黑色 LED)。

接线:
红外传感器 OUT → D2
OLED 显示屏 SDA → A4
OLED 显示屏 SCL → A5
所有 GND 引脚并联连接
所有 5V 引脚并联连接
代码:
#include
#include #define OLED_RESET -1 Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET); #define PULSE_PIN 2 #define DEBOUNCE_US 10000 // 去抖动阈值,单位为微秒 volatile unsigned long pulses = 0; volatile unsigned long lastPulseTime = 0; unsigned long lastTime = 0; // 带去抖动功能的中断服务例程 void countPulse() { unsigned long now = micros(); if (now - lastPulseTime > DEBOUNCE_US) { pulses++; lastPulseTime = now; } } void setup() { pinMode(PULSE_PIN, INPUT); attachInterrupt(digitalPinToInterrupt(PULSE_PIN), countPulse, RISING); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextColor(SSD1306_WHITE); } void loop() { if (millis() - lastTime >= 1000) { noInterrupts(); unsigned long count = pulses; pulses = 0; interrupts(); unsigned int rpm = count * 60; display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.print("RPM:"); display.setTextSize(3); display.setCursor(0, 20); display.print(rpm); display.display(); lastTime = millis(); } }