극한의 아두이노 DIY생활 - 곡률측정기11
안녕하세요 Jimae입니다.
저번에는 LCD와 조도센서 관련하여 글을 정리 했었습니다.
void setup() {
// put your setup code here, to run once:
LCDInit();
LightSensorInit();
RotaryInit();
SwitchInit();
LightInit();
Serial.begin (9600);
LaserInit();
MsTimer2::set(200, drawing); // flash함수를 200ms마다 호출한다
MsTimer2::start();
}
오늘은 로터리 스위치내요.
로터리 스위치는 저번에 정리한대로 외부 인터럽트를 바꿔야하는 라이브러리를 사용해야 합니다.
#include <PinChangeInt.h>
#define PINCLK 10
#define PINDT 11
//#define SW 4
//#define START 1
//#define STOP 0
int encoderPin1 = PINCLK;
int encoderPin2 = PINDT;
//int encoderSwitchPin = SW; //push button switch
volatile int lastEncoded = 0;
volatile long selectEncoderValue = 0;
volatile long lightEncoderValue = 50;
long selectdata = 0;
int lastMSB = 0;
int lastLSB = 0;
unsigned char selectCountFlag = STOP;
unsigned char lightCountFlag = STOP;
void RotaryInit(void)
{
pinMode(encoderPin1, INPUT_PULLUP);
pinMode(encoderPin2, INPUT_PULLUP);
// pinMode(encoderSwitchPin, INPUT);
//digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on
//call updateEncoder() when any high/low changed seen
//on interrupt 0 (pin 2), or interrupt 1 (pin 3)
attachPinChangeInterrupt(PINCLK, updateEncoder, CHANGE);
attachPinChangeInterrupt(PINDT, updateEncoder, CHANGE);
selectEncoderValue = 0;
lightEncoderValue = 50;
}
unsigned char RotarySelectRead(void)
{
selectCountFlag = START;
if(selectEncoderValue < 0) selectEncoderValue = 0;
else if(selectEncoderValue > 9) selectEncoderValue = 9;
selectdata = selectEncoderValue / 2;
return (unsigned char)(selectdata + 1); // LCD 뿌리는 함수값에 맞출려고 1더함 1~5
}
unsigned char RotaryDataRead(void)
{
selectCountFlag = STOP;
return (unsigned char)(selectdata + 1); // LCD 뿌리는 함수값에 맞출려고 1더함 1~5
}
unsigned char RotaryLightRead(void)
{
lightCountFlag = START;
if(lightEncoderValue < 0) lightEncoderValue = 0;
else if(lightEncoderValue > 100) lightEncoderValue = 100;
return (unsigned char)lightEncoderValue; // light 밝기
}
void RotaryLightCountStop(void)
{
lightEncoderValue = 50;
lightCountFlag = STOP;
}
void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
{
if(selectCountFlag == START) selectEncoderValue ++;
else if(lightCountFlag == START) lightEncoderValue ++;
}
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
{
if(selectCountFlag == START)selectEncoderValue --;
else if(lightCountFlag == START) lightEncoderValue --;
}
lastEncoded = encoded; //store this value for next time
}
void RotaryInit(void)
{
pinMode(encoderPin1, INPUT_PULLUP);
pinMode(encoderPin2, INPUT_PULLUP);
// pinMode(encoderSwitchPin, INPUT);
//digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on
//call updateEncoder() when any high/low changed seen
//on interrupt 0 (pin 2), or interrupt 1 (pin 3)
attachPinChangeInterrupt(PINCLK, updateEncoder, CHANGE);
attachPinChangeInterrupt(PINDT, updateEncoder, CHANGE);
selectEncoderValue = 0;
lightEncoderValue = 50;
}
그것을 사용한것이 attachPinChangeInterrupt 함수이죠.
void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
{
if(selectCountFlag == START) selectEncoderValue ++;
else if(lightCountFlag == START) lightEncoderValue ++;
}
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
{
if(selectCountFlag == START)selectEncoderValue --;
else if(lightCountFlag == START) lightEncoderValue --;
}
lastEncoded = encoded; //store this value for next time
}
실제 이어지로운 함수가 로터리 스위치가 움직일때 발생하는 신호들을 이용하여 이함수로 호출이 되는대요.
이것으로 현재 움직이는 방향을 알수있습니다.
시계방향인지 반대방향인지 알수있지만 약간 알아보기 힘들정도로 구현이 되어있내요.
그때 당시 이것을 구현할때 인터넷에 나와있는것을 참조하여 구현하였으며
selectEncoderValue = LCD 조작 인터페이스 전용 변수
lightEncoderValue = 조명 LED 밝기 조작 인터페이스 전용 변수
이렇게 각각 다른기능들도 같이 사용하기 위해 이렇게 하나에다 몰아서 구현을 하였기에 더욱더 보기가 어렵다고 생각이 드내요.
오늘은 여기까지 다들 좋은 하루 되세요.
극한의 아두이노 DIY생활 - 곡률측정기1
극한의 아두이노 DIY생활 - 곡률측정기2
극한의 아두이노 DIY생활 - 곡률측정기3
극한의 아두이노 DIY생활 - 곡률측정기4
극한의 아두이노 DIY생활 - 곡률측정기5
극한의 아두이노 DIY생활 - 곡률측정기6
극한의 아두이노 DIY생활 - 곡률측정기7
극한의 아두이노 DIY생활 - 곡률측정기8
극한의 아두이노 DIY생활 - 곡률측정기9
극한의 아두이노 DIY생활 - 곡률측정기10
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
새해 복 많이 받으십시오.
새해복 많이받으세요!