반응형

업데이트 이력: 2021.02.28 전체 코드 첨부

에어컨을 설치할 때 근처에 하수구가 없는 경우 따로 물통을 설치해서 물을 모아놨다가 한 번에 버리기도 합니다.
아파트는 벽 외부로 호스를 설치하면 물줄기 때문에 보기 흉하고 민원 발생...
물통을 제때 확인 하지 못해서 바닥이 물바다 된적이 있어 뒤늦게 제작한 아두이노 수위 경보기...
외부 전원을 배선하기 힘들어 태양광 전력을 사용했습니다.

 

자재

  • 태양광 패널: 5V 출력
  • 보조 배터리: 5V 입력
  • 아두이노: NANO, 확장 실드
  • 부저: 패시브 부저 또는 액티브 부저
  • 수위센서: 마그넷 스위치형 또는 비접촉 수위 센서

 

소스

/*
  Water Level Alarm
  simulz.kr
  제조일: 2018년 5월 29일
  20180529  Curie -> NANO

  DI2,3 BT
  DI4,5,9 RGB LED
  DI6 BUZZER
  DI7 WaterLevel
  DI8 DHT
  DI10~13 OLED
*/

// WaterLevel Sensor
int WaterLevel_Pin = 7;
int WaterLevel_State;

// CLASS
class BUZZER {
  private:
    int buzzerPin;
    long OnTime;
    long OffTime;

    int buzzerState;
    unsigned long prev_ms;

    // 주기 설정
    int buzzerCnt;
    int buzzerOnCnt = 4;
    int buzzerOffCnt = 12;

  public:
    // 초기화
    BUZZER(int pin) {
      buzzerPin = pin;
      buzzerState = LOW;
      prev_ms = 0;
    }

    // setup()
    void begin() {
      pinMode(buzzerPin, OUTPUT);
    }

    void BeepOff() {
      digitalWrite(buzzerPin, LOW);
    }
    void BeepOn() {
      OnTime = 50;
      OffTime = 50;
      unsigned long curr_ms = millis();

      if ((buzzerState == HIGH) && (curr_ms - prev_ms >= OnTime)) {
        buzzerState = LOW;
        prev_ms = curr_ms;
        digitalWrite(buzzerPin, buzzerState);
        buzzerCnt++;

      } else if ((buzzerState == LOW) && (curr_ms - prev_ms >= OffTime)) {
        if (buzzerCnt < buzzerOnCnt) {
          buzzerState = HIGH;
        } else buzzerCnt++;
        prev_ms = curr_ms;
        if (buzzerCnt < buzzerOnCnt)
          digitalWrite(buzzerPin, buzzerState);
      }

      if (buzzerCnt >= buzzerOnCnt + buzzerOffCnt) buzzerCnt = 0;
    }
};

// CLASS CALL
BUZZER BUZZER(6);

// SETUP
void setup() {
  Serial.begin(9600);

  // Level Sensor
  pinMode(WaterLevel_Pin, INPUT_PULLUP);

  BUZZER.begin();
}

// LOOP
void loop() {

  WaterLevel_State = digitalRead(WaterLevel_Pin);

  if (WaterLevel_State == HIGH) {
    BUZZER.BeepOn();
  } else {
    BUZZER.BeepOff();
  }
}

BUZZER클래스는 수동 부저의 삐삐삐삐 알람 소리가 발생하도록 만든 코드입니다. 능동 부저 사용시에는 HIGH 출력만 주면 됩니다.

클래스 내에서는 pinMode 선언이 안 되므로 begin()을 따로 만들어 setup() 내에서 pinMode를 설정하도록 했습니다.

digitalRead()로 수위 센서 상태를 읽어서 센서 스위치가 ON이 되면 비프음이 발생합니다.

반응형

관련글