// 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