mariogianota
Published

Adjustable delay relay timer switch circuit home automation

Build an adjustable delay timer with relay switch using Arduino nano

IntermediateFull instructions provided5,361
Adjustable delay relay timer switch circuit home automation

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
Omron G5V-2 Relay
×1
2N2222 Transistor
×1

Story

Read more

Code

Timer Relay Switch Sketch

Arduino
/**
 * Relay Timer Switch - A timer based relay switch which will control up to two devices
 * 
 * Note: This sketch requires the TM1637 7 segment led display library.
 * 
 * Author: Mario Gianota (mariogianota@protonmail.com) September 2021
 */
#include <TM1637Display.h>

#define CLK 7
#define DIO 8
#define _UNPRESSED 0
#define _PRESSED 1
#define _RELEASED 3
#define SECONDS_ADJUST 0
#define MINUTES_ADJUST 1
#define TIMER_ENABLE 2

int keyboard[3] = {0,0,0}; // Index 0 = seconds adjust, 1 = minutes adjust, 2 = timer on/off
bool timerEnabled;

int seconds;
int minutes;
long startTime;

TM1637Display display(CLK, DIO);

void setup() {
  // Input buttons
  pinMode(2, INPUT);  // Minutes adjust
  pinMode(3, INPUT);  // Seconds adjust
  pinMode(4, INPUT);  // Timer on/off
  // Timer indicator LED
  pinMode(5, OUTPUT);
  // Transistor base
  pinMode(6, OUTPUT);
  timerEnabled = false;
  //Serial.begin(9600);
  pinMode(CLK, OUTPUT);
  pinMode(DIO, OUTPUT);
  display.setBrightness(0x0f);
}

void loop() {
  read_keyboard();
  
  if( keyboard[TIMER_ENABLE] == _RELEASED ) {
    timerEnabled = ! timerEnabled;
    if( timerEnabled )
      startTime = millis();
  }

  if( timerEnabled ) {
    digitalWrite(5, HIGH);
  } else {
    digitalWrite(5, LOW);
  }

  if( seconds == 0 && timerEnabled ) {
    digitalWrite(6, HIGH);
  } else {
    digitalWrite(6, LOW);
  }

  minutes = seconds / 60;
  display.showNumberDec(seconds - minutes * 60, true, 2, 2);
  display.showNumberDec(minutes, true, 2, 0);

  if( ! timerEnabled ) {
    if( keyboard[SECONDS_ADJUST] == _RELEASED ) {
      seconds++;
    }
    if( keyboard[MINUTES_ADJUST] == _RELEASED ) {
      seconds += 60;
    }
    return;
  }

  calc_time();
}

void read_keyboard() {
  int state;
  for(int i=2; i<=4; i++) {
    state = digitalRead(i);
    if( state == LOW ) {
      keyboard[i-2] = _PRESSED;
    } else if( state == HIGH && keyboard[i-2] == _PRESSED ) {
      keyboard[i-2] = _RELEASED;
    } else {
      keyboard[i-2] = _UNPRESSED;
    }
  }
  delay(10);
}

void calc_time() {
  if( millis() - startTime >= 1000 ) {
    seconds--;
    if( seconds < 0 ) {
      seconds = 0;
    }
    startTime = millis();
  }
}

Credits

mariogianota
24 projects • 21 followers
Contact

Comments

Please log in or sign up to comment.