Arduino Nano Tachometer (Đồng hồ đo vòng tua RPM)

Mẫu Arduino Nano Tachometer dùng cảm biến IR và màn hình OLED I2C 128x64 để đo vòng tua. Có thể đọc khoảng 10k–20k RPM tùy điều kiện và chất lượng cảm biến. Kèm hướng dẫn đi dây và code.

👁️
498
Lượt Xem
❤️
20
Lượt Thích
📥
47
Lượt Tải
Cập Nhật May 01, 2026
Chi tiết
Tải xuống
Bình Luận
Khoe bản in
Remix

Mô tả

Cảnh báo: Con biến trở (potentiometer) trên một số cảm biến IR có thể nằm hơi khác vị trí. Mình dùng model của https://grabcad.com/library/hw-201-1. Nhớ kiểm tra để cái của bạn canh cho khớp.

Ngoài ra, vui lòng chỉnh biến trở của bạn theo một mức rpm đã biết. Một số lần đo có thể bị cao quá do debounce. Giảm độ nhạy xuống tới khi thấp nhất có thể.

Các chi tiết được thiết kế để dán keo cố định.

THÁO HÀN CHÂN (DESOLDER) KHỎI MÀN HÌNH OLED (gỡ cái spacer header màu đen ra sẽ dễ hơn nhiều). Hàn trực tiếp vào pad

Phần cứng (Hardware):
Arduino Nano cổng USB-C, không gắn header (mình dùng hàng Trung Quốc)

Màn hình 128X64 I2C OLED (chữ trắng, 0.96)

Cảm biến tiệm cận IR (một LED trong suốt, một LED đen.)

Đi dây (Wiring):
OUT của cảm biến IR → D2
SDA của màn hình → A4
SCL của màn hình → A5
Nối chung tất cả GND
Nối chung tất cả 5V

Code:

#include <Adafruit_SSD1306.h>
#include <Wire.h>

#define OLED_RESET -1
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);

#define PULSE_PIN      2
#define DEBOUNCE_US    10000   // debounce threshold in microseconds

volatile unsigned long pulses = 0;
volatile unsigned long lastPulseTime = 0;
unsigned long lastTime = 0;

// Interrupt Service Routine with debounce
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();
  }
}

Giấy phép

Tác phẩm này được cấp phép theo

Creative Commons — Attribution — Noncommercial — Share Alike

CC-BY-NC-SA

Yêu cầu ghi công
Remix & phái sinh Được phép
Sử dụng thương mại Không được phép

File mô hình

TẤT CẢ FILE MÔ HÌNH (2 Tập tin)
Đang tải files, vui lòng chờ...
Vui lòng đăng nhập để bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Vui lòng đăng nhập để khoe bản in của bạn.

Chưa có bản in nào được khoe. Hãy là người đầu tiên!

Remix (0)