메이킹/메이킹 프로젝트

라즈베리파이 보일러 제어기 제작

트리맨스 2019. 12. 24. 19:53
반응형

 

 

필자는 얼마전에 복학한 대학생 2학년이다. 그냥 평범한 공대생이다.

여느때와 다름없이 집에 도착해서 씻을려 하는데 온수가 너무 안나온다.

나온다 해도 15분 전부터 보일러를 틀어놔야지 온수가 바로 나온다.

이를 해결할 방법이 없을까? 고민하던 차에 원격으로 보일러를 제어하는 것을 만들기로 마음먹었다.

깜빡하고 보일러를 켜고 나오는것도 이거면 해결할수 있을거라 생각했다.

 

전공에선 나오지 않지만, 그래도 공대생인데 한번 만들어 보자 마음먹었다.

준비물은 이렇다.

 

라즈베리 파이

마이크로 sd카드

릴레이 스위치

점퍼선

 

이 부품들은 선정한 이유는 문서에 잘 나와있다. 먼저 라즈베리파이에 운영체제를 설치해주자. 아래 주소에 운영체제 설치법이 잘 나와 있다.

https://tre2man.tistory.com/146

 

다음으로 할 일은 서버를 외부 아이피 에서도 접속할 수 있게 해줘야 한다. 

서버를 만들고 원격제어 시스템을 만들어봤자 외부에서 접속이 불가능하면 아무 소용이 없지 않은가?

포트포워딩 을 해주자. 우리집 공유기인 a1004s 기준이므로, 다른 공유기는 설정이 다를 수 있다. 아래 링크에 자세히 설명이 되어 있다.

 

https://tre2man.tistory.com/161

 

공유기 설정창에 들어가자. 크롬을 열고 192.168.0.1 (아이피타임 기준) 에 접속하자.

NAT/라우터 관리 - 포트포워드 설정에서 포트포워딩이 가능하다.

 

 

규칙이름 - 원하는 대로 설정

내부아이피 주소 - 내부 네트워크 설정 - 라즈베리 파이 아이피주소 입력

프로토콜 - TCP

외부포트 : 아무거나   내부포트 : 아무거나 (아무도 모를만한 숫자로 하자. 0~99999)

 

그리고나서 외부에서 접속할때는 외부아이피:외부포트 형식으로 접속할 수 있다.

 

다음으로는 서버를 열고 릴레이를 제어 가능하게 해야한다.

필자는 node.js 와 express 를 이용한 예제를 수정했다.

밑에 링크에 있는 설명이 도움을 많이 주었다.

https://myelectronicslab.com/raspberry-pi-iot-server-node-js-led-control-express-js-ejs/

 

 

Raspberry PI IOT Server with Node JS | My Electronics Lab

Step By Step Tutorial on making one local server in Node JS and Control LED from remotely within your local network. Raspberry PI IOT Server with Node JS.

myelectronicslab.com

 

 

회로는 아래 사진과 같이 꾸몄다.

 

 

gpio 7번과 11번 포트를 외부 출력으로 설정했다.

릴레이 하나는 보일러 전원, 나머지 하나는 온수로 설정했다. 각 릴레이는 따로 작동한다.

 

(잠깐 릴레이 설명)

1개의 릴레이엔 3개의 단자가 있는데, 중간은 기본 단자고 하나는 nc(normally close) 이고 나머지 하나는 no(normally open) 단자다. 기본 단자와 no 단자에 연결했을 시에, 릴레이에 high 신호를 주면 닫힌 스위치가 되고, low 신호를 주면 열린 스위치가 된다.

 

Node.js 를 이용해 웹 서버에서 gpio를 직접 제어할 수 있다. gpio를 이용하기 위해서는 raspi-config에서 gpio 접근을 허용 해줘야 한다. 

이후에 코딩 내용을 수정하여, 내가 원하는 동작을 할 수 있게 구성을 한다.

 

index.js

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var express = require('express');
var app = express();
var path = require('path');
var gpio = require('rpi-gpio');
 
gpio.setup(7, gpio.DIR_OUT);
gpio.setup(11, gpio.DIR_OUT);
 
 
 
 
app.set('view engine''ejs');
 
app.use(express.static(path.join(__dirname, 'public')));
 
console.log(path.join(__dirname, 'public'));
 
app.get('/'function(req, res){
     res.render('index',{status:"상태를 변경할려면 버튼을 누르세요."});
});
 
app.post('/boiler/on'function(req, res){
gpio.write(7truefunction(err) {
        if (err) throw err;
        console.log('Written True to boiler');
    console.log(path.join(__dirname, 'public'));
    return res.render('index', {status: "보일러 전원 On"});
    });
 
});
 
app.post('/boiler/off'function(req, res){
gpio.write(7falsefunction(err) {
        if (err) throw err;
        console.log('Written False to boiler');
    console.log(path.join(__dirname, 'public'));
    return res.render('index',{status: "보일러 전원 Off"});
    });
});
 
app.post('/water/button'function(req, res){
gpio.write(11truefunction(err) {
        if (err) throw err;
        console.log('Written True to water');
    console.log(path.join(__dirname, 'public'));
    return res.render('index', {status: "온수 button 클릭"});
    });
 
setTimeout(function() {
  gpio.write(11falsefunction(err) {
        if (err) throw err;
        console.log('Written False to water');
    console.log(path.join(__dirname, 'public'));
    return res.render('index',{status: "온수 button 클릭"});
            });
          },500);
});
 
app.listen(3000function () {
  console.log('server start at 3000 port')
})
cs

 

index.ejs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<html> <!--.ejs-->
<head>
  <meta name="viewport" content="width=500, initial-scale=1"> <!--This line of code is for mobile responsive -->
</head>
 
<body bgcolor="#FFFFF2">
  <div class="BorderMargin">
    <form action="/boiler/on" method="post">
      <button type="submit" class="button4">보일러 On </button>
        <button type="submit" formmethod="post" formaction="/boiler/off" class="button1">보일러 Off </button>
    </form>
 
    <form action="/water/button" method="post">
      <button type="submit" class="button3">온수 button </button>
    </form>
 
    <a>현재 상태: <%=status %></a>
 
  </div>
 
</body>
 
 
  <style>
  /*  background-color:  #285943; */
    .button0 {
        background-color:  #8CD790;
        border: none;
        color: white;
        padding: 15px 32px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 4px 2px;
        cursor: pointer;
    }
 
    .button1 {
        background-color:  #77AF9C;
        border: none;
        color: white;
        padding: 15px 32px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 4px 2px;
        cursor: pointer;
    }
    .button3 {
        background-color:  #285943;
        border: none;
        color: white;
        padding: 15px 40px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 4px 2px;
        cursor: pointer;
    }
    .button4 {
        background-color:  #8CD790;
        border: none;
        color: white;
        padding: 15px 40px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 4px 2px;
        cursor: pointer;
    }
 
    #footer {
       position:fixed;
       left:0px;
       bottom:0px;
       height:60px;
       width:100%;
       background:#3F4B3B;
       color: white;
    }
    #footer p {
       text-align: center;
    }
  </style>
</html>
cs

 

 

회로를 꾸미고 라즈베리파이로 서버를 열어준다. 터미널을 열자.

sudo apt-get update

sudo apt-get install nodejs

sudo apt-get install build-essential

 

// 파이에 있는 프로그램들을 업데이트 해주고, 웹서버 오픈에 필요한 기초 파일들을 설치한다.

 

sudo apt-get install git

//깃허브에서 파일을 끌어올수 있게 한다.

 

git clone https://github.com/tre2man/control_hot.git

//코드를 파이로 불러온다. 다시 한번 https://myelectronicslab.com 에 감사를 표한다.

 

cd cotrol_hot

//control_hot 폴더로 이동한다.

 

npm install

sudo npm install gpio

sudo npm install rpi-gpio

node index.js

//서버를 실행한다.

 

그리고 기존 보일러 컨트롤러에 릴레이를 연결한다. 자취방에 사용하는 저렴한 제어기만 다루어 봐서 최신형 제어기는 잘 모르겠다. 어차피 최신형 제어기는 IOT 연동이 잘되서 밖에서도 제어할 수 있는 기능이 기본적으로 있는 것 같았다. 이때부터 전공 지식을 살려서 멀티미터로 전기가 통하는 곳을 하나씩 연결해서 제어를 할 수 있는 전원을 밖으로 빼준다.

왼쪽 : 설치준비, 오른쪽 : 전선 납땜 후 사진

 

작동이 정상적으로 이루어지는지 확인 해주자. 로컬로 한번 확인한 다음 외부 아이피로 접속해서 작동이 잘 되는지 확인해보자.

 

 

 

보일러가 잘 작동한다. 

하지만 저렇게 계속 둔다면 납땜한 전선과 파이의 전선들이 버틸 수 없을거 같았다.

다이소에서 크기가 적당한 반찬통을 사와서, 적당히 정리했다.

집이였으면 뭔가 적당한 대채제가 있을거 같은데, 자취생이라 하나부터 열가지 다 사야한다....

 

 

 

추후에 가능하다면 웹 UI 수정과 온도조절기능 까지 달아볼 생각이다.

하루 수업을 끝내고 집에서 바로 따뜻한 물로 씻을 때마다 뿌듯하다ㅋㅋ

 

반응형