// COVID-19: AUTOMATIC ALCOHOL DISPENSER
// MÁY RỬA TAY TỰ ĐỘNG - CHUNG TAY ĐẨY LÙI COVID
// Code by: Chợ Sáng Tạo Team
// Chức năng: Đóng trễ, ngắt trễ relay khi nhận tín hiệu điều khiển.
// Đặc điểm: 
//    - Cài đặt trước thờ gian đóng/ngắt trễ relay
//    - Cho phép sử dụng biến trở để điều chỉnh thời gian đóng trễ và/hoặc ngắt trễ
//    - Có tùy chọn để sử dụng được cho cả cảm biến trả về mức cao và mức thấp
//    - Có tùy chọn để sử dụng cho cả relay kích mức HIGH hoặc mức LOW


//#define USE_POT_DELAY_ON  //Bỏ dấu // nếu dùng biến trở để chỉnh thời gian đóng trễ
//#define USE_POT_DELAY_OFF //Bỏ dấu // nếu dùng biến trở để chỉnh thời gian ngắt trễ

#define DELAY_ON  800       // Thời gian đóng relay trễ   
#define DELAY_OFF 1000      // Thời gian ngắt relay trễ     - 1000 = 1 giây

#define DELAY_ON_RANGE  10000   //Dải thời gian chậm đóng relay (từ 0 đến 10 giây)
#define DELAY_OFF_RANGE 60000   //Dải thời gian chậm ngắt relay (từ 0 đến 60 giây)

#define SENSOR_PIN  2           //chân cảm biến
#define RELAY_PIN   13          //Chân điều khiển relay
#ifdef USE_POT_DELAY_ON
#define DELAY_ON_POT_PIN A0    //Chân cho biến trở điều chỉnh thời gian đóng trễ
#endif
#ifdef USE_POT_DELAY_OFF
#define DELAY_OFF_POT_PIN  A1    //Chân cho biến trở điều chỉnh thời gian ngắt trễ
#endif

#define SENSOR_LOW_SIGNAL       //Dùng cảm biến xuất tín hiệu mức thấp
//#define SENSOR_HIGH_SIGNAL    //Dùng cho cảm biến xuất tín hiệu mức cao

//#define RELAY_LOW_TRIGGER     //Dùng cho relay kích mức thấp (LOW)
#define RELAY_HIGH_TRIGGER      //Dùng cho relay kích mức cao (HIGH)

uint32_t pre_millis, pre_millis_2;
uint32_t delay_on = DELAY_ON;
uint32_t delay_off = DELAY_OFF;
bool relay_on;

void setup() {
  // put your setup code here, to run once:
  pinMode(SENSOR_PIN, INPUT_PULLUP);
  pinMode(RELAY_PIN, OUTPUT);
  Serial.begin(9600);

  //init relay status
  #ifdef RELAY_LOW_TRIGGER
  digitalWrite(RELAY_PIN, HIGH);
  #elif defined(RELAY_HIGH_TRIGGER)
  digitalWrite(RELAY_PIN, LOW);
  #endif
}

void loop() {
  //read sensor value
  int sensor_value;
  #ifdef SENSOR_LOW_SIGNAL
  sensor_value = !digitalRead(SENSOR_PIN);  
  #elif defined(SENSOR_HIGH_SIGNAL)
  sensor_value = digitalRead(SENSOR_PIN);  
  #endif

  #ifdef USE_POT_DELAY_ON
  //read potentialmeter to define delay on time
  delay_on = map(analogRead(DELAY_ON_POT_PIN),0,1023,0,DELAY_ON_RANGE);
  #endif

  #ifdef USE_POT_DELAY_OFF
  //read potentialmeter to define delay on time
  delay_off = map(analogRead(DELAY_OFF_POT_PIN),0,1023,0,DELAY_OFF_RANGE);
  #endif

  // received sensor signal
  if (relay_on){
    if (millis()-pre_millis_2 >= delay_off) {
      #ifdef RELAY_LOW_TRIGGER
      relay_on = false;
      digitalWrite(RELAY_PIN,HIGH);
      pre_millis = millis();
      #elif defined(RELAY_HIGH_TRIGGER)
      relay_on = false;
      digitalWrite(RELAY_PIN,LOW);
      pre_millis = millis();
      #endif         
    }
  } else {
    if (sensor_value) {
      if (millis() - pre_millis >= delay_on) {
        #ifdef RELAY_LOW_TRIGGER
        digitalWrite(RELAY_PIN, LOW);
        relay_on = true;
        pre_millis_2 = millis();
        #elif defined(RELAY_HIGH_TRIGGER)
        digitalWrite(RELAY_PIN, HIGH);   
        relay_on = true;
        pre_millis_2 = millis();         
        #endif      
      }
    } else {
      pre_millis = millis();
    }
  }
}

Add a code snippet to your website: www.paste.org