본문 바로가기
Coding/Raspberry pi - node.js

실습 - PWM을 이용한 LED 밝기 제어

by hyun-am 2019. 10. 9.

사용한 부품

 

BUTTON

 

wpi : 29

 

LED

 

BLUE - wpi : 23

RED - wpi : 24

GREEN - wpi : 25

 

BUZZER

 

wpi - 22

 

실습 내용

 

버튼처리는 반드시 인터럽트방식을 이용하는데, 눌렀다가 떼는 순간에 처리한다.

 

3색 LED처리는 반드시 PWM방식을 사용합니다

 

버튼을 클릭할때마다 LED가 점점 밝아진다. 단, PWM은 1~100중에서 밝아지는 단계를 5개 단계로 구분합니다.(즉, 25씩으로 증가합니다. 예, 값이 1->25->50->75->100)

 

버튼을 클릭할때마다 켜지는 LED의 색상은 각 단계별로 초록->청색->빨간->흰색 순이며, 그 이후에는 다시 처음으로 되돌아 갑니다.

 

생상이 바뀌는 시점에 부져스피커가 0.05초간 짧게 울립니다.

 

프로그램은 무한 실행되며, ctrl + c 가 눌러지면 부져, LED 모두 끄고 종료됩니다. 

 

코드 구현

 

선언 코드 구현

 

const gpio = require('node-wiring-pi');

const BUTTON = 29;
const BLUE = 23;
const RED = 24;
const GREEN = 25;
const BUZZER = 22;
let btn_count = 0;
let led_count = 0;

const NextColor = function(){
    gpio.digitalWrite(BUZZER,1);
    gpio.delay(50);
    gpio.digitalWrite(BUZZER,0);
    btn_count++;
    led_count = 0;
}

 

구현 부분 코드

 

const DetectButton = function(){
    switch(btn_count){
        case 0:
            if(led_count === 0) gpio.softPwmWrite(GREEN,1);
            else if(led_count === 1) gpio.softPwmWrite(GREEN,25);
            else if(led_count === 2) gpio.softPwmWrite(GREEN,50);
            else if(led_count === 3) gpio.softPwmWrite(GREEN,75);
            else if(led_count === 4) gpio.softPwmWrite(GREEN,100);
            else {
                NextColor();
            }   
            led_count++;
            break;
        case 1:
            gpio.softPwmWrite(GREEN,0);
            if(led_count === 0) gpio.softPwmWrite(BLUE,1);
            else if(led_count === 1) gpio.softPwmWrite(BLUE,25);
            else if(led_count === 2) gpio.softPwmWrite(BLUE,50);
            else if(led_count === 3) gpio.softPwmWrite(BLUE,75);
            else if(led_count === 4) gpio.softPwmWrite(BLUE,100);
            else {
                NextColor();
            }
            led_count++;
            break;
        case 2:
            gpio.softPwmWrite(BLUE,0);
            if(led_count === 0) gpio.softPwmWrite(RED,1);
            else if(led_count === 1) gpio.softPwmWrite(RED,25);
            else if(led_count === 2) gpio.softPwmWrite(RED,50);
            else if(led_count === 3) gpio.softPwmWrite(RED,75);
            else if(led_count === 4) gpio.softPwmWrite(RED,100);
            else {
                NextColor();
            }
            led_count++;
            break;
        case 3:
            gpio.softPwmWrite(RED,0);
            if(led_count === 0){
                gpio.softPwmWrite(RED,1);
                gpio.softPwmWrite(GREEN,1);
                gpio.softPwmWrite(BLUE,1);
            }
            else if(led_count === 1){
                gpio.softPwmWrite(RED,25);
                gpio.softPwmWrite(GREEN,25);
                gpio.softPwmWrite(BLUE,25);      
            }
            else if(led_count === 2){
                gpio.softPwmWrite(RED,50);
                gpio.softPwmWrite(GREEN,50);
                gpio.softPwmWrite(BLUE,50);    
            }
            else if(led_count === 3){
                gpio.softPwmWrite(RED,75);
                gpio.softPwmWrite(GREEN,75);
                gpio.softPwmWrite(BLUE,75);
            }
            else if(led_count === 4){
                gpio.softPwmWrite(RED,100);
                gpio.softPwmWrite(GREEN,100);
                gpio.softPwmWrite(BLUE,100);
            }
            else {
                NextColor();
            }
            led_count++;
            break;
        case 4:
            gpio.softPwmWrite(GREEN,0);
            gpio.softPwmWrite(BLUE,0);
            gpio.softPwmWrite(RED,0);
            btn_count = 0;
            break;
        default:
            break;
    }
}

 

종료 및 실행 부분 코드

process.on('SIGINT',function(){
    gpio.softPwmWrite(RED,0);
    gpio.softPwmWrite(GREEN,0);
    gpio.softPwmWrite(BLUE,0);
    gpio.digitalWrite(BUZZER,0);
    console.log("프로그램을 종료합니다.");
    process.exit();
});
gpio.wiringPiSetup();
gpio.pinMode(BLUE,gpio.OUTPUT);
gpio.pinMode(RED,gpio.OUTPUT);
gpio.pinMode(GREEN,gpio.OUTPUT);
gpio.pinMode(BUZZER,gpio.OUTPUT);
gpio.pinMode(BUTTON,gpio.INPUT)
console.log("이벤트 방식 : 버튼을 누르면 LED가 켜집니다...");
gpio.wiringPiISR(BUTTON,gpio.INT_EDGE_RISING,DetectButton);
gpio.softPwmCreate(BLUE, 0,100);
gpio.softPwmCreate(RED, 0,100);
gpio.softPwmCreate(GREEN, 0,100);

 

 

댓글