실습문제 조건
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>
'Coding > Raspberry pi - node.js' 카테고리의 다른 글
실습 임베디드와 REST API를 이용한 LED 제어 (0) | 2019.11.18 |
---|---|
REST API 예제 (0) | 2019.11.17 |
실습 socket.io를 활용하여 1색LED, Buzzer, 3색LED Control (0) | 2019.11.17 |
Raspberry pi를 express를 통한 웹 연결 (0) | 2019.11.17 |
웹기반 조이스틱 제어 (0) | 2019.11.17 |
댓글