본문 바로가기
Hardware/MCU(Arduino,ESP8266)

배터리를 사용하는 아두이노 프로젝트에 배터리 잔량 표시하기

by lovey25 2020. 12. 7.
반응형

리튬 폴리머 배터리를 사용해서 휴대용으로 만들어 본 미세먼지 측정기에 배터리 잔량을 표시하는 기능을 추가하였습니다. 배터리가 얼마나 남아있는지 알 수가 없었기 때문에 들고나갔다가 갑자기 꺼져버리게 되면 요즘은 micro-USB 단자를 충전할 수 있는 곳이 없기 때문에 난감해집니다. 

 

아두이노 휴대용 미세먼지 측정기 만들기 완결편 - 아두이노 나노, PMS7003 센서, Nextion LCD, 3D프린�

2020-03-16 update log: 결선도 수정(아두이노 나노에서 5V외부입력 사용시 5V단자를 사용해야 함, Vin단자는 7V이상 전원 사용) 배경 지금 이 글을 쓰고 있는 2019년 7월 벌써 1주일이 넘게 미세먼지가 나��

kwonkyo.tistory.com

그래서 아두이노에 아날로그 단자를 이용해서 배터리 전압을 확인하고 이를 통해서 간접적으로 배터리 잔량을 알 수 있도록 하는 기능을 추가 하였습니다. 배터리 전압을 측정하기 위한 아날로그 핀 사용 방법에 대해서는 아래 링크의 글 참고해 주세요.

 

analogRead() & AREF핀 사용법

아두이노에서 아날로그 전압값을 읽어야 할 때 더 정확하게 측정할 수 있도록 도와주는 AREF(Analog Reference) 단자의 사용방법 알아보겠습니다. analogRead() 아두이노 보드에는 10비트 아날로그-디지털

kwonkyo.tistory.com

하드웨어

기존에 만들어둔 프로젝트에서 베터리 "+"단자를 하나 분기해서 아두이노 A2 단자에 연결시켜 주었습니다. 그리고 Aref와 5V 단자를 연결해주는 라인도 추가적으로 구성되어 있는데 이건 큰 의미가 없기 대문에 생략해도 되겠습니다. 

소프트웨어

Nextion 디자인 수정

배터리를 표시하기 위해서 Nextion UI에 우측 상단에 배터리 모양의 그래픽을 추가하였습니다. 대충 배터리 모양처럼 생겼죠?! ㅎ

새로 만든 그림으로 배경화면을 교체하고 배터리 잔량을 수치로 표시하기 위해서 HMI에 숫자 객체를 추가하였습니다. objactname은 "bat"로 설정했어요.

수정된 HMI파일을 컴파일해서 Nextion에 업로드합니다.

펌웨어 수정

마지막으로 아두이노의 펌웨어를 수정하겠습니다.

먼저 배터리의 완전 충전 시와 완전 방전 시의 전압 레벨을 알아야 하는데요. 이전에 제가 리튬폴리머 전지와 충방전 모듈에 대해서 공부한 결과(kwonkyo.tistory.com/369)에 따르면 4.2V에서 완전 충전이 되고 2.75V까지 방전을 허용한다고 하였기 때문에 100% 완전 충전은 4.2V로 하고 0%는 배터리 과방전 보호를 위해서 3V로 설정하기로 하였습니다.

이를 바탕으로 측정 전압값의 상한과 하한 그리고 배터리 잔량을 기억할 전역 변수를 다음과 같이 정의하였습니다. 

// 배터리 확인용
#define batt_max 860			// 860/1024*5 = 4.199
#define batt_min 615			// 615/102*5 = 3.00
int vl = 0;						// 배터리 전압 [V]
int bl = 0;						// 배터리 충전율 [%]

그리고 연결할 Nextion 객체에 새로 추가한 "bat"를 추가해 주었습니다.

/// page0 - main
NexButton bMicrobe = NexButton(0, 1, "bMicrobe");
NexButton bTimetimer = NexButton(0, 2, "bTimetimer");
NexNumber tBtt = NexNumber(0, 3, "bat");
/// page1 - microbe
NexButton b0 = NexButton(1, 5, "b0");
NexText tPM1_0 = NexText(1, 2, "tPM1_0");
NexText tPM2_5 = NexText(1, 3, "tPM2_5");
NexText tPM10_0 = NexText(1, 4, "tPM10_0");
NexWaveform sPMS = NexWaveform(1, 1, "sPMS");
NexButton bTest = NexButton(1, 6, "bTest");
NexNumber tBtt = NexNumber(1, 7, "bat");
/// page2 - timetimer
NexButton b1 = NexButton(2, 1, "b1");
NexNumber tBtt = NexNumber(2, 11, "bat");

잔량을 확인하는 로직은 다음과 같이 간단하게 만들어 봤습니다.  analogRead() 함수로 읽어 들인 값을 4.2~3V 값 사이의 비율로 전환한 값을 반환하는 함수인 "BattCheck()"이라는 함수를 만들었고 메인 Loop에서 한 번씩 호출해서 그때그때 배터리 잔량이 표시되도록 하였습니다.

// 배터리 잔량 확인 함수
int BattCheck() {
	vl=analogRead(2);
	bl=map(vl,batt_min,batt_max,0,100);
	if (vl<batt_min) bl=0;
	if (vl>batt_max) bl=100;
	return bl;
}

void loop() {
	SerialForNex.listen();
	nexLoop(nex_event_list);		// Nextion에서 발생하는 이벤트를 전달

	switch (menu_selector) {
	case 1:		// 미세먼지 측정기 모드
		if (millis() - started >= 2000)	// 2초간격으로 측정
		{
			started = millis();			// 타이머기준 리셋
			Serial.println("This is Microbe mode");
			UpdatePMS();				// 미세먼지관련 함수 호출
			tBtt2.setValue(BattCheck());
		}
		break;
//~~~~~~~~~~~ 이후 생략 ~~~~~~~~~~~~~~~~~~

 

아래 사진은 배터리 잔량이 표시되고 있는 사진입니다.

 

그런데 좀 더 실질적으로 활용하기 위해서는 몇 가지 개선해야 할 부분들은 있습니다. 실제로 배터리 전압은 기기의 구동 상태에 따라 민감하게 변할 수 있습니다. 따라서 배터리 잔량이 수 % 수준에서 계속 오르내리는 모습을 보여주는데 특정 시간 간격을 두고 반복 측정한 값을 평균 내서 화면에 표시를 해주던가 하는 방법으로 사용해야 할 것 같습니다.

그리고 충방전 모듈의 완충/완방 전압이 4.2, 2.75V라고 알고 있었지만 배터리의 상태에 따라 달라질 수 있는 것인지 이번에 다시 확인해 본 결과로는 완충 시 약 4V 완방 시는 최대 2.5V까지 떨어지는 현상을 확인했습니다. 그리고 전압이 낮을수록 전압이 떨어지는 속도가 점점 빨라지는 것 같은 느낌을 받았는데 전압과 배터리 잔량이 완전 선형 비례가 아니기 때문이 아닌가 싶었습니다. 배터리 잔량을 좀 더 정확하게 확인하기 위해서는 이런 여러 가지 요소들을 고려해서 배터리 잔량을 표현하는 로직을 만들 필요가 있을 것 같습니다.

 

끝!

반응형

댓글