본문 바로가기

프로젝트/블루투스 무드등

[비전공자도 만들 수 있는 블루투스 무드등] 14. 안드로이드 앱 part 3-2, 버튼 기능 설정

안녕하세요? 닉네임간편입니다. 이번 시간에는 저번 시간에 설명하지 못했던 뷰들에 대해서 다루겠습니다.


전체 소스는 여기에 있습니다.

https://github.com/creativeduck/MyLED

앱을 미리 사용해보고 계신 분들은, 이 링크를 타고 설치해주시면 됩니다.

https://play.google.com/store/apps/details?id=com.mybest.myled


1. 블루투스 접속 버튼

btnConnect.setOnClickListener(e-> {
	checkBluetooth();
});

앞서 블루투스 활성화 여부를 점검하는 메서드를 만들었습니다. 블루투스 버튼을 클릭하면 이 메서드를 호출하도록 설정합니다.

이 메서드를 한 번 호출하면 기기 검색 및 연결 과정까지 진행되므로 이 메서드만 호출하면 되겠습니다.

2. 밝기 조절

bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                colors[3] = (byte) seekBar.getProgress();
                sendData();                               
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {}
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {}
        });

 

1) OnSeekBarChangeListener

시크바 변수에 OnSeekBarChangeListener를 설정하고, 세 개의 메서드를 재정의해서 필요한 동작을 수행합니다.

이때 onProgressChanged() 메서드를 제외하고는 필요하지 않으므로 나머지 두 메서드에선 아무것도 입력하지 않았습니다.

2) onProgressChanged()

이 메서드는 시크바의 상태가 변화될 때, 즉 시크바의 값이 변화될 때 호출됩니다.

시크바의 값이 변하면 변한 값을 가져와 밝기 데이터인 colors[3]이 참조하도록 합니다. 이때도 byte 자료형으로 강제 형 변환해줍니다.

이후 sendData() 메서드를 통해 변화된 밝기 값이 포함된 데이터를 전송합니다.

3. 전원 버튼

colors[0] = (byte) 255;
colors[1] = (byte) 255;
colors[2] = (byte) 255;

btnPower.setOnClickListener(e-> {
	power();
});

 

1) 색 설정

색상을 하얀색으로 설정해줍니다. 하얀색은 RGB 기준 255, 255, 255입니다.

이렇게 하는 이유는, 색상을 선택하지 않고 바로 전원 버튼을 클릭했을 때 하얀색 불빛이 나오도록 하기 위함입니다.

배열을 처음 만들고 아무런 값을 넣지 않을 경우 배열의 모든 요소는 0으로 초기화됩니다. 이때 모든 색상값을 0으로 설정하면 검은색이 되고, LED상 불빛이 켜지지 않은 것처럼 됩니다. 따라서 이를 방지하기 위해 255로 값들을 설정하여 하얀색 불빛이 나오도록 하는 것입니다.

2) OnClickListener

이 리스너를 설정해 버튼이 클릭될 때 power() 메서드를 호출하도록 합니다.

power() 메서드는 전원을 켜고 끄는 동작을 수행하며, 내용은 다음과 같습니다.

private void power() {
        if(powerOn) {   // 전원이 켜져있다면
            bar.setProgress(0); // 시크바 값 0으로 설정
            sendData();                              // 밝기 데이터 전송
            powerOn=false;                          // 전원 꺼짐
        }
        else { // 전원이 꺼져있다면
            bar.setProgress(255); // 시크바 값 255로 설정
            sendData();            // 밝기 데이터 전송
            powerOn=true;         // 전원 켜짐
        }
    }

 

이 메서드는 사실상 아두이노의 전원 자체를 끄거나 켜지 않습니다. 전원이 꺼지면 동작 자체를 할 수 없기 때문입니다. 따라서 이 메서드는 LED의 밝기를 조절해 마치 전원을 켜거나 끈 것처럼 조작합니다.

a) powerOn == true

즉 전원이 이미 켜져있다면 다음 동작을 수행합니다.

먼저 setProgress() 메서드를 통해 시크바의 값을 0으로 설정합니다.

이때 시크바의 값이 변함에 따라 시크바에 설정한 OnSeekBarChangeListener의 onProgressChanged() 메서드가 호출됩니다. 따라서 변화된 시크바의 값이 colors[3]에 넣어지게 됩니다. 그리고 sendData() 메서드를 통해 밝기만 변경된 데이터를 전달하여 LED 불빛의 밝기를 조절합니다.

그런데 이때 데이터 전송 메서드를 power() 메서드에서도 호출합니다. 사실 이 이유는, 단지 제가 시도해봤을 때 이렇게 호출해야 작동이 되었기 때문입니다. 즉, 아직 저도 왜 이렇게 해야 하는지 이유를 파악하지 못했으며, 이 부분 사과드립니다. 다만 중복해서 sendData() 메서드를 호출해야, 즉 아두이노 측으로 데이터를 두 번 보내야 전원 메서드가 잘 작동했습니다. 이 부분은 계속해서 공부하면서 해결방안을 찾게 된다면 업데이트하겠습니다.

마지막으로 powerOn을 false로 설정합니다.

 

b) powerOn == false

즉 전원이 현재 꺼져있다면 다음 동작을 수행합니다.
먼저 시크바의 값을 255로 설정합니다. 이후 동작은 앞서 설명했던 것처럼 시크바에 설정한 클릭 리스너의 메서드를 이용해 밝기 데이터를 colors[3]에 넣고 sendData() 메서드를 호출합니다.

이후 이 메서드에서도 sendData() 메서드를 호출해 데이터를 전송합니다.
마지막으로 powerOn을 true로 설정합니다.

3. 레인보우 버튼

btnRainbow.setOnClickListener(e-> {
	rainbow();
	selectedColor.setImageResource(R.drawable.rainbow);
});

 

레인보우 버튼에 클릭 리스너를 설정해줍니다.

1) rainbow()

무지개빛으로 LED 불빛이 빛나도록 만드는 메서드를 호출합니다.

2) 이미지 설정

선택된 색상을 나타내는 selectedColor 셰이퍼블 이미지뷰에 이미지를 설정합니다.

레인보우 기능을 나타내므로 이미지는 다음과 같이 설정했습니다.

 

rainbow 기능 실행 시 이미지

 

앞서 호출한 rainbow() 메서드는 다음과 같습니다.

private void rainbow() {
        colors[4] = 1;
        sendData();
        currentState.setText("rainbow");
        powerOn=true;
        colors[4] = 0;
    }

 

1) colors[4] = 1

앞서 아두이노 스케치에서 colors[4]의 값이 1이라면 아두이노 내의 rainbow() 메서드를 수행하도록 설정했습니다. 따라서 이 기능을 사용하기 위해 colors[4]에 1의 값을 넣어줍니다.

2) sendData()

현재 데이터를 전송해 레인보우 기능이 실행되도록 합니다.

3) 현재 상태 설정

이후 현재 상태를 나타내는 텍스트뷰 currentState에 "rainbow"란 텍스트를 띄웁니다.

물론 이때 자유롭게 메시지를 설정하셔도 좋습니다. 단지 전 rainbow 기능을 수행하고 있다는 것을 강조하기 위해 해당 텍스트를 설정했습니다.

4) powerOn

전원이 켜진 상태이므로 powerOn을 true로 설정합니다.

5) colors[4] = 0

colors[4]의 값을 다시 0으로 설정합니다. 이 기능을 수행한 이후 다른 메서드를 실행할 때 레인보우 기능이 수행되는 것을 방지하기 위함입니다.

레인보우 기능은 이 메서드에서만 실행하기 때문에, 이 메서드 안에서 colors[4] 값의 변경을 모두 해줍니다. 즉, 0과 1의 값 설정 모두 이 메서드 내부에서 실행하도록 합니다.

5. 마무리

이번 시간에는 다양한 뷰들에 기능을 설정했습니다. 다음 시간에는 컬러피커 버튼 및 메서드에 대해 알아보겠습니다.

오늘 알려드진 정보가 많은 도움이 되었길 바랍니다.

 

 

728x90
반응형