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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
| /*
дальномер во время мигания отображает реальную дальность измерения
(допустим прибор ставится в узкий пролет (до 1 метра) - вкл питание,
настроил макс дальность срабатывания ((это желтый свет ргб светодиода)
т.е. я установил потенциометром определенную дистанцию (например 1 м, наглаз)
всё что дальше 1 м - не регистрируется (устройство не реагирует),
всё что ближе отображается желтым ргб (а после 30 сек и замыкает реле).
Первые 30 сек реле не реагирует на возникновение препятствий,
а после, при возникновении иных, замыкается.
Тоесть первые 30 секунд необходимы для комфортной установки устройства,
а после 30 секунд устройство работает в нормальном режиме (преграда - замыкает реле)
*/
////// выводы подключения компонентов //////////
const int potPin = A0;
const int echoPin = 9;
const int trigPin = 8;
const int relay = 15; /// A1
const int g_led = 16; /// A2
const int b_led = 17; /// A3
const int led = 18; /// A4
///////// переменные //////////////////
long period = 300; /// период снятия показаний с дальномера 300 - 0.3 сек
long blink_period_0 = 1000; /// период миганий кр. светодиода в начале 1000 - 1 сек
long blink_period_1 = 500; /// период миганий кр. светодиода в конце 500 - 0.5 сек
long relay_period = 3000; /// время работы реле 3000 - 3 сек
unsigned long us_millis = 0;
unsigned long time = 0;
unsigned long relay_time = 0;
int distance = 0;
int distance_control = 0;
int counter = 0;
byte state = 0;
byte led_state = 0;
byte blink_state = 0;
void setup()
{
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(g_led, OUTPUT);
pinMode(b_led, OUTPUT);
pinMode(led, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(relay, HIGH);
}
void loop()
{
Serial.print(distance_control);
Serial.print(" ");
Serial.print(distance);
Serial.print(" ");
Serial.print(blink_state);
Serial.print(" ");
Serial.println(counter);
////////////// работа дальномера //////////////////////
if (millis() - us_millis >= period)
{
DISTANCE();
us_millis = millis();
}
/////// определяем предельное расстояние только в первые 30 сек ////////////////////
if (blink_state < 2)
{
distance_control = map(analogRead(potPin), 0, 1023, 10, 200);
}
////// мигаем красным светодиодом //////////////
if (blink_state == 0)
{
if ((millis() - time) > (led_state ? blink_period_0 : blink_period_0))
{
led_state = !led_state;
counter ++;
digitalWrite(led, led_state);
time = millis();
}
if (counter >= 20)
{
counter = 0;
blink_state = 1;
}
}
if (blink_state == 1)
{
if ((millis() - time) > (led_state ? blink_period_1 : blink_period_1))
{
led_state = !led_state;
counter ++;
digitalWrite(led, led_state);
time = millis();
}
if ((counter / 2) >= 10)
{
counter = 0;
digitalWrite(led, LOW);
blink_state = 2;
}
}
////////// РАБОЧИЙ ЦИКЛ //////////////////////
if (distance > 0 && distance < distance_control && blink_state == 2)
{
digitalWrite(g_led, HIGH);
digitalWrite(b_led, HIGH);
digitalWrite(relay, LOW);
relay_time = millis();
state = 1;
}
if (state == 1)
{
if (millis() - relay_time > relay_period)
{
digitalWrite(g_led, LOW);
digitalWrite(relay, HIGH);
state = 2;
}
}
}
////////// функция измерения расстояния дальномером /////////////////
void DISTANCE()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
distance = pulseIn(echoPin, HIGH) / 58;
} |