-
Notifications
You must be signed in to change notification settings - Fork 0
/
Noise_Meter.ino
77 lines (67 loc) · 2.1 KB
/
Noise_Meter.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
int redled = 10;
int greenled = 8;
int blueled = 9;
const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;
void setup()
{
Serial.begin(9600);
pinMode(redled, OUTPUT);// set the pin with red LED as “output”
pinMode(greenled, OUTPUT); // set the pin with yellow LED as “output”
pinMode(blueled, OUTPUT); // set the pin with green LED as “output”
}
void loop()
{
unsigned long startMillis= millis(); // Start of sample window
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
// collect data for 50 mS
while (millis() - startMillis < sampleWindow)
{
sample = analogRead(0);
if (sample < 1024) // toss out spurious readings
{
if (sample > signalMax)
{
signalMax = sample; // save just the max levels
}
else if (sample < signalMin)
{
signalMin = sample; // save just the min levels
}
}
}
peakToPeak = signalMax - signalMin; // max - min = peak-peak amplitude
double volts = (peakToPeak * 5.0) / 1024; // convert to volts
Serial.println(volts);
delay(10);
/* Calibration was made with white noise and a Digital Sound Level Meter (fast trigger).
0.3v = 50 dBa
0.7v = 65 dBa
3.0v = 85 dBa
3.3v = 90 dBa
Those are starting values, you may need to calibrate your electret microphone.
Make sure the adjustable gain potentiometer on the MAX4466 microphone is turned fully clockwise.
*/
{
if (volts < 1.0) {
digitalWrite(blueled, HIGH); // When noise level is low.
}
else {
digitalWrite(blueled, LOW);
}
if (volts > 1.0 && volts < 3) {
digitalWrite(greenled, HIGH); // When noise level is acceptable.
}
else {
digitalWrite(greenled, LOW);
}
if (volts >= 3.0) {
digitalWrite(redled, HIGH); // When ear protection is needed.
}
else {
digitalWrite(redled, LOW);
}
}
}