Arduino RPM counter or tachometer

Salam..

 

Selepas beberapa  minggu figure out nak kira Revolutions Per Minute atau lebih mudah RPM, akhirnya dapat juga solution. Benda ni boleh guna untuk check RPM benda yang berpusing macam kipas.

So barang2 adalah seperti berikut:

  1. Arduino Uno R3 (boleh guna variant lain juga)
  2. DFRobot LCD Keypad shield – paling mudah sebab aku malas nak wirekan LCD. serabut otak
  3. Hall Effect Sensor – Rujuk sub point di bawah
  4. Wire secukup rasa
  5. Magnet <- penting untuk test
  6. Cordless drill – untuk test

Hall Effect Sensor

Untuk Hall Effect Sensor ni aku guna A3144 (marking pada body ialah 44E 638). Datasheet boleh download sini .

kaki-hes 1 = VCC , 2 = GROUND, 3 = SIGNAL

sensor-300x221 Connection macam tu, US1881 tu pun sejenis Hall Effect Sensor

Untuk application pada benda yang banyak noise macam enjin kereta / motor, kena letak capasitor seperti di bawah.
a3144_1-500x500

 

DFRObot LCD Keypad Shield

350px-arduino_shield8 600px-arduino_shield9

pinshield
Bila attached keypad shield ni pada arduino, pin Signal dari Hall Effect Sensor connect ke Pin2 keypad shield.  Pasaipa Pin2 ? Sebab ada kaitan dengan pin no 2 pada Uno iaitu Interupt. Refer bawah:
dvkqu Arduino Uno ada dua interupt iaitu INT0 pin2 dan INT1 pin3

 

Coding
/*
  RPM meter code (tested on device rotating at 10,000 rpm)
  rev.001
  * using a hall effect sensor
  http://www.adafruit.com/index.php?main_page=product_info&cPath=35&products_id=158
  * using a parallel LCD with
  LiquidCrystal Library
  http://www.ladyada.net/learn/lcd/charlcd.html
  http://www.arduino.cc/en/Tutorial/LiquidCrystal
  with pins 7,8,9,10,11,12
*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // aku sesuaikan dengan LCD keypad shield asal ialah 8, 9, 4, 5, 6, 7
// read the hall effect sensor on pin 2
const int hallPin=2; // <- ni yang interrupt tu
const unsigned long sampleTime=1000;
const int maxRPM = 250; //asal 10200 – boleh ubah nak letak max berapa. akan efek kepada bar graph

void setup()
{
  pinMode(hallPin,INPUT);
  Serial.begin(9600);
  // set up the LCD’s number of rows and columns:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print(“initializing”);
  delay(1000);
  lcd.clear();
}

void loop()
{
  delay(100);
  int rpm=getRPM();
  lcd.clear();
  displayRPM(rpm);
  displayBar(rpm);
}
 
int getRPM()
{
  // sample for sampleTime in millisecs
  int kount=0;
  boolean kflag=LOW;
  unsigned long currentTime=0;
  unsigned long startTime=millis();
  while (currentTime<=sampleTime)
  {
    if (digitalRead(hallPin)==HIGH)
    {
      kflag=HIGH;
    }
    if (digitalRead(hallPin)==LOW && kflag==HIGH)
    {
      kount++;
      kflag=LOW;
    }
    currentTime=millis()-startTime;
  }
  int kount2rpm = int(60000./float(sampleTime))*kount;
  return kount2rpm;
}
    
void displayRPM(int rpm)
{
  lcd.clear();
  // set the cursor to column 0, line 1
  lcd.setCursor(0, 0);
  // print the number of seconds since reset:
  lcd.print(rpm,DEC);
  lcd.setCursor(7,0);
  lcd.print(“RPM”);
}

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);
      }
  }
}

Sumber RAW boleh dapat sini : https://sites.google.com/site/measuringstuff/more-sensor-examples

Accurate ke tak RPM tu, lain hari aku cek. Janji sekarang dapat reading dan show pada LCD.

Semua gambar yang tiada watermark bukanlah kepunyaan aku. Diambil daripada rujukan dibawah. So copyright under dorang.

Reference / Rujukan:
1. http://www.r-site.net/?at=//op%5B@id=%273038%27%5D&lang=en
2. http://geekmatic.in.ua/sensors/A3144
3. https://forum.arduino.cc/index.php?topic=260783.0
4. https://arduino.stackexchange.com/questions/14407/use-all-pins-as-digital-i-o
5. https://sites.google.com/site/measuringstuff/more-sensor-examples

 

 

 

Leave a comment

Your email address will not be published. Required fields are marked *