Welcome, guest! Login / Register - Why register?
[email protected] webmail now available. Want one? Go here.
Windows getting boring or just want to try something Open Source for your next Desktop Environment?! Go Zorin OS.

Paste

Pasted as ARM assembler by registered user vhson ( 2 years ago )
// 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();
    }
  }
}

 

Revise this Paste

Parent: 104151
Children: 104153
Your Name: Code Language: