Advertisement
Guest User

rata2 per 200ms di 1 detik

a guest
Feb 16th, 2025
10
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.92 KB | None | 0 0
  1. const int pulsePin = D1; // Pin output untuk gelombang kotak (D1 = GPIO5)
  2. const int readPin = D2; // Pin input untuk membaca sinyal sensor (D2 = GPIO4)
  3. volatile unsigned int pulseCount = 0; // Jumlah pulsa yang dihitung
  4.  
  5. unsigned long previousMillis = 0; // Waktu sebelumnya untuk interval pengukuran
  6. const unsigned long sampleInterval = 200; // Interval sampling (200 ms)
  7. const unsigned long rpmInterval = 1000; // Interval menampilkan RPM (1 detik)
  8.  
  9. // Buffer untuk menyimpan RPM dari beberapa sampel (5 sampel dalam 1 detik)
  10. const int bufferSize = 5; // Jumlah sampel dalam 1 detik (1000 ms / 200 ms = 5)
  11. float rpmBuffer[bufferSize]; // Array untuk menyimpan RPM
  12. int bufferIndex = 0; // Indeks buffer
  13.  
  14. // Interrupt Service Routine (ISR) untuk menghitung pulsa
  15. void ICACHE_RAM_ATTR countPulse() {
  16. static bool lastState = HIGH; // Untuk mendeteksi falling edge
  17. bool currentState = digitalRead(readPin);
  18.  
  19. if (lastState == HIGH && currentState == LOW) {
  20. pulseCount++;
  21. }
  22. lastState = currentState;
  23. }
  24.  
  25. void setup() {
  26. // Set pulsePin sebagai output
  27. pinMode(pulsePin, OUTPUT);
  28.  
  29. // Set readPin sebagai input dengan pull-up internal
  30. pinMode(readPin, INPUT_PULLUP);
  31.  
  32. // Inisialisasi komunikasi serial
  33. Serial.begin(9600);
  34.  
  35. // Pasang interrupt pada readPin (trigger pada CHANGE edge)
  36. attachInterrupt(digitalPinToInterrupt(readPin), countPulse, CHANGE);
  37. }
  38.  
  39. void loop() {
  40. // Generate gelombang kotak dengan duty cycle 50%
  41. digitalWrite(pulsePin, HIGH);
  42. delay(100); // HIGH selama 100 ms
  43. digitalWrite(pulsePin, LOW);
  44. delay(100); // LOW selama 100 ms
  45.  
  46. // Hitung RPM setiap 200 ms
  47. unsigned long currentMillis = millis();
  48. if (currentMillis - previousMillis >= sampleInterval) {
  49. previousMillis = currentMillis;
  50.  
  51. // Pastikan akses ke pulseCount aman dari interrupt
  52. noInterrupts();
  53. unsigned int localPulseCount = pulseCount;
  54. pulseCount = 0;
  55. interrupts();
  56.  
  57. // Hitung RPM untuk interval 200 ms
  58. float rpm = (localPulseCount * 60.0) / (sampleInterval / 1000.0);
  59.  
  60. // Simpan RPM ke dalam buffer
  61. rpmBuffer[bufferIndex] = rpm;
  62. bufferIndex = (bufferIndex + 1) % bufferSize;
  63.  
  64. // Debug jumlah pulsa terdeteksi dan RPM per 200 ms
  65. Serial.print("Pulses detected: ");
  66. Serial.print(localPulseCount);
  67. Serial.print(", RPM (200ms): ");
  68. Serial.println(rpm);
  69.  
  70. // Cek apakah buffer sudah penuh (setelah 5 sampel = 1 detik)
  71. if (bufferIndex == 0) { // Jika buffer sudah penuh, hitung rata-rata RPM
  72. float totalRPM = 0;
  73. for (int i = 0; i < bufferSize; i++) {
  74. totalRPM += rpmBuffer[i]; // Jumlahkan semua RPM dalam buffer
  75. }
  76.  
  77. // Hitung rata-rata RPM
  78. float averageRPM = totalRPM / bufferSize;
  79.  
  80. // Cetak nilai RPM rata-rata ke Serial Monitor
  81. Serial.print("Average RPM (1 second): ");
  82. Serial.println(averageRPM);
  83. }
  84. }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement