번개가 치면, 나는 초를 센곤 한다.
번개가 번쩍하고 하늘을 가르면, 바로 숫자를 센다.
하나, 둘, 셋... 그리고 천둥 소리가 들리는 순간, 이번 번개는 몇 초 거리였는지를 가늠해본다.
중학교 과학 시간에 배운 번개가 떨어진 곳과의 거리를 재는 방법을 지금도 몸이 기억하고 있는 것이다.
오늘은 광고론 수업이 조금 늦게 끝났다. 하늘이 심상치 않다 싶었는데, 우산도 없이 학교에 있는 사이 비가 쏟아졌다.
강의동 건물 밖으로는 나갈 수 없었고, 천둥과 번개는 유난히 가까이서 몰아치는 듯 했다. 정말 내가 있는 강의동에 떨어지는 줄 알았다.
문득 이런 생각이 들었다.
“내 스마트폰이 지금 이 번개와의 거리를 측정해주면 어떨까?”
웹으로 만드는 번개 감지기
그 생각은 단순한 궁금증이었지만, 곧바로 제작으로 이어졌다.
별도의 앱 설치 없이, 웹브라우저, 그 중에서도 티스토리 게시글의 html 편집 기능만으로 번개와의 거리를 측정해보자는 목표였다.
누구나 접속만 하면 바로 사용할 수 있으며
단순하고, 직관적이고, 재미까지 있는 페이지를 만들자 !!!

어떻게 동작하게 할까?
핵심은 이렇다. 카메라는 번개의 빛을 감지하고, 마이크는 천둥의 소리를 듣는다.
두 신호 사이의 시간 차이를 계산하면, ‘소리가 빛보다 느리다’는 원리를 이용해 거리 추정이 가능하다.
번개 감지 방식
카메라에서 들어온 화면을 <canvas>로 받아온다.
프레임마다 밝기를 계산해서, 갑자기 화면이 밝아지면 그것을 번개로 간주한다.
천둥 감지 방식
먼저, 저주파 대역 20~200Hz 사이의 소리를 받아온다.
이 대역에서 크고 낮게 울리는 소리가 들어오면 천둥일 가능성이 높다고 한다. 그래서 볼륨, 지속 시간, 저주파 비중까지 함께 확인해 오탐을 최소화한 방식을 택했다.
그리고 이 감지된 천둥 시각과 번개 시각의 차이를 계산해서,
‘약 1.7km 떨어진 곳에 번개가 쳤습니다’ 같은 식으로 안내해준다.
Ui는 이렇게 구성했다
처음 감지를 시작할 때는 3초 카운트다운이 들어간다.
사용자가 스마트폰을 들고 준비할 수 있도록 시간을 주는 셈이다.
밖을 향해 키메라를 들고 있으면 3초 뒤 프레임의 밝기를 측정해 현재 밝기를 기록하고, 이 밝기의 변화가 감지되면 번개로 인식해 시간을 측정하기 시작한다.
이후 천둥으로 감지되는 소리가 들리면 측정된 시간을 계산해 번개가 떨어진 곳과의 거리를 출력해주는 방식이다.
이때 필요하면 수동으로 ‘천둥 감지’를 누를 수도 있다. 실제로 천둥이 안 들리거나 감지가 누락될 경우를 대비해 만든 기능이다.
성능은 가볍고, 빠르게
모바일에서도 무리 없도록 성능 최적화도 했다.
영상 캔버스의 해상도를 1/4로 줄여 프레임당 연산량을 줄였고,
이 덕분에 배터리 소모나 발열도 꽤 낮출 수 있었다.
====================================
나가서 직접 시험해 볼 계획이었지만 이젠 번개가 안 친다...
실내에서 밝기 변화를 고의적으로 주고, 천둥 소리를 내면 제대로 작동하는 걸 보아 아마 실전에서도 비슷한 결과를 보여주지 않을까 기대한다.
스마트폰 하나, 티스토리 블로그의 게시글 하나만으로 요즘 이런 자잘한 프로젝트를 해보는데 너무 재밌는 것 같다.
재밌다 = 곧 다시 돌아오겠다.