//--------------------------------------------------------------
#include "LiquidCrystal_I2C.h"
#include "PWM.h"
#define PWM 9 // PIN PWM
#define BUP A3 // PIN TOMBOL UP
#define BDN A2 // PIN TOMBOL DOWN
#define MAX_RPM 12000 // 200 RPM MAKS
char lcdBuff[17]; // Buffer Sprintf
int frequency = 50; // Nilai FQ
int rpm = 0; // Nilai RPM
int last_rpm; // Nilai terakhir RPM
LiquidCrystal_I2C lcd(0x27, 16, 2);
//--------------------------------------------------------------
void setup() {
Serial.begin(9600); // Serial ke PC
lcd.begin(); // LCD Int
pinMode(PWM, OUTPUT); // PWM OUTPUT
pinMode(BUP, INPUT_PULLUP); // TOMBOL INPUT INTERNAL
pinMode(BDN, INPUT_PULLUP); // TOMBOL INPUT INTERNAL
// Initialisasi kecuali TIMER0
// keperluan delay(), dan millis()
InitTimersSafe();
SetPinFrequencySafe(PWM, frequency);
}
//--------------------------------------------------------------
void loop() {
// Tombol
if (digitalRead(BUP) == LOW) { // TOMBOL UP DITEKAN
delay(10);
rpm = rpm + 10;
if (rpm > 12000) rpm = 12000;
}
//
else if (digitalRead(BDN) == LOW) { // TOMBOL DOWN DITEKAN
delay(10);
rpm = rpm - 10;
if (rpm < 0) rpm = 0;
}
if (rpm != last_rpm) {
frequency = map(rpm, 0, MAX_RPM, 0, MAX_RPM / 60);
SetPinFrequencySafe(PWM, frequency); // SET FQ
last_rpm = rpm; // Update Last_RPM
// DEBUG SERIAL
Serial.print(F("RPM: "));
Serial.print(rpm);
Serial.print(F(", FREQUENCY: "));
Serial.println(frequency);
}
// SET Duty Cycle 50% agar sinyal kotak
if (rpm == 0) pwmWrite(PWM, 0); // Jika RPM 0 = OFF
else pwmWrite(PWM, 127); // 50% DC
// Print LCD
lcd.setCursor(0, 0);
lcd.print("INJECTOR TESTER!");
sprintf(lcdBuff, " %05i RPM ", rpm);
lcd.setCursor(0, 1);
lcd.print(lcdBuff);
}
//--------------------------------------------------------------