-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path08_example_2.ino
More file actions
93 lines (77 loc) · 2.98 KB
/
08_example_2.ino
File metadata and controls
93 lines (77 loc) · 2.98 KB
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Arduino pin assignment
#define PIN_LED 9
#define PIN_TRIG 12 // sonar sensor TRIGGER
#define PIN_ECHO 13 // sonar sensor ECHO
// configurable parameters
#define SND_VEL 346.0 // sound velocity at 24 celsius degree (unit: m/sec)
#define INTERVAL 25 // sampling interval (unit: msec)
#define PULSE_DURATION 10 // ultra-sound Pulse Duration (unit: usec)
#define _DIST_MIN 100.0 // minimum distance to be measured (unit: mm)
#define _DIST_MAX 300.0 // maximum distance to be measured (unit: mm)
#define TIMEOUT ((INTERVAL / 2) * 1000.0) // maximum echo waiting time (unit: usec)
#define SCALE (0.001 * 0.5 * SND_VEL) // coefficent to convert duration to distance
unsigned long last_sampling_time; // unit: msec
void setup() {
// initialize GPIO pins
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_TRIG, OUTPUT); // sonar TRIGGER
pinMode(PIN_ECHO, INPUT); // sonar ECHO
digitalWrite(PIN_TRIG, LOW); // turn-off Sonar
// initialize serial port
Serial.begin(57600);
}
void loop() {
float distance;
// wait until next sampling time
if (millis() < (last_sampling_time + INTERVAL))
return;
last_sampling_time = millis(); // update time
// measure distance
distance = USS_measure(PIN_TRIG, PIN_ECHO);
int duty; // LED brightness (0 = max bright, 255 = off)
if ((distance == 0.0) || (distance > _DIST_MAX)) {
distance = _DIST_MAX + 10.0;
duty = 255; // LED OFF
} else if (distance < _DIST_MIN) {
distance = _DIST_MIN - 10.0;
duty = 255; // LED OFF
} else {
// Brightness control
if (distance <= 100 || distance >= 300) {
duty = 255; // minimum brightness (off)
} else if (distance == 200) {
duty = 0; // maximum brightness
} else if (distance == 150 || distance == 250) {
duty = 128; // 50% brightness
} else {
// Smooth brightness control using map()
if (distance < 200) {
duty = map(distance, 100, 200, 255, 0); // brighter as distance → 200
} else {
duty = map(distance, 200, 300, 0, 255); // dimmer as distance → 300
}
}
}
// apply brightness to LED
analogWrite(PIN_LED, duty);
// output distance + duty cycle for debugging
Serial.print("Min:"); Serial.print(_DIST_MIN);
Serial.print(", distance:"); Serial.print(distance);
Serial.print(", Max:"); Serial.print(_DIST_MAX);
Serial.print(", duty:"); Serial.println(duty);
}
/* =====================================================
Function to measure distance using Ultrasonic Sensor
===================================================== */
float USS_measure(int pin_trig, int pin_echo) {
unsigned long duration;
// Generate trigger pulse
digitalWrite(pin_trig, HIGH);
delayMicroseconds(PULSE_DURATION);
digitalWrite(pin_trig, LOW);
// Wait for echo pulse
duration = pulseIn(pin_echo, HIGH, TIMEOUT);
// convert duration (usec) to distance (mm)
float distance = duration * SCALE;
return distance;
}