hi, I am having problems with my sound sensor. after DFPlayer plays the sound 2 or 3 times the sound sensor cannot receive the analog signal. I use 5v from Arduino Uno for my DFPlayer power supply. I didn't use a resistor, does that matter?
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
// Inisialisasi LCD pada alamat I2C 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Gunakan SoftwareSerial untuk DFPlayer Mini
const int DFPlayer_RX = D5; // Pin RX pada DFPlayer Mini
const int DFPlayer_TX = D6; // Pin TX pada DFPlayer Mini
SoftwareSerial mySerial(DFPlayer_RX, DFPlayer_TX);
DFRobotDFPlayerMini myDFPlayer;
const int sensorPin = A0; // Pin sensor suara
const int sampleWindow = 50; // Window sampling dalam ms
unsigned int sample;
bool isPlaying = false; // Status pemutaran DFPlayer
unsigned long lastPlayTime = 0; // Waktu terakhir DFPlayer dimainkan
const unsigned long playInterval = 5000; // Interval antar pemutaran suara (ms)
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Decibel Meter");
delay(2000);
lcd.clear();
Serial.begin(115200);
// Inisialisasi DFPlayer
mySerial.begin(9600);
if (!myDFPlayer.begin(mySerial)) {
lcd.print("DFPlayer Error");
while (true);
}
myDFPlayer.setTimeOut(500);
myDFPlayer.volume(30);
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
}
void loop() {
unsigned long startMillis = millis();
unsigned int signalMax = 0;
unsigned int signalMin = 1023;
// Sampling sinyal
while (millis() - startMillis < sampleWindow) {
sample = analogRead(sensorPin);
if (sample < 1024) {
if (sample > signalMax) {
signalMax = sample;
} else if (sample < signalMin) {
signalMin = sample;
}
}
}
// Hitung nilai peak-to-peak dan konversi ke desibel
int peakToPeak = signalMax - signalMin;
int dB = map(peakToPeak, 20, 900, 35, 70);
// Tampilkan nilai di LCD
lcd.setCursor(0, 0);
lcd.print("Loudness: ");
lcd.print(dB);
lcd.print(" dB");
lcd.setCursor(0, 1);
if (dB >= 35 && dB <= 45) {
lcd.print("Level: Tenang ");
} else if (dB >= 46 && dB <= 55) {
lcd.print("Level: Sedang ");
} else if (dB >= 56 && dB <= 60) {
lcd.print("Level: Bising ");
} else if (dB >= 61 && dB <= 90) {
lcd.print("Level: Melampaui");
// Mainkan suara jika interval waktu terpenuhi
if (!isPlaying && millis() - lastPlayTime > playInterval) {
myDFPlayer.play(1);
isPlaying = true;
lastPlayTime = millis();
}
} else {
lcd.print("Level: Unknown ");
}
// Reset status isPlaying setelah interval selesai
if (isPlaying && millis() - lastPlayTime > playInterval) {
isPlaying = false;
}
// Debugging
Serial.print("Peak-to-Peak: ");
Serial.println(peakToPeak);
Serial.print("Desibel: ");
Serial.println(dB);
delay(50); // Non-blocking kecil untuk kestabilan pembacaan sensor
}
