이 영역을 누르면 첫 페이지로 이동
CodeJUN 블로그의 첫 페이지로 이동

CodeJUN

페이지 맨 위로 올라가기

CodeJUN

심심해서 하는 블로그

안드로이드, 아두이노로 미세먼지 측정 후 Firebase연동하기

  • 2018.05.12 23:29
  • 프로젝트

안녕하세요! 오랜만입니다. 요즘 시험기간 때문에 워낙 바뻐서 개인 프로젝트를 진행하지 못했습니다. ㅠㅠ 어,, 끝나자마자 일단 프로젝트 리뷰를 다시 해보긴 했습니다마는.. 그 사이 2018 Google I/O도 진행이 되었더군요. 자세한 이야기는 나중에 따로 포스팅으로 다루도록 하겠습니다.


제가 이 블로그를 시작하면서 가장 먼저 시작했던 프로젝트가 아두이노를 활용한 미세먼지 측정인데요, 이제 이것들을 가지고 조금 더 심화된 프로젝트를 진행해 보려 합니다.


그래서 뭘 할거냐?

우선, 여기(1편)와 여기(2편)에서 진행했던 미세먼지 측정기를 가지고 진행을 할 겁니다. 아두이노에서 측정한 미세먼지 값들을 Firebase FireStore DB에 저장해 모든 기기에서 실시간으로 볼 수 있도록 하려고 합니다.
아두이노에 ESP 모듈을 달아 통신을 직접 하고싶었지만, 부품을 구입하지 않아 손이 많이 가지만 안드로이드 기기를 한 번 거친 후 Firestore로 전송될 예정입니다.

제작해 보도록 하자

우선 프로젝트를 파 줍니다. 저는 급한대로 안드로이드 기기를 한 번 거쳐서 서버와 통신해 줄 것이기 때문에 ServerApp이라고 명명한 앱을 하나 더 등록했습니다.


그리고 FireStore에서는 위의 사진과 같이 컬렉션과 도큐멘트를 생성하였습니다. PM10 수준의 미세먼지 센서는 현제 주문하였으며, 도착하는 즉시 제작하여 같이 등록하도록 하겠습니다.. ㅠㅠ


서버와 통신할 안드로이드 앱

블루투스 연결을 통해 아두이노에서 10초에 한 번씩 초미세먼지 데이터를 보내줍니다. 그럼 그 데이터를 읽어 FireStore DB에 쿼리를 전송합니다. 블루투스와 안드로이드 기기간 연결하는 방법은 여기를 눌러 확인해 주세요.

bt.setOnDataReceivedListener((data, message) -> {
Map<String, Object> city = new HashMap<>();
//city.put("pm_10", "10");
city.put("pm_25", message);

db.collection("AirCondition").document("MicroDust")
.set(city)
.addOnSuccessListener(aVoid -> Log.d(TAG, "DocumentSnapshot successfully written!"))
.addOnFailureListener(e -> Log.w(TAG, "Error writing document", e));
});

아직 PM10 수준의 미세먼지 센서가 없기 때문에 주석 처리하였습니다. 블루투스 모듈을 통해 데이터가 들어오면, 쿼리를 전송하는 부분입니다.


서버에서 받아오는 앱

여기서는 실시간으로 10초마다 바뀌는 데이터를 불러옵니다.
final DocumentReference docRef = db.collection("AirCondition").document("MicroDust");
docRef.addSnapshotListener((snapshot, e) -> {
if (e != null) {
Log.w(TAG, "Listen failed.", e);
return;
}

if (snapshot != null && snapshot.exists()) {
Log.d(TAG, "Current PM 2.5: " + snapshot.getString("pm_25"));
Log.d(TAG, "Current PM 10: " + snapshot.getString("pm_10"));

float nNumber = Float.parseFloat(snapshot.getString("pm_25"));
String pm25 = String.format("%.0f", nNumber);
String pm10 = "0";

initProgress(pm25, pm10);
} else {
Log.d(TAG, "Current data: null");
}
});
}

FireStore가 데이터가 변경되는 즉시 값을 받아오기 때문에 우리는 할 게 아무것도 없습니다. 정말 편한것 같습니다. 다만 저는 소숫점 4자리 수 까지 정보를 주는 것을 자연수만 받도록 소숫점 4자리를 제거하였습니다. 아두이노나 서버단에서 처리했으면 더 좋았을 텐데 제 실력이 아직 많이 부족한 탓 입니다. ㅠㅠ

다시 말씀드리지만,, 아직 PM10 의 미세먼지 센서가 배송 중 인지라 임시로 0을 집어넣고 진행한 점 너그러이 이해해 주시기 바랍니다.


public void initProgress(String pm_25, String pm_10) {

int pm25 = Integer.parseInt(pm_25);
int pm10 = Integer.parseInt(pm_10);

if (0 <= pm25 && pm25 <= 15) {
pm25Progress.setFinishedStrokeColor(Color.parseColor("#00B0FF"));
pm25Progress.setTextColor(Color.parseColor("#00B0FF"));
} else if (15 < pm25 && pm25 <= 35) {
pm25Progress.setFinishedStrokeColor(Color.parseColor("#00E676"));
pm25Progress.setTextColor(Color.parseColor("#00E676"));
} else if (35 < pm25 && pm25 <= 75) {
pm25Progress.setFinishedStrokeColor(Color.parseColor("#FF9100"));
pm25Progress.setTextColor(Color.parseColor("#FF9100"));
} else if (75 < pm25) {
pm25Progress.setFinishedStrokeColor(Color.parseColor("#FF1744"));
pm25Progress.setTextColor(Color.parseColor("#FF1744"));
}
pm25Progress.setProgress(pm25);
pm10Progress.setProgress(pm10);
}

자연수로 변환된 String 값들을 int 값으로 변경해준 뒤, 단계별로 나눕니다. 단계는 네이버를 참고하였습니다.


이렇게 받은 최종 결과물은 아래와 같습니다.

농도가 진할 수록 색은 점점 변합니다. 저 그래프가 실시간으로 움직이는 모습이 신기하네요.

빨리 PM10 미세먼지 센서가 도착했으면 좋겠습니다.


마치며

PM10 미세먼지 센서가 아직 없어서 굉장히 아쉽습니다. ㅠㅠ

오는대로 바로 제작하여 블로그에 포스팅 하도록 하겠습니다. 아는 지인분과 함께 연결하여 지인분 쪽 동네도 실시간으로 확인할 수 있도록 해야겠습니다!


질문은 댓글이나 공지사항에 있는 제 연락처를 통해 연락 주시면 감사하겠습니다.

감사합니다!


저작자표시 비영리 동일조건 (새창열림)

'프로젝트' 카테고리의 다른 글

통합 대기질 측정기 회의 이후..  (0) 2020.07.27
통합 대기질 측정기 제작기 (절망편..)  (0) 2020.06.18
통합 대기질 측정기를 만들어 보자.. 시작편  (0) 2020.06.11
미세먼지 측정기 만들기 (2)  (4) 2018.04.22
미세먼지 측정기 만들기 (1)  (0) 2018.04.22

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 통합 대기질 측정기 제작기 (절망편..)

    통합 대기질 측정기 제작기 (절망편..)

    2020.06.18
  • 통합 대기질 측정기를 만들어 보자.. 시작편

    통합 대기질 측정기를 만들어 보자.. 시작편

    2020.06.11
  • 미세먼지 측정기 만들기 (2)

    미세먼지 측정기 만들기 (2)

    2018.04.22
  • 미세먼지 측정기 만들기 (1)

    미세먼지 측정기 만들기 (1)

    2018.04.22
다른 글 더 둘러보기

정보

CodeJUN 블로그의 첫 페이지로 이동

CodeJUN

  • CodeJUN의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 방명록

카테고리

  • 분류 전체보기 (54)
    • Android (38)
    • BlockChain (4)
    • React Native (4)
    • 아두이노 (2)
    • 프로젝트 (6)

공지사항

  • 공지 - 블로그를 시작하며

태그

  • c++
  • Firebase
  • 강좌
  • Android
  • arduino
  • 아두이노
  • 안드로이드
  • C

나의 외부 링크

  • Github

정보

CODE_JUN의 CodeJUN

CodeJUN

CODE_JUN

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © CODE_JUN. Designed by Fraccino.

티스토리툴바