첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

728x90
반응형

▶ 부품 내역

구분 모델 수량 비고
LED   13  

▶ 회로 구성도

▶ 소스 코드

// LED 초기화 하기
// ledCount : LED 카운트
void LEDInitialize(int ledCount)
{
    for(int i = 1; i <= ledCount; i++)
    {
         pinMode(i, OUTPUT);
    }
}

// LED 파도타기
// ledCount   : LED 카운트
// delayTime  : LED간 전환 시간
// delayDelta : LED간 전환 시간 감소분
void LEDSuffing(int ledCount, int delayTime, int delayDelta)
{
    for(int i = delayTime; i >= 1; i -= delayDelta)
    {
        for(int j = 1; j <= ledCount; j++)
        {
            digitalWrite(j, HIGH);
            
            digitalWrite(j - 1, LOW);

            delay(i);
        }
        
        for(int j = ledCount - 1; j >= 1; j--)
        {
            digitalWrite(j, HIGH);
            
            digitalWrite(j + 1, LOW);

            delay(i);
        }
    }
}

// LED 대기
// ledCount  : LED 카운트
// delayTime : LED 스위치를 끄고 지정한 시간만큼 대기
void LEDWait(int ledCount, int delayTime)
{
    for(int i = 1; i <= ledCount; i++)
    {
        digitalWrite(i, LOW);
    }

    delay(delayTime);
}

// LED 스택
// ledCount  : LED 카운트
// delayTime : 지연 시간
void LEDStack(int ledCount, int delayTime)
{
    for(int i = ledCount; i >= 1; i--)
    {
        for(int j = 1; j <= i; j++)
        {
            digitalWrite(j, HIGH);

            digitalWrite(j - 1, LOW);

            delay(delayTime);
        }
    }
}

// LED 교차하기
// ledCount   : LED 카운트
// delayTime  : LED 전환 시간
// delayDelta : LED 전환 감소분
void LEDIntersect(int ledCount, int delayTime, int delayDelta)
{
    for(int k = delayTime; k >= 1; k -= delayDelta)
    {
        for(int i = 0; i <= (ledCount / 2); i++)
        {
            for(int j = 1; j <= ledCount; j++)
            {
                if(abs(i) == abs(j - 7))
                {
                    digitalWrite(j, HIGH);
                }
                else
                {
                    digitalWrite(j, LOW);
                }
            }

            delay(k);
        }

        for(int i = (ledCount / 2 - 1) ; i >= 1; i--)
        {
            for(int j = 1; j <= ledCount; j++)
            {
                if(abs(i) == abs(j - 7))
                {
                    digitalWrite(j, HIGH);
                }
                else
                {
                    digitalWrite(j, LOW);
                }
            }

            delay(k);
        }
    }
}

// LED 점프하기
// ledCount    : LED 카운트
// jumpSegment : 점프 세그먼트
// delayTime   : LED 지연 시간
// loopCount   : 루프 카운트
void LEDJump(int ledCount, int jumpSegment, int delayTime, int loopCount)
{
    float alpha = float(-4 * ledCount) / (float(jumpSegment) * float(jumpSegment));
    float beta  = float( 4 * ledCount) / float(jumpSegment);
    float x;
    float y;
    int   led;

    for(int i = loopCount; i >= 1; i -= 2)
    {
        for(x = 0; x < jumpSegment; x++)
        {
            y = alpha * x * x + beta * x;
        
            led = (int)(y + 0.5d);
    
            if(led != 0)
            {
                for(int j = 1; j <= ledCount; j++)
                {
                    if(j == led)
                    {
                        digitalWrite(j, HIGH);
                    }
                    else if(j == 14-led)
                    {
                        digitalWrite(j, HIGH);
                    }
                    else
                    {
                        digitalWrite(j, LOW);
                    }
                } 
            }
            delay(i);
        }
    }
}

void setup()
{
    LEDInitialize(13);
}

void loop()
{
    // LED 대기
    LEDWait(13, 5000);
    
    // LED 파도타기
    LEDSuffing(13, 50, 4);

    // LED 대기
    LEDWait(13, 2000);
    
    // LED 교차
    LEDIntersect(13, 100, 4);

    // LED 대기
    LEDWait(13, 2000);

    // LED 증속교차점프
    LEDJump(13, 100, 10, 20);
    
    // LED 대기
    LEDWait(13, 2000);

    // LED 스택
    LEDStack(13, 100);
    
    // LED 대기
    LEDWait(13, 5000);
}
728x90
반응형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요