극한의 아두이노 DIY생활 - 곡률측정기9
안녕하세요 Jimae입니다.
오늘 부터는 소프트웨어 위주로 설명을 들어가 볼까합니다.
근대 문제가 있습니다.
아두이노로 여지껏 프로그램을 만들면서 거의 대부분 파일 하나에 프로그램을 만들었는대요.
이 프로젝트 같은경우 복잡하게 기능들이 엮어있기에 이렇게 나눠서 프로그램을 했습니다.
그래서 글을 쓰더라도 약간 혼동이 올것입니다.
우선 setup 함수부터 살펴볼까요?
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();
}
하드웨어 초기화를 하기위해 setup함수를 쓰는대요.
LCD 와 조도센서 로터리 스위치, 조명 LED, 레이저 기기
이렇게 순차적으로 초기화를 진행합니다.
그러면 LCD부터 확인을 해보죠.
#include <LiquidCrystal_I2C.h>
#define LCD_ADDRESS 0x3F
#define LINE_LENGTH 5
#define SCREEN_LINE_LENGTH 3
enum{CURVATURE = 1,DISTANCE, WINDSPEED, ILLUMINANCE, LIGHT};
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 4);
String Title = " KEPCO Measure ";
String Function[LINE_LENGTH] = {
"1.Curvature ",
"2.Distance ",
"3.Wind Speed ",
"4.Illuminance ",
"5.Light " };
String LCDScreen[SCREEN_LINE_LENGTH];
unsigned char plusAdd = 0;
unsigned char screenNumber = 1;
void LCDInit(void)
{
lcd.begin();
lcd.backlight();
LCDSelect(1);
}
void LCDdrawing(void)
{
lcd.setCursor(0, 0);
lcd.print(Title);
for(unsigned char num = 0; num < 3; num++)
{
lcd.setCursor(0, (num + 1));
lcd.print(LCDScreen[num]);
}
}
void LCDclear(void)
{
for(unsigned char num = 0; num < 3; num++)
{
LCDScreen[num] = " ";
}
}
void LCDSelect(unsigned char selectLine)
{
String screenBuffer[LINE_LENGTH];
if(selectLine > LINE_LENGTH && selectLine < 1) return; // 1~4 사이 데이터
for(unsigned char num1 = 0; num1 < LINE_LENGTH; num1++)
{
if((selectLine - 1) == num1) screenBuffer[num1] = '>' + Function[num1]; // selectLine 현재 배열의 주소값으로 계산 하기 때문에 -1
else screenBuffer[num1] = ' ' + Function[num1];
}
if(screenNumber == 1 && selectLine >= 4) screenNumber = 2;
else if(screenNumber == 2 && selectLine == 1) screenNumber = 1;
else if(screenNumber == 2 && selectLine == 5) screenNumber = 3;
else if(screenNumber == 3 && selectLine <= 2) screenNumber = 2;
if(screenNumber == 1) plusAdd = 0;
else if(screenNumber == 2) plusAdd = 1;
else plusAdd = 2;
for(unsigned char num2 = 0; num2 < 3; num2++)
{
LCDScreen[num2] = screenBuffer[num2 + plusAdd];
}
LCDdrawing();
LCDclear();
}
void LCDSensorView(unsigned char selectSensor)
{
switch(selectSensor)
{
case CURVATURE:
CurvatureCalculationStart();
LCDScreen[1] = " R" + String(CurvatureRead()) + " cm ";
break;
case DISTANCE:
DistanceCalculationStart();
LCDScreen[1] = " " + String(DistanceRead()) + " cm ";
break;
case WINDSPEED:
LCDScreen[1] = " " + String(WindSensorRead()) + " m/s ";
break;
case ILLUMINANCE:
LCDScreen[1] = " " + String(LightSensorRead()) + " lux ";
break;
case LIGHT:
LightControl(RotaryLightRead());
LCDScreen[1] = "Please";
LCDScreen[2] = "Volume control";
break;
default:
break;
}
LCDdrawing();
LCDclear();
}
LCD 부분만 프로그램을 이렇게 쓰자면 엄청나게 길어집니다.
LCD 같은경우 라이브러리를 사용했습니다.
LiquidCrystal_I2C 이름은 이것입니다.
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
위의 사이트에 들어가신다면 다운로드를 받을수있구요.
또한 사용방법을 예제프로그램으로 지원을 해줍니다.
이것을 보고 참고하신다면 금방 해보실수 있으실겁니다.
오늘은 여기까지 다음에 다시 이어서 할게요. 다들 좋은하루 되세요.
극한의 아두이노 DIY생활 - 곡률측정기1
극한의 아두이노 DIY생활 - 곡률측정기2
극한의 아두이노 DIY생활 - 곡률측정기3
극한의 아두이노 DIY생활 - 곡률측정기4
극한의 아두이노 DIY생활 - 곡률측정기5
극한의 아두이노 DIY생활 - 곡률측정기6
극한의 아두이노 DIY생활 - 곡률측정기7
극한의 아두이노 DIY생활 - 곡률측정기8
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.