안드로이드, 아두이노로 미세먼지 측정 후 Firebase연동하기
안녕하세요! 오랜만입니다. 요즘 시험기간 때문에 워낙 바뻐서 개인 프로젝트를 진행하지 못했습니다. ㅠㅠ 어,, 끝나자마자 일단 프로젝트 리뷰를 다시 해보긴 했습니다마는.. 그 사이 2018 Google I/O도 진행이 되었더군요. 자세한 이야기는 나중에 따로 포스팅으로 다루도록 하겠습니다.
제가 이 블로그를 시작하면서 가장 먼저 시작했던 프로젝트가 아두이노를 활용한 미세먼지 측정인데요, 이제 이것들을 가지고 조금 더 심화된 프로젝트를 진행해 보려 합니다.
그래서 뭘 할거냐?
제작해 보도록 하자
우선 프로젝트를 파 줍니다. 저는 급한대로 안드로이드 기기를 한 번 거쳐서 서버와 통신해 줄 것이기 때문에 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 수준의 미세먼지 센서가 없기 때문에 주석 처리하였습니다. 블루투스 모듈을 통해 데이터가 들어오면, 쿼리를 전송하는 부분입니다.
서버에서 받아오는 앱
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 |
댓글
이 글 공유하기
다른 글
-
통합 대기질 측정기 제작기 (절망편..)
통합 대기질 측정기 제작기 (절망편..)
2020.06.18 -
통합 대기질 측정기를 만들어 보자.. 시작편
통합 대기질 측정기를 만들어 보자.. 시작편
2020.06.11 -
미세먼지 측정기 만들기 (2)
미세먼지 측정기 만들기 (2)
2018.04.22 -
미세먼지 측정기 만들기 (1)
미세먼지 측정기 만들기 (1)
2018.04.22