YOGYUI

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - (2) 본문

홈네트워크(IoT)/힐스테이트 광교산

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - (2)

요겨 2022. 9. 18. 03:50
반응형

4. 유량계 및 부속품 구매

적당한 유량계를 찾느라 웹서핑에 이틀 이상을 소요했다 ㅠㅠ

여러 후보군 중에서 Seeed Studio의 YF-B2로 결정!

https://www.seeedstudio.com/Water-Flow-Sensor-YF-B2-p-2879.html
https://www.seeedstudio.com/Water-Flow-Sensor-YF-B2-p-2879.html

JATA 본체 입수구의 규격(DN15, 1/2인치)에 맞고, 암/수 구분된 제품군이 그렇게 많지가 않았다 ㅋㅋ 그래도 다행히 찾은게 YF-B2 (황동 재질이라 수명도 5년 이상으로 길다고 한다)

[중요] 황동관의 경우 인체에 치명적인 중금속인 (Pb)이 검출될 가능성이 있다
수도꼭지, 싱크대, 화장실과 같이 사람에게 직접적인 영향을 미치는 배관 작업 시 황동관을 사용하고자 한다면, YF-B2처럼 RoHS(Restriction of Hazardous Substances Directive) 인증을 받은 제품을 사용해야만 한다

https://www.seeedstudio.com/blog/2020/05/11/how-to-use-water-flow-sensor-with-arduino/

대부분의 유량계는 위와 같은 구조를 가진다

  • 물이 관을 흐르면서 회전시키는 터빈(Turbine)
  • 터빈의 중심축에 부착된 자석(Magnet)
  • 회전하는 자석에서 발생하는 자기력을 전기적 신호로 바꿔주는 홀 효과 센서 (Hall Effect Sensor)

전기/전자공학부 출신이 아닌 이상에야 Hall Effect에 대한 자세한 이론이나 원리는 익숙하지 않겠지만(전기장보다 훨씬 이론이 어려운게 자기장이었던 걸로 기억한다), 산업 현장 뿐만 아니라 일상 생활 곳곳에서도 적용되는 원리다 

※ 대표적으로 스마트폰이나 드론, 항공기 등에 탑재되는 지자계 센서(magnetometer)가 홀 효과를 기반으로 작동하게 된다

유량계는 위 그림과 같이 물의 흐름으로 인한 터빈의 회전 운동 정보를 전기적 펄스 신호로 변환해서 출력하기 때문에, 아두이노 등 간단한 MCU를 통해 펄스 정보를 입력받아 유량을 쉽게 계산할 수 있다

 

각설하고, 디바이스마트에서 부가세 포함 16,500에 주문 완료!

https://www.devicemart.co.kr/goods/view?no=12169415

 

해외 배송 제품이라 전달받기까지 1주일가량 기다려야했다 ㅠ

바로 장착해봤는데... 어럅소;;

JATA 본체와 연결되어 있던 호스와 YF-B2간 결합이 제대로 되지 않아서 물이 질질 새나왔다;; (별도로 사진은 남기지 못했다...)

원인을 조사해보니 결합부간 직경은 1/2인치로 동일한데, 나사산 피치(pitch)가 서로 달라서 꽉 조여지지 않는게 문제였다;;

 

이대로 포기할 순 없어서(들인 돈이 아까워서) 배관용 플라스틱 커플러를 추가 구매 ㅠㅠ

(연결부 사이사이에 넣을 고무패킹도 함께 구매했다)

금속(황동) 재질의 호스 연결부는 나사산 피치가 여전히 플라스틱 커플러와 규격이 동일하지 않지만, 힘을 줘서 돌리면 플라스틱을 조금씩 빠개면서(?) 돌아가 고정되는 효과가 있기 때문에 스테인리스/황동 재질의 커플러보다는 플라스틱 재질이 좋을 것으로 판단!

 

5. 유량계 장착 및 유량 신호 측정

배관작업은 누수가 발생하면 안되는게 가장 핵심! 

스텝-바이-스텝으로 부품을 하나씩 조립하면서 물을 틀어 연결부에서 물이 새지 않는지 확인하면서 작업해나가야 한다

 

입수 호스와 유량계 사이를 M-M, F-F 플라스틱 커플러를 사용해서 연결한 뒤 물을 틀어보니 물이 질질 샌다 ㅠㅠ 

 

다행히도 JATA 시공업자가 남겨둔 황동 재질의 연결부가 있어 추가로 연결해봤더니 누수가 발생하지 않았다

아무래도 YF-12 입수구 쪽 스레드 길이가 약간 짧았던 게 문제였던 듯?

배관 작업은 이래서 힘들다, 전문적으로 배워본 적도 없고 ㅎㅎ...

 

JATA 본체가 부착되어 있던 벽면에 다시 장착 후 배수쪽 호스까지 연결하고 누수가 발생하지 않는 것을 확인!

 

누수가 발생하지 않는 것을 확인했으니, 이제 유량계에 전원을 인가한 뒤 물을 틀어 펄스 신호를 오실로스코프로 측정해보자

  • 빨간색: DC 전원 (+5V ~ +15V)
  • 검은색: 접지 (Ground)
  • 노란색: 펄스 신호 출력

USB 충전기 어댑터에서 +5V를 따와 인가한 뒤, 노란색 선의 신호를 오실로스코프로 측정

흐르는 물의 양에 따라 펄스의 주기가 변하는 것을 알 수 있다

유속이 느리면 펄스 주기가 길어지며 (주파수가 낮음), 유속이 빠르면 펄스 주기가 짧아진다 (주파수가 높음)

※ 물이 흐르지 않으면 인가된 전압(5V)으로 신호가 유지되는 것도 볼 수 있다

6. 프로토타이핑

아두이노로 펄스값을 인터럽트로 입력받아 유량을 계산한 뒤, 값을 14-segment LED Display에 출력해보는 프로토타입 스크립트를 작성해봤다 (LED Display는 Adafruit HT16K33을 활용)

 

연결도는 다음과 같다 (Arduino Micro 사용)

※ fritzing용 YF-B2 라이브러리를 찾을 수 없어, 동일 회사 Seeed Studio의 YF-S201 schematic 사용..ㅎㅎ

attatchInterrupt로 인터럽트를 사용할 수 있는 핀 중 하나인 7번 핀으로 YF-B2의 유량 펄스 신호를 받아볼 수 있다

 

스크립트는 다음과 같다 (스크립트는 Seeed Studio의 블로그에 기재된 가이드라인을 따라 작성했다)

14-segment LED Display 간단한 사용문은 이전에 블로그에 포스팅한 적이 있다 (링크)

#include "Adafruit_LEDBackpack.h"

const byte FLOW_SENSE_PIN = 7;
volatile int flow_pulse_cnt = 0; // Flow Signal Pulse (rising edge) Count 
int flow_rate;
unsigned long tick_current;
unsigned long cloopTime;

char disp[4];
Adafruit_AlphaNum4 led = Adafruit_AlphaNum4();

void isr_flow_proc() {
    flow_pulse_cnt++;
}

void setup() {
    led.begin(0x70);
    led.setBrightness(15);
    led.clear();
    led.writeDisplay();

    pinMode(FLOW_SENSE_PIN, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(FLOW_SENSE_PIN), isr_flow_proc, RISING); // Setup Interrupt
    sei(); // Enable interrupts
    tick_current = millis();
    cloopTime = tick_current;
}

void loop() {
    tick_current = millis();
    if(tick_current >= (cloopTime + 1000)) {
        cloopTime = tick_current;
    
        // YF-B2: Pulse frequency (Hz) = 11 x Q, Q is flow rate in L/min.
        // -> (Pulse frequency x 60 min) / 11Q = flowrate in L/hour
        flow_rate = (flow_pulse_cnt * 60 / 11); 
        flow_pulse_cnt = 0; // Reset Counter
    
        sprintf(disp , "%04d" , flow_rate);
        for (int i = 0; i < 4; i++) {
            led.writeDigitAscii(0, disp[0]);
            led.writeDigitAscii(1, disp[1]);
            led.writeDigitAscii(2, disp[2]);
            led.writeDigitAscii(3, disp[3]);
            led.writeDisplay();
        }
    }
}
  • 7번핀에 상승 엣지(rising edge) 트리거 기반 인터럽트 활성화 (attatchInterrupt)
  • 7번핀으로 유량계의 펄스 신호 rising edge가 감지될 때마다 펄스 카운트값 증가 (flow_pulse_cnt++)
  • loop() 내에서 1초에 한번씩 펄스 카운트값을 토대로 유속 계산 (flow_rate) 후 펄스 카운트 값 0으로 리셋
  • 1초에 한번씩 LED Display에 유속 업데이트

유속은 YF-B2의 스펙을 토대로 계산할 수 있다

https://www.seeedstudio.com/Water-Flow-Sensor-YF-B2-p-2879.html

유속 Q (단위: L/min)와 신호 펄스 주파수 F간 상관관계는 다음과 같다

\( F=11 \times Q \)

따라서, 1초간 트리거링된 펄스 개수를 N이라 하면 유속 Q는

\( Q=N \div 11 \)

이 된다

☞ 매 펄스마다의 간격은 ms 단위로는 일정하지는 않지만, 1초간 얻은 펄스 개수를 토대로 유속을 계산하면 얼추 실제 유속과 비슷해진다는 느낌으로 간단하게 구현할 수 있다 (코드에서는 L/hour로 환산)

11이라는 값은 어떻게 정해진 스펙인가?
YF-B2는 액체 1L가 흐를 때 660 pulse가 발생한다 
따라서 pulse가 \( N \)개 발생했을 때 흐른 물의 양 \( V=N \div 660 \)이 된다
이 때, pulse \( N \)개가 \( t \)초 안에 발생했다고 하면 유속 \( Q(L/s) \)와의 관계는 다음과 같다 
\( V=Q \times t \)
\( {\cfrac{N}{660}}=Q \times t \)
\( {\cfrac{N}{t}}=660 \times Q \)
초당 펄스 발생 횟수를 주파수(frequency, \( f \))로 환산할 수 있다
\( {\cfrac{N}{t}}=f=660 \times Q \)
\( Q={\cfrac{f}{660}} \)
따라서 이를 L/min으로 환산하면 
\( Q \times 60={\cfrac{f}{11}} \)

 

이제 물을 틀어 프로토타이핑 결과를 확인해보자

오호~ 

값이 0이면 '물이 흐르지 않음', 값이 0이 아니면 '물이 흐르고 있음'으로 현재 상태를 간단히 설정할 수 있을 것 같다! (물 사용량 모니터링은 보너스~)

 

이제 WiFi 모뎀이 내장된 MCU로 교체하고, 풋스위치 입력을 입력받을 수 있게 만든 뒤 MQTT broker와 연결하는 프로토타이핑을 해보자

To be continued...

 

[시리즈]

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - (1)

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - (2)

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - (3)

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - Final

반응형