Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int pulsePin = D1; // Pin output untuk gelombang kotak (D1 = GPIO5)
- const int readPin = D2; // Pin input untuk membaca sinyal sensor (D2 = GPIO4)
- volatile unsigned int pulseCount = 0; // Jumlah pulsa yang dihitung
- unsigned long previousMillis = 0; // Waktu sebelumnya untuk interval pengukuran
- const unsigned long sampleInterval = 200; // Interval sampling (200 ms)
- const unsigned long rpmInterval = 1000; // Interval menampilkan RPM (1 detik)
- // Buffer untuk menyimpan RPM dari beberapa sampel (5 sampel dalam 1 detik)
- const int bufferSize = 5; // Jumlah sampel dalam 1 detik (1000 ms / 200 ms = 5)
- float rpmBuffer[bufferSize]; // Array untuk menyimpan RPM
- int bufferIndex = 0; // Indeks buffer
- // Interrupt Service Routine (ISR) untuk menghitung pulsa
- void ICACHE_RAM_ATTR countPulse() {
- static bool lastState = HIGH; // Untuk mendeteksi falling edge
- bool currentState = digitalRead(readPin);
- if (lastState == HIGH && currentState == LOW) {
- pulseCount++;
- }
- lastState = currentState;
- }
- void setup() {
- // Set pulsePin sebagai output
- pinMode(pulsePin, OUTPUT);
- // Set readPin sebagai input dengan pull-up internal
- pinMode(readPin, INPUT_PULLUP);
- // Inisialisasi komunikasi serial
- Serial.begin(9600);
- // Pasang interrupt pada readPin (trigger pada CHANGE edge)
- attachInterrupt(digitalPinToInterrupt(readPin), countPulse, CHANGE);
- }
- void loop() {
- // Generate gelombang kotak dengan duty cycle 50%
- digitalWrite(pulsePin, HIGH);
- delay(100); // HIGH selama 100 ms
- digitalWrite(pulsePin, LOW);
- delay(100); // LOW selama 100 ms
- // Hitung RPM setiap 200 ms
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= sampleInterval) {
- previousMillis = currentMillis;
- // Pastikan akses ke pulseCount aman dari interrupt
- noInterrupts();
- unsigned int localPulseCount = pulseCount;
- pulseCount = 0;
- interrupts();
- // Hitung RPM untuk interval 200 ms
- float rpm = (localPulseCount * 60.0) / (sampleInterval / 1000.0);
- // Simpan RPM ke dalam buffer
- rpmBuffer[bufferIndex] = rpm;
- bufferIndex = (bufferIndex + 1) % bufferSize;
- // Debug jumlah pulsa terdeteksi dan RPM per 200 ms
- Serial.print("Pulses detected: ");
- Serial.print(localPulseCount);
- Serial.print(", RPM (200ms): ");
- Serial.println(rpm);
- // Cek apakah buffer sudah penuh (setelah 5 sampel = 1 detik)
- if (bufferIndex == 0) { // Jika buffer sudah penuh, hitung rata-rata RPM
- float totalRPM = 0;
- for (int i = 0; i < bufferSize; i++) {
- totalRPM += rpmBuffer[i]; // Jumlahkan semua RPM dalam buffer
- }
- // Hitung rata-rata RPM
- float averageRPM = totalRPM / bufferSize;
- // Cetak nilai RPM rata-rata ke Serial Monitor
- Serial.print("Average RPM (1 second): ");
- Serial.println(averageRPM);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement