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

실습 사운드센서, 광센서를 웹에 연결시키기

by hyun-am 2019. 11. 17.

실습문제 조건

 

1. 아날로그 사운드 센서는 0번채널에, 아날로그 광센서는 1번채널에 연결합니다.

2. SMD 3색 LED는 브래드보드를 이용해서 라즈베리파이와 연결합니다.

3. 광센서에서 아날로그 값(0~4095)에 따라서 LED의 밝기(0~100)를 PWM방식으로 제어합니다. 밝기 정도를 10개 구간으로 나누고 밝은 정도에 따라서 LED의 밝기를 제어합니다.

4. 광센서 아날로그 값을 등급화 할 때, 광센서 ON/OFF를 각각 제어할 수 있어야 합니다.

5. 웹 UI에서 사운드센서 ON/OFF, 광센서 ON/OFF를 각각 제어할 수 있어야 합니다.

6. ctrl+c를 누르면 LED,광센서,사운드센서를 모두 OFF 시킨후 프로그램을 종료합니다. 

 

하드웨어 구성도

 

MCP3208

 

왼쪽

ㅁ - 사운드 센서(A)

ㅁ - 광센서(A)

 

오른쪽

ㅁ - 브래드보드(+)

ㅁ - 브래드보드(+)

ㅁ - 브래드보드(-)

ㅁ - 물리번호(23)

ㅁ - 물리번호(21)

ㅁ - 물리번호(19)

ㅁ - 물리번호(24) wpi-10번

ㅁ - 브래드보드(-)

 

LED : 물리번호(36) wpi-27

 

SOUND : mcp3208 CH0

LIGHT : mcp3208 CH1

 

코드구현

 

js 부분

 

선언부분

 

const fs = require('fs');
const express = require('express');
const bodyParser = require("body-parser");
const app = express();

const gpio = require("node-wiring-pi");
const mcpadc = require("mcp-spi-adc");

const CS_MCP3208 = 10;
const SPI_SOUND = 0;
const SPI_LIGHT = 1;

const SPI_SPEED = 100000;
const RED = 27;
var QuietSound = 1997;
var sid;
var lid;

const soundsensor = mcpadc.openMcp3208(
    SPI_SOUND,
    {speedHz:SPI_SPEED},
    err =>{
        console.log("MCP-ADC 초기화!");
    if(err) console.log("MCP-ADC 초기화 오류! HW점검");
    }
);

const lightsensor = mcpad.openMcp3208(
    SPI_LIGHT,
    {speedHz:SPI_SPEED},
    err=>{
        console.log("MCP-ADC 초기화!");
    if(err) console.log("MCP-ADC 초기화 오류! HW점검");
);

app.use(bodyparser.urlencoded({extended:false}));

 

함수 구현부분

 

const SoundDetect = () =>{
    soundsensor.read((error,reading)=>{
        console.log("▲ ▼ (%d)", reading.rawValue);
        if(reading.rawValue > QuietSound)
       	// 필터링 기준값이 이상 크기이면 출력
        console.log("기준값:(%d), 아날로그 측정값(%d)",
        QuietSound,
        reading.rawValue
        );
    else console.log("인식안함");
    });
    sid = setTimeout(SoundDetect,200);
};

const LightDetect = () =>{
    lightsensor.read((error,reading)=>{
        console.log("▲ ▼ (%d)", reading.rawValue);
        let lightPwr = reading.rawValue;
        if(lightPwr === 0){
            LEDOn(100);
            gpio.softPwmWrite(RED,100);
            console.log(lightPwr);
        }
        else if(lightPwr >=1 && lightPwr <820){
            LEDOn(90);
        }
        else if(lightPwr >= 821 && lightPwr < 1230){
            LEDOn(80);
        }
        else if(lightPwr >= 1231 && lightPwr < 1640){
            LEDOn(70);
        }else if(lightPwr >= 1641 && lightPwr < 2050){
            LEDOn(60);
        }else if(lightPwr >= 2051 && lightPwr < 2460){
            LEDOn(45);
        }else if(lightPwr >= 2461 && lightPwr < 2870){
            LEDOn(30);
        }else if(lightPwr >= 2871 && lightPwr < 3280){
            LEDOn(10);
        }else if(lightPwr >= 3281 && lightPwr < 3690){
            LEDOn(1);
        }else if(lightPwr >= 3691 && lightPwr <= 4095){
            LEDOn(0);
        }
    });
    lid = setTimeout(LightDetect,200);
};

const LEDOn = pwr =>{
    gpio.softPwmWrite(RED,0);
    gpio.softPwmWrite(RED,pwr);
    console.log(pwr);
};

 

express app 부분

 

app.get("/",(req,res)=>{
    console.log("sensor 호출");
    fs.readFile("web_analog.html","utf8",(error,data)=>{
        if(!error) res.send(data);
    });
});

app.get("/0",(req,res)=>{
    console.log("사운드센서 비활성화 수행");
    clearTimeout(sid);
    res.redirect("/");
});

app.get("/1",(req,res)=>{
    console.log("사운드센서 활성화 수행");
    sid = setTimeout(SoundDetect,200);	// 활성화
    res.redirect("/");
});

app.get("/2",(req,res)=>{
    console.log("광센서 비활성화 수행");
    clearTimeout(lid);
    res.redirect("/");
});

app.get("/3",(req,res)=>{
    console.log("광센서 활성화 수행");
    lid = setTimeout(LightDetect,200);
    res.redirect("/");
});

app.post("/",(req,res)=>{
    let body = req.body;
    console.log("기준값이 다음값으로 설정됩니다.");
    console.log("==> : "+ body+threshold);
    QuietSound = body.threshold;
    res.redirect("/");
});

process.on('SIGINT',()=>{
    soundsensor.close(()=>{
        process.exit();
    });
    lightsenor.close(()=>{
        process.exit();
    });
    gpio.softPwmWrite(RED,0);
    process.exit();
});

app.listen(60001,()=>{
    gpio.wiringPiSetup();
    gpio.pinMode(CS_MCP3208,gpio.OUTPUT);
    gpio.pinMode(LED,gpio.OUTPUT);
    gpio.softPwmCreate(RED,0,100);
    console.log("--------------------------------------------------");
    console.log("사운드센서 제어용 웹서버(인식용기준값:%d)",QuietSound);
    console.log("웹브라우저 접속 주소 : http://아이피주소:60001");
    console.log("--------------------------------------------------");
});

 

html 코드

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>임베디드 시스템 제어</title>

</head>
<body bgcolor="lightcyan">
    <h2>임베디드시스템제어</h2>
    <hr>
    <h3>센서측정제어</h3>
    <hr>
    <ul>
        <li>
            <a href="/1">사운드센서측정ON</a>
        </li>
        <li>
            <a href="/0">사운드센서측정OFF</a>
        </li>
    </ul>
    <h3>광센서측정제어</h3>
    <hr>
    <ul>
        <li>
            <a href="/3">광센서측정ON</a>
        </li>
        <li>
            <a href="/2">광센서측정OFF</a>
        </li>
    </ul>
    <hr>
    <h3>기준값 설정</h3>
    <h6>기준값 입력범위 : 0~4095(12비트) 입력값으로 조정가능</h6>
    <hr>
    <form name="soundon" method="POST">
        <div class="input">
            <span class="label">기준값</span>
            <input type="text" name = "threshold">
        </div>
        <hr>
        <div class="input">
            <input type="submit" value="기준값 설정">
        </div>
    </form>
</body>
</html>

댓글