/* Program Tacho Meter dengan Incremental Encoder
Jalankan program dan simulasikan dengan mengClick tanda putar kiri
pada sensor sebanyak 5 kali, tunggu hingga tampil 300rpm (5x60) dan
Arah ke kanan.
Tunggu hingga tampil Tacho Meter
Click tanda putar kiri 3 kali, tunggu hingga tampil 180 rpm dan arah kiri
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int signalPin = 34; // Clock connected here
const int DTPin = 32; // DT connected here
const int SWPin = 14; // SW connected here
volatile unsigned long pulseCount = 0;
bool Arah;
unsigned long previousMillis = 0;
const long interval = 1000; // 1 second
// Interrupt function
void IRAM_ATTR countPulse() {
pulseCount++;
Arah=digitalRead(DTPin);
}
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(signalPin, INPUT);
pinMode(DTPin, INPUT);
pinMode(SWPin, INPUT);
lcd.setCursor(2,0);
lcd.print("TACHO METER");
attachInterrupt(digitalPinToInterrupt(signalPin), countPulse, RISING);
previousMillis = millis();
}
void loop() {
attachInterrupt(digitalPinToInterrupt(signalPin), countPulse, RISING);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
detachInterrupt(digitalPinToInterrupt(signalPin));
unsigned long rpm = pulseCount * 60;
pulseCount = 0;
previousMillis = currentMillis;
lcd.clear();
if (rpm!=0){
lcd.setCursor(0, 0);
lcd.print("RPM:");
lcd.setCursor(0, 1);
lcd.print(rpm);
Serial.print("Arah =");
lcd.setCursor(8,0);
lcd.print("Arah :");
if (Arah==HIGH) {
lcd.setCursor(8,1);
lcd.print("Kiri");
Serial.println("Kiri");}
else if (Arah==LOW){
lcd.setCursor(8,1);
lcd.print("Kanan");
Serial.println("Kanan");
}
}
else if (rpm==0 ) {
lcd.clear();
lcd.setCursor(2,0);
lcd.print("TACHO METER");}
pulseCount = 0;
//noInterrupts();
unsigned long pulses = pulseCount;
//interrupts();
}
}