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
158
159
160
161
162
163
| #define TimerMS 600000ul // время работы вытяжки до перехода в дежурный режим в миллисекундах
#define PIN_DefaultSpeed01 A1 // пин средней точки потенциометра для регулировки скорости в дежурном режиме
#define PIN_Vent01 9 // пин выдачи ШИМ-сигнала на драйвер вентилятора !!! при изменении номера этого пина нужно менять TCCR1A и TCCR1B в setup() !!!
#define PIN_Siren01 3 // пин выдачи сигнала на включение оповещающего устройства при включении вытяжки
#define PIN_Button01 8 // пин кнопки включения вытяжки
#define PIN_Disp01_CLK 4 // пин CLK для дисплея
#define PIN_Disp01_DIO 5 // пин DIO для дисплея
#define PIN_DefaultSpeed02 A2 // см. выше
#define PIN_Vent02 10 // см. выше
#define PIN_Siren02 11 // см. выше
#define PIN_Button02 12 // см. выше
#define PIN_Disp02_CLK 6 // см. выше
#define PIN_Disp02_DIO 7 // см. выше
#include "GyverTM1637.h" // подключение библиотеки для работы с дисплеями
class MyLine {
public:
MyLine(byte _ds, byte _vn, byte _sr, byte _bt, byte _clk, byte _dio) {
DefaultSpeedPin = _ds;
VentPin = _vn;
SirenPin = _sr;
ButtonPin = _bt;
CLKPin = _clk;
DIOPin = _dio;
pinMode(DefaultSpeedPin, INPUT);
pinMode(VentPin, OUTPUT);
pinMode(SirenPin, OUTPUT);
pinMode(ButtonPin, INPUT_PULLUP);
DSP = new GyverTM1637 (CLKPin, DIOPin);
DSP->clear();
DSP->point(0);
DSP->brightness(7);
DSP->displayByte(_L, _O, _A, _D);
};
byte StopCount();
byte StartFull();
byte StartCount();
private:
GyverTM1637 * DSP;
byte DefaultSpeedPin;
byte VentPin;
byte SirenPin;
byte ButtonPin;
byte CLKPin;
byte DIOPin;
word CurSpeed, OldSpeed;
bool ModeChanged = true;
unsigned long StartCountTime, EndCountTime;
word CurTime, OldTime;
};
MyLine Line01(PIN_DefaultSpeed01, PIN_Vent01, PIN_Siren01, PIN_Button01, PIN_Disp01_CLK, PIN_Disp01_DIO); // основная вытяжка (у меня с подключенной световой и звуковой сигнализацией)
MyLine Line02(PIN_DefaultSpeed02, PIN_Vent02, PIN_Siren02, PIN_Button02, PIN_Disp02_CLK, PIN_Disp02_DIO); // дополнительная вытяжка (у меня это вытяжка в ванной комнате без сигнализации, только вентилятор)
void setup() {
// Пины D9 и D10 - 31.4 кГц
TCCR1A = 0b00000001; // 8bit
TCCR1B = 0b00000001; // x1 phase correct
}
byte Mode01 = 0, Mode02 = 0; // начальный режим работы вытяжек
void loop() {
switch (Mode01) {
case 0:
Mode01 = Line01.StopCount();
break;
case 1:
Mode01 = Line01.StartFull();
break;
case 2:
Mode01 = Line01.StartCount();
break;
}
switch (Mode02) {
case 0:
Mode02 = Line02.StopCount();
break;
case 1:
Mode02 = Line02.StartFull();
break;
case 2:
Mode02 = Line02.StartCount();
break;
}
};
byte MyLine::StopCount() { // дежурный режим: скорость задаётся потенциометром, сигнализация выключена
byte ret = 0;
long s = 0;
if (ModeChanged) {
DSP->point(0);
DSP->clear();
digitalWrite(VentPin, LOW);
digitalWrite(SirenPin, LOW);
OldSpeed = 300;
ModeChanged = false;
}
for (byte h = 1; h <= 32; h++) s += analogRead(DefaultSpeedPin);
s /= 32;
analogWrite(VentPin, (s / 16));
CurSpeed = (s / 16);
if (OldSpeed != CurSpeed) {
if (CurSpeed > 0) DSP->displayInt(CurSpeed);
else DSP->displayByte(_O, _F, _F, _empty);
OldSpeed = CurSpeed;
};
if (!digitalRead(ButtonPin)) {
ret = 1;
ModeChanged = true;
}
return ret;
};
byte MyLine::StartFull() { // включение вытяжки: максимальная скорость, сигнализация включена
byte ret = 1;
if (ModeChanged) {
DSP->point(0);
DSP->displayByte(_F, _U, _L, _L);
ModeChanged = false;
}
digitalWrite(VentPin, HIGH);
digitalWrite(SirenPin, HIGH);
if (digitalRead(ButtonPin)) {
ret = 2;
ModeChanged = true;
}
return ret;
};
byte MyLine::StartCount() { // отсчёт времени до автоматического выключения после отжатия кнопки: максимальная скорость, сигнализация включена
byte ret = 2;
unsigned long n, os, m, s;
if (ModeChanged) {
DSP->point(1);
DSP->displayInt(TimerMS / 1000);
OldTime = 9999;
StartCountTime = millis();
EndCountTime = StartCountTime + TimerMS;
ModeChanged = false;
}
n = millis();
os = ((EndCountTime - n) / 1000ul);
m = (os / 60ul);
s = (os % 60ul);
CurTime = ((m * 100) + s);
if (OldTime != CurTime) {
DSP->displayClock(m, s);
OldTime = CurTime;
}
if (n > EndCountTime) {
ret = 0;
ModeChanged = true;
}
if (!digitalRead(ButtonPin)) {
ret = 1;
ModeChanged = true;
}
return ret;
}; |