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

실습 - 버튼, 광센서, 터치센서, Relay를 이용한 프로그램

by hyun-am 2019. 10. 7.

1. 필요한 부품

 

BUTTON

 

wpi : 29

 

LIGHT 

 

wpi : 28

 

TOUCH

 

wpi : 21

 

BUZZER

 

wpi : 26

 

LED

 

RED - wpi : 23

GREEN - wpi : 24

BLUE - wpi : 27

 

RELAY

 

wpi : 25

 

2. 구현 내용

 

Touch센서에 터치할때마다, 1색 LED가 0.2초동안 켜졌다 꺼진다.

 

버튼을 첫 번째 누르면 부져소리가 0.1초동안 나면서 3색 LED가 모두 켜진다.

 

3색 LED가 모두 켜져있을때만 광센서가 빛을 센싱을 할 수 있다.

 

광센서에서 변화(밝음 →  어두움)가 측정되면 Relay를 제어하여 전류를 흐르게한다.

 

광센서에서 변화(어두움 → 밝음)가 측정되면 Relay를 제어하여 전류를 차단시킨다.

 

버튼을 두 번째 누르면 부져소리가 0.1초 동안 나면서 3색 LED가 모두 꺼진다.

 

무한 반복 실행되며, ctrl + c를 누르면 모든 LED, 부져, 릴레이가 모두 꺼진 후 프로그램이 종료된다.

 

 

3. 코드구현

 

선언 부분 구현

 

const gpio = require('node-wiring-pi');
const BUTTON = 29;
const LIGHT = 28;
const TOUCH = 21;
const BUZZER = 26;
const RED = 23;
const GREEN = 24;
const BLUE = 27;
const RELAY = 25;

var btncount = 0;
let clock = null;

 

구현 부분 구현

 

const CheckTouch = function(){
    let data = gpio.digitalRead(TOUCH);
    if(data){
        gpio.digitalWrite(RED,1);
        gpio.delay(100);
        gpio.digitalWrite(RED,0);
    }
    setTimeout(CheckTouch,3000);
}

const CheckLight = function(){
    let data = gpio.digitalRead(LIGHT);
    if(!data){
        gpio.digitalWrite(RELAY,gpio.HIGH);
        console.log("RELAY ON");
    }
    else{
        gpio.digitalWrite(RELAY,gpio.LOW);
        console.log("RELAY OFF");
    }
    clock = setTimeout(CheckLight,300);
}

const CheckButton = function(){
    let data = gpio.digitalRead(BUTTON);
    if(!data){
        switch(btnCount){
            case 0:
                btnCount++;
                gpio.digitalWrite(BUZZER,1);
                gpio.delay(100);
                gpio.digitalWRite(BUZZER,0);
                gpio.digitalWrite(RED,1);
                gpio.digitalWrite(BLUE,1);
                gpio.digitalWrite(GREEN,1);
                CheckLight();
                break;
            case 1:
                clearTimeout(clock);
                gpio.digitalWrite(BUZZER,1);
                gpio.delay(100);
                gpio.digitalWrite(BUZZER,0);
                gpio.digitalWrite(RED,0);
                gpio.digitalWrite(BLUE,0);
                gpio.digitalWrite(GREEN,0);                
                btnCount = 0;
                break;
            default:
                console.log(btnCount);
                console.log("pressed");
        }
    }
        setTimeout(CheckButton,300);
}

 

종료 및 실행부분 구현

 

process.on('SIGINT',function(){
                gpio.digitalWrite(BUZZER,0);
                gpio.digitalWrite(RED,0);
                gpio.digitalWrite(BLUE,0);
                gpio.digitalWrite(GREEN,0);
                console.log("exit");
                process.exit();
                });

gpio.setup('wpi');
gpio.pinMode(BUTTON, gpio.INPUT);
gpio.pinMode(LIGHT,gpio.INPUT);
gpio.pinMode(TOUCH,gpio.INPUT);
gpio.pinMode(RELAY,gpio.OUTPUT);
gpio.pinMode(BLUE,gpio.OUTPUT);
gpio.pinMode(RED,gpio.OUTPUT);
gpio.pinMode(GREEN,gpio.OUTPUT);
setTimeout(CheckTouch,100);
setImmediate(CheckButton);

댓글