극한의 아두이노 DIY생활 - 곡률측정기9

in kr-dev 커뮤니티3 years ago

안녕하세요 Jimae입니다.

오늘 부터는 소프트웨어 위주로 설명을 들어가 볼까합니다.

근대 문제가 있습니다.

image.png

아두이노로 여지껏 프로그램을 만들면서 거의 대부분 파일 하나에 프로그램을 만들었는대요.

이 프로젝트 같은경우 복잡하게 기능들이 엮어있기에 이렇게 나눠서 프로그램을 했습니다.

그래서 글을 쓰더라도 약간 혼동이 올것입니다.

우선 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부터 확인을 해보죠.

image.png

#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

위의 사이트에 들어가신다면 다운로드를 받을수있구요.

또한 사용방법을 예제프로그램으로 지원을 해줍니다.

image.png

이것을 보고 참고하신다면 금방 해보실수 있으실겁니다.

오늘은 여기까지 다음에 다시 이어서 할게요. 다들 좋은하루 되세요.

극한의 아두이노 DIY생활 - 곡률측정기1
극한의 아두이노 DIY생활 - 곡률측정기2
극한의 아두이노 DIY생활 - 곡률측정기3
극한의 아두이노 DIY생활 - 곡률측정기4
극한의 아두이노 DIY생활 - 곡률측정기5
극한의 아두이노 DIY생활 - 곡률측정기6
극한의 아두이노 DIY생활 - 곡률측정기7
극한의 아두이노 DIY생활 - 곡률측정기8

Sort:  
 3 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.12
TRX 0.33
JST 0.032
BTC 109613.84
ETH 3916.61
USDT 1.00
SBD 0.87