#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define NTC_PIN 34 // Pin ADC terhubung ke sensor NTC
#define SERIES_RESISTOR 10000.0 // Nilai resistor seri pada sensor NTC
#define FAN_PIN 4 // Pin yang terhubung ke pin tachometer kipas
#define INTERRUPT_PIN FAN_PIN // Gunakan pin yang mendukung interrupt
#define PULSES_PER_REVOLUTION 2 // Jumlah pulsa per satu putaran kipas
#define UPDATE_INTERVAL 1000 // Waktu dalam milidetik untuk menghitung RPM
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C dan ukuran layar 20x4
volatile unsigned long pulseCount = 0;
volatile unsigned long lastTime;
float rpm = 0;
void IRAM_ATTR handleInterrupt() {
pulseCount++;
}
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // Konfigurasi pin SDA (GPIO 21) dan SCL (GPIO 22) untuk komunikasi I2C
lcd.init(); // Inisialisasi layar LCD
lcd.backlight(); // Nyalakan backlight
pinMode(FAN_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), handleInterrupt, RISING);
lastTime = millis();
}
void loop() {
unsigned long now = millis();
if (now - lastTime >= UPDATE_INTERVAL) {
detachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN));
rpm = (pulseCount / PULSES_PER_REVOLUTION) * (60000 / (now - lastTime));
pulseCount = 0;
lastTime = now;
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), handleInterrupt, RISING);
float ntcTemperature = getNTCTemperature();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("NTC Temp: ");
lcd.print(ntcTemperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("RPM: ");
lcd.print(rpm);
Serial.print("NTC Temp: ");
Serial.print(ntcTemperature);
Serial.print(" C | RPM: ");
Serial.println(rpm);
}
// Lanjutkan operasi lainnya di loop() jika diperlukan
}
float getNTCTemperature() {
int sensorValue = analogRead(NTC_PIN);
// Konversi nilai ADC ke resistansi (menggunakan hukum pembagi tegangan)
float resistance = SERIES_RESISTOR / ((4095.0 / sensorValue) - 1.0);
// Menggunakan formula Steinhart-Hart untuk menghitung suhu
float steinhart;
steinhart = resistance / 10000; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= 3950.0; // 1/B * ln(R/Ro)
steinhart += 1.0 / (25 + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invers dari rumus Steinhart-Hart
steinhart -= 273.15; // Konversi ke Celcius
return steinhart;
}