Fidget Spinner RPM Counter





ABOUT THIS PROJECT

Project tutorial by Andriy Baranov
Hi everyone! This is my next project, Fidget Spinner RPM Counter or Arduino Tachometer with Hall-Effect Sensor.

1: Requirements

Parts Required:
  • Fidget Spinner
  • Neodymium magnet
  • Arduino Uno
  • LED + resistor 220 Ohm
  • Hall-Effect Sensor - a3144
  • resistor 10 k
  • Wires
  • Breadboard
  • LCD 1602

2: Hall-Effect Sensor

Using Hall-Effect Sensor we can measure the speed of rotation. I used the Hall-Effect Sensor - a3144.
RPM (Revolutions pe minute) – the number of revolutions per minute. Revolutions per minute – a unit of measurement of rotational speed: the number of complete rotations made by the body (fidget spinner, wheel etc.) around a fixed axis. Used to describe the speed of rotation of the mechanical components in the mechanisms and machines.

3: How does it work?

To measure the speed of rotation on the Fidget Spinner must be mounted a part of the neodymium magnet that affects the Hall sensor after each complete turn of the Spinner.

4: Indication

The presence of a magnetic field is indicated on the LED.
LCD 1602 indicates current RPM, maximum RPM, and tachometer bar (from 0 up to 1260rpm). 1260 rpm is my personal record
Also you can use Arduino IDE serial port.

5: Notes

I used a Hall-Effect Sensor A3144 and it worked well just connected to the pin 2 of Arduino Uno board. Also I tried to use a Hall-Effect Arduino module just like this one and it worked very bad.
I recommend not using this module because of false harmonics.
Thank you all! Please, write in comments about your Fidget Spinner RPMs!

Code: 

#include <LiquidCrystal.h> LiquidCrystal lcd(13,12,11,10,9,8); const int hallSensorPin = 2; // connect the hall effect sensor on pin 2 const unsigned long sampleTime = 1000; const int maxRPM = 1260; // maximum RPM for LCD Bar int rpmMaximum = 0; void setup() { pinMode(hallSensorPin,INPUT); Serial.begin(9600); lcd.begin(16, 2); lcd.print("Initializing"); delay(1000); lcd.clear(); } void loop() { delay(100); int rpm = getRPM(); if (rpm > rpmMaximum) rpmMaximum = rpm; lcd.clear(); displayRPM(rpm); displayBar(rpm); } int getRPM() { int count = 0; boolean countFlag = LOW; unsigned long currentTime = 0; unsigned long startTime = millis(); while (currentTime <= sampleTime) { if (digitalRead(hallSensorPin) == HIGH) { countFlag = HIGH; } if (digitalRead(hallSensorPin) == LOW && countFlag == HIGH) { count++; countFlag=LOW; } currentTime = millis() - startTime; } int countRpm = int(60000/float(sampleTime))*count; return countRpm; } void displayRPM(int rpm) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(rpm,DEC); lcd.setCursor(7,0); lcd.print(rpmMaximum, DEC); lcd.setCursor(13,0); lcd.print("MAX"); Serial.print("RPM = "); Serial.print(rpm); Serial.print(" MAX RPM = "); Serial.println(rpmMaximum); } void displayBar(int rpm) { int numOfBars=map(rpm,0,maxRPM,0,15); lcd.setCursor(0,1); if (rpm!=0) { for (int i=0; i<=numOfBars; i++) { lcd.setCursor(i,1); lcd.write(1023); } } }

Comments