amc2021:groupl:code:sound_detection
This is an old revision of the document!
For noise disturbance detection in the environment
This code monitors the sound intensity using an LM393 sensor connected to an Arduino UNO board. The used sensor has only a digital output. Therefore, the number of times the sensor detects a sound is summed up over a sampling time called “SAMPLE_TIME”. Then the sum called “sampleBufferValue” is printed on a Serial Monitor (laptop) and visualized with the Serial Plotter. Additionally, the code allows communication with a LED to provide a visual alarm if the “sampleBufferValue” surpasses a preset Threshold. Regarding the digital outputs, 0 means silence and 1 means noise.
Detailed explanation is given in the video tutorial
const int OUT_PIN = 12; // The OUTPUT of the sound sensor is connected to the digital pin D12 of the Arduino
const int SAMPLE_TIME = 10; // The sampling time in milliseconds, can be set differently if required
const int Threshold = 90; // Threshold on decibel value for LED switching ON, the value has been optimized with respect to the used sampling time (900 cumulative digital counts ≈ 90 dB from "Schall")
unsigned long millisCurrent; // current time
unsigned long millisLast = 0; //previous time
unsigned long millisElapsed = 0; // difference between current time and previous time (time interval)
int sampleBufferValue = 0; // initiate the sum of digital outputs over the sampling time
int led = 8; // LED on pin 4 of Arduino
int dB = 0; //initiate sound intensity dB value
void setup() {
Serial.begin(9600); //Arduino starts serial communication with baud rate 9600
pinMode(led,OUTPUT); // the LED is connected as output for alarm purpose
}
void loop() {
millisCurrent = millis(); //the current time is assigned to the dedicated variable
millisElapsed = millisCurrent - millisLast; //the elapsed time is updated
if(digitalRead(OUT_PIN) == HIGH){ //HIGH means noise
sampleBufferValue++; //increments the sum variable by 1
}
if (millisElapsed > SAMPLE_TIME) { //if the elapsed time surpasses the sampling time, print the sampleBufferValue and test threshold for alarm
dB = 0.0666 *(sampleBufferValue) + 30.223; //linear regression to calculate the decibel value based of the rough calibration of the sensor response
Serial.println(dB); // print decibel values on the Serial Monitor
Serial.print("dB"); // print sound unit decibel
if (sampleBufferValue > Threshold) { // test if the threshold is surpassed
digitalWrite(led, HIGH); //blink LED 2 ms ON and 1 ms OFF
delay(2);
digitalWrite(led, LOW);
delay(1);
}
digitalWrite(led, LOW); // the LED is turned off to be ready for the next sample
sampleBufferValue = 0; // re-initialization of the sampleBufferValue variable for the new sampling time
millisLast = millisCurrent; // update the previous time to be the start for the next sample
}
}
amc2021/groupl/code/sound_detection.1630756268.txt.gz · Last modified: 2023/01/05 14:38 (external edit)