Реле времени своими руками
Долго ли, коротко ли, но вот взяло и перестало работать реле времени на моём септике на даче. Его задачей было — раз в час, включать на 15 минут циркуляционный дренажный насос. А так как покупать новое реле «это не наш метод», было принято решение разработать реле времени своими руками. Максимально дешевое, максимально компактное. Итак, именно поэтому будем использовать микросхему attiny85:
Купить её можно дешевле 100 руб. Так-же из хотелок, подумал , что не плохо бы видеть сколько осталось времени до включения реле и выключения реле. Следовательно будем использовать семи сегментый индикатор.
Включением-выключением насоса будет заниматься реле:
Чуть посчитав количество требуемых ног у микросхемы, взгруснул — для индикатора требуется 7 ног, плюс на реле одна. А у микросхемы всего 6 выходов. Значит придётся использовать сдвиговый регистр. Задача уже не получается совсем простой, но тем не менее остаётся вполне решаемой.
Сдвиговый регистр я уже использовал ранее в своих разработках, подробнее о нём можно почитать здесь.
Итак, вырисовался в конце концов следующий алгоритм работы всего этого набора электронники: на индикаторе последовательно сменяются цифры от 9 до 0. Цифры сменяются с интервалом в 6 минут. При достижении 1, включается реле, которое выключается при достижении 0. И так по циклу. Т.е. реле (ну и насос) работает 12 минут из часа.
Общая схема подключения получилась такой:
А скетч такой:
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 |
int dataPin = 1; // к выводу 14 регистра DS int clockPin = 2; // к выводу 11 регистра (SH_CP) int latchPin = 0; // к выводу 12 регистра (ST_CP) int PIN_RELAY= 4; // управление реле int pause=1000; // интервал переключения цифр void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); digitalWrite(latchPin, LOW); digitalWrite(PIN_RELAY, HIGH); // Выключаем реле - посылаем высокий сигнал } void PritNum(int num){ digitalWrite(latchPin, LOW); // начинаем передачу данных switch(num){ case 0: shiftOut(dataPin, clockPin, LSBFIRST, 0b10001000^0b00001000);break; case 1: shiftOut(dataPin, clockPin, LSBFIRST, 0b11101011);break; case 2: shiftOut(dataPin, clockPin, LSBFIRST, 0b01001100);break; case 3: shiftOut(dataPin, clockPin, LSBFIRST, 0b01001001);break; case 4: shiftOut(dataPin, clockPin, LSBFIRST, 0b00101011);break; case 5: shiftOut(dataPin, clockPin, LSBFIRST, 0b00011001);break; case 6: shiftOut(dataPin, clockPin, LSBFIRST, 0b00011000);break; case 7: shiftOut(dataPin, clockPin, LSBFIRST, 0b11001011);break; case 8: shiftOut(dataPin, clockPin, LSBFIRST, 0b00001000);break; case 9: shiftOut(dataPin, clockPin, LSBFIRST, 0b00001001);break; } digitalWrite(latchPin, HIGH); // прекращаем передачу данных } void loop() { for (int counter = 9; counter >=0; counter -- ) { PritNum(counter); pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход if (counter==0){ digitalWrite(PIN_RELAY, HIGH); }; if (counter!=0){ digitalWrite(PIN_RELAY, LOW); }; delay(pause); } } |
На эмуляторе работу скетча можно посмотреть здесь