blob: 99b6d2b7a8b475109411962a62131329fc5f1b11 (
plain)
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
|
/*
Контроль протечки и перелива воды в баке
fuses: Low = 0x6a High = 0xff
atTiny13a
-----------------
PB5 - 1 - | RES VCC | - 8
Open - 2 - | PB3 PB2 | - 7 SCK - Beep
Close - 3 - | PB4 PB1 | - 6 MISO - sensors
4 - | GND PB0 | - 5 MOSI - Led
-----------------
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define PIN_OPEN PB3 // открытие
#define PIN_CLOSE PB4 // закрытие
#define PIN_BEEP PB2 // выход beep
#define PIN_LED PB0 // выход led
#define PIN_SENSOR PB1 // датчики
uint8_t TIME_WORK_VALVE = 3; // время работы клапана, сек (нужно измерить и немного прибавить)
uint8_t PAUSE_OPEN = 5; // пауза до открытия вентиля после его закрытия, сек
bool flagOpen = true;
bool flagClose = true;
const uint8_t timeBlink = 5; // время между вспышками LED в покое
const uint32_t countInterrupt = 92;
// Время через которое вентиль закроется/откроется автоматически (антиприкипание):
// 7дн * 24ч * 60м * 60с = 604800сек / (1 / 1200000 / 1024 / 255 = 0.218сек) = 2774312
// 2774312 - заносим в переменную =countInterrupt=
uint32_t count = countInterrupt;
//====================================================================
void beepHold(uint8_t b)
// Звуковая индикация режима:
{
for (uint8_t i = 0; i < b; ++i)
{
PORTB &= ~(1 << PIN_BEEP);
_delay_ms(50);
PORTB |= (1 << PIN_BEEP);
_delay_ms(50);
}
}
//====================================================================
void workServoOpen()
{
cli();
PORTB |= (1 << PIN_LED);
beepHold(1);
PORTB |= (1 << PIN_OPEN);
PORTB &= ~(1 << PIN_CLOSE);
flagOpen = false;
flagClose = true;
sei();
_delay_ms(TIME_WORK_VALVE * 1000);
PORTB &= ~(1 << PIN_OPEN);
PORTB &= ~(1 << PIN_CLOSE);
}
//====================================================================
void workServoClose()
{
PORTB |= (1 << PIN_LED);
beepHold(2);
PORTB &= ~(1 << PIN_OPEN);
PORTB |= (1 << PIN_CLOSE);
_delay_ms(TIME_WORK_VALVE * 1000);
PORTB &= ~(1 << PIN_OPEN);
PORTB &= ~(1 << PIN_CLOSE);
}
//====================================================================
void ledWorkPause(uint16_t b)
// Индикация паузы после закрытия вентиля:
{
PORTB |= (1 << PIN_LED);
for (uint8_t i = 0; i < b; ++i)
{
PORTB ^= (1 << PIN_LED);
_delay_ms(1000);
}
PORTB &= ~(1 << PIN_LED);
}
//====================================================================
ISR(INT0_vect)
{
if (flagClose)
workServoClose();
ledWorkPause(PAUSE_OPEN);
flagOpen = true; // флаг разрешения открытия вентиля
flagClose = false;
count = countInterrupt;
}
//====================================================================
ISR(TIM0_OVF_vect)
{
if (!--count)
{
beepHold(2);
workServoClose();
ledWorkPause(PAUSE_OPEN);
flagOpen = true; // флаг разрешения открытия вентиля
flagClose = false;
}
}
//====================================================================
int main(void)
{
// инициализация порта
DDRB |= (1 << PIN_CLOSE) | (1 << PIN_OPEN) | (1 << PIN_BEEP) | (1 << PIN_LED);
DDRB &= ~(PIN_SENSOR);
PORTB |= (1 << PIN_SENSOR) | (1 << PIN_BEEP);
_delay_ms(1000);
// заводим таймер Т0 по переполнению:
TIMSK0 |= (1 << TOIE0);
TCCR0B |= (1 << CS02) | (1 << CS00);
TCNT0 = 0;
// заводим INT0:
GIMSK |= (1 << INT0);
sei();
//===================================
while (1)
{
if (flagOpen)
{
workServoOpen();
count = countInterrupt;
PORTB &= ~(1 << PIN_LED);
}
// Мигаем светодиодом:
PORTB ^= (1 << PIN_LED);
if (PORTB & (1 << PIN_LED))
{
_delay_ms(timeBlink * 1000 / 60);
}
else
{
_delay_ms(timeBlink * 1000 - timeBlink * 1000 / 60);
}
}
}
//====================================================================
|