Реле времени своими руками 2

Ранее уже делал подобную схему, но вышло слишком дорого и сложно. Поэтому реле времени своими руками буду упрощать и удешевлять 😉 Во первых уберем индикатор, соответственно сдвиговый регистр будет не нужен. Из индикации добавим светодиод, который будет показывать включено или выключено реле. Так-же подумав, решил добавить кнопку ручного включения/выключения реле. Сердцем будет микросхема attiny85. Так-же в схему добавил и блок питания (HLK-PM01), чтоб вся конструкция была единой платой

Принципиальная схема (потыкать в эмуляторе можно тут):

Реле времени своими руками

Схема на текстолите:

Реле времени своими руками
Реле времени своими руками

Ну и скетч:

bool myClock[]={1,0,1,0,0,0,0,0,0,0,0,0,0,0};
int myClock_len=sizeof(myClock);
int delayTime=6000;
bool button_active=false;
int inc=0;
uint32_t myTimer1;
int relay_pin = 4;

void setup() {
  pinMode(0, OUTPUT); 
  pinMode(2, INPUT_PULLUP);
  digitalWrite(0, HIGH); // Включение светодиода
  pinMode(relay_pin,OUTPUT);
}

void loop() {
  
    if (millis()-myTimer1>=delayTime||millis()-myTimer1<0){
        myTimer1=millis();
        if (button_active==false){
            if (myClock[inc]==0){
              digitalWrite(0, LOW);  // Выключение светодиода              
              digitalWrite(relay_pin,LOW);
            } else {
              digitalWrite(0, HIGH); // Включение светодиода
              digitalWrite(relay_pin,HIGH);
            };
            inc++;
            if (inc>myClock_len){
              inc=0;
            };
        };

    };

    if (digitalRead(2)==0){
      if (button_active==false){
        digitalWrite(0, HIGH); // Включение светодиода
        digitalWrite(relay_pin,HIGH);
        button_active=true;        
      } else {
          button_active=false;
          digitalWrite(0, LOW); // Выключение светодиода
          digitalWrite(relay_pin,LOW);
      };
      delay(1000);
    };


  
}

Вот так готовлю почву чем заниматься долгими зимними вечерами.. Итоговая стоимость предварительно, вышла примерно такая:

  • блок питания — 160р
  • attiny85 — 80р
  • текстолит — 150р
  • светодиод — 7р
  • реле — 150р

Итого — примерно 600р. Ну собственно это цена реле времени своими руками уже готового если покупать на валдберис. Но тут то своими руками 😉

Реле времени своими руками

Долго ли, коротко ли, но вот взяло и перестало работать реле времени на моём септике на даче. Его задачей было — раз в час, включать на 15 минут циркуляционный дренажный насос. А так как покупать новое реле «это не наш метод», было принято решение разработать реле времени своими руками. Максимально дешевое, максимально компактное. Итак, именно поэтому будем использовать микросхему attiny85:

реле времени своими руками

Купить её можно дешевле 100 руб. Так-же из хотелок, подумал , что не плохо бы видеть сколько осталось времени до включения реле и выключения реле. Следовательно будем использовать семи сегментый индикатор.

Включением-выключением насоса будет заниматься реле:

Чуть посчитав количество требуемых ног у микросхемы, взгруснул — для индикатора требуется 7 ног, плюс на реле одна. А у микросхемы всего 6 выходов. Значит придётся использовать сдвиговый регистр. Задача уже не получается совсем простой, но тем не менее остаётся вполне решаемой.

Сдвиговый регистр я уже использовал ранее в своих разработках, подробнее о нём можно почитать здесь.

Итак, вырисовался в конце концов следующий алгоритм работы всего этого набора электронники: на индикаторе последовательно сменяются цифры от 9 до 0. Цифры сменяются с интервалом в 6 минут. При достижении 1, включается реле, которое выключается при достижении 0. И так по циклу. Т.е. реле (ну и насос) работает 12 минут из часа.

Общая схема подключения получилась такой:

реле времени своими руками

А скетч такой:

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);
  }
}

На эмуляторе работу скетча можно посмотреть здесь