Project

Python 기반의 홈 IoT 구현

serin99 2023. 5. 10. 19:54
728x90

 

 

1. 라즈베리파이와 DHT 11 온습도 센서를 이용하여 온도, 습도를 측정하며,

센서의 데이터를 확인하고, 출력하는 예제를 수행한다.

 

 

2. Flask를 이용하여 온습도 정보를 서버 전송한다.

센서 데이터를 서버에게 전달하는 예제를 수행한다.

 

 

3. 수신된 온습도 정보를 이용하여 온습도 상태 표현한다.

라즈베리파이가 보내는 데이터를 저장하고, 출력하는 웹 서버를 구축한다.

 

 

 

DHT 11 온습도 센서 테스트

 

DHT 11 온습도 센서는 가격이 저렴하고, 실습 용도에 적합하다.

 

센서만 사용한다면 저항이 필요하고, 모듈형은 저항이 붙어있어 따로 저항이 필요 없다.

 

정전식 습도 센서와 써미스터를 사용하여 온습도를 측정한다.

 

 

 

DHT 11 센서 모듈과 라즈베리파이의 연결을 위 그림과 같이 연결한다.

 

그런 다음 라즈베리파이에 python3을 설치하기 위해

다음의 명령어를 라즈베리파이 터미널창에 입력한다.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3

 

라즈베리파이에 DHT 센서 모듈을 다루기 위한 라이브러리를 추가하기 위해

다음의 명령어를 라즈베리파이 터미널창에 입력한다.

sudo git clone http://github.com/adafruit/Adafruit_Python_DHT

cd Adafruit_Python_DHT
sudo python setup.py

 

그다음 라즈베리파이에서 다음의 소스코드를 작성한다.

import time
import Adafruit_DHT
 
sensor = Adafruit_DHT.DHT11
pin = 4

try:
	while True:
		h, t = Adafruit_DHT.read_retry(sensor, pin)
		if h is not None and t is not None:
			print("Temperature = {0:0.1f}*C Humidity = {1:0.1f}%".format(t, h))
		else:
			print("Read Error")
			time.sleep(1)
 
except KeyboardInterrupt:
	print("Error")

finally:
	print("End Program")

 

마지막으로 센서의 동작을 확인하기 위해 터미널에서 다음 명령어를 입력하여 프로그램을 실행한다.

sudo python /read_dht11_nonserver.py

위 그림과 같이 터미널에서 1초 간격으로 온습도 값이 출력되는 것을 확인할 수 있다.

 

 

Flask를 이용한 온습도 정보 서버 전송하기

 

동작 환경을 구성하기 위해 경로 설정을 한 다음

세부 폴더와 소스코드를 추가한다.

 

 

<flask-live-chart.py>

 

import json
from time import time
from random import random
from flask import Flask, render_template, make_response
from flask_restful import reqparse
 from ServerData import ServerData
 
app = Flask(__name__)
server_Data = ServerData(None)


@app.route('/')
def hello_world():
	return render_template('index.html', data='test')
	return render_template('index.html')

@app.route('/send-data', methods=['POST'])
def send_data():
	parser = reqparse.RequestParser()
	parser.add_argument('temperature', type=str)
	args = parser.parse_args()
	server_Data.insert_data(args['temperature'])
	print(args['temperature'])
	return {'send': args['temperature']}

@app.route('/live-data')
def live_data():
 # Create a PHP array and echo it as JSON
 
 # data = [time() * 1000, random() * 100]
 # response = make_response(json.dumps(data))
 # response.content_type = 'application/json'
 # return response
 
	data = [time() * 1000, float(server_Data.get_data()), random() * 100]
	print(data)

	response = make_response(json.dumps(data))
	response.content_type = 'application/json'
	return response
 
if __name__ == '__main__':
	app.run(debug=True, host='자신의 ip', port=5000)

 

<ServerData.py>

 

class ServerData:
	data = ''
 	
    def __init__(self, data):
    	self.data = data
    
    def insert_data(self,data):
    	self.data = data
        
    def get_data(self):
    	print(self.data)
        return self.data

 

<static\js\highcharts.js>

 

var chart;

/*
 * Request data from the server, add it to the graph and set a timeout
 * to request again
 */

function requestData() {
  $.ajax({
    url: "/live-data",
    success: function (point) {
      var series = chart.series[0],
        shift = series.data.length > 20;
      // shift if the series is
      // longer than 20
      // add the point
      chart.series[0].addPoint(point, true, shift);
      // call it again after one second
      setTimeout(requestData, 1000);
    },
    cache: false,
  });
}

$(document).ready(function () {
  chart = new Highcharts.Chart({
    chart: {
      renderTo: "data-container",
      defaultSeriesType: "spline",
      events: {
        load: requestData,
      },
    },
    title: {
      text: "Temperature data",
    },
    xAxis: {
      type: "datetime",
      tickPixelInterval: 150,
      maxZoom: 20 * 1000,
    },
    yAxis: {
      minPadding: 0.2,
      maxPadding: 0.2,
      title: {
        text: "Value",
        margin: 80,
      },
    },
    series: [
      {
        name: "temperature",
        data: [],
      },
    ],
  });
});

 

<templates\Index.html>

 

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Flask Highcharts Live Data Demo</title>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.ss/bootstrap.min.css">
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header"> 
<a class="navbar-brand" href="/">Flask-Live-Chart</a>
</div>
{# <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">#}
{# <ul class="nav navbar-nav">#}
{# <li><a href="#">A link</a></li>#}
{# </ul>#} 
{# </div><!-- /.navbar-collapse -->#}
</div>
</div>
<div class="jumbotron">
<div class="container-fluid">
<br/>
<p>Live data plotting using Flask and Highcharts.</p>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="container-fluid" id="data-container"></div>
</div>
</div>
<hr>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/highcharts-more.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>
<script src="/static/js/highcharts.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.s/bootstrap.min.js"></script>
</body> 
</html>

 

templates\live-data-html

 

{{data}}

 

터미널에서 위와 같은 소스코드를 입력한 다음 터미널에서 다음 명령어를 입력하여 프로그램을 실행시킨다.

 

python\flask-live-charts-master
python flask-live-chart.py

 

아래의 그림과 같이 서버가 시작된 것을 확인할 수 있다.

 

 

 

수신된 온습도 정보를 이용하여 온습도 상태 표현하기

 

 

환경을 구성하기 위해 라즈베리파이에 Flask-RESTful 설치한다.

sudo apt-get install python-pip
sudo pip install flask
sudo pip install flask-restful

 

라즈베리파이에서 다음 소스코드를 작성한다.

 

 

<read_dht11.py>

 

import time
import Adafruit_DHT
import requests

URL = "http: // 자신의 ip: 5000"
sensor = Adafruit_DHT.DHT11
pin = 4

try:
    while True:
        h, t = Adafruit_DHT.read_retry(sensor, pin)
        if h is not None and t is not None:
            data = {'temperature': str(t)}
            print(data)
            res = requests.post(URL + "/send-data", data)
        else:
            print("Read Error")
            time.sleep(1)

except KeyboardInterrupt:
    print("Error")

finally:
    print("End Program")

 

터미널에서 다음 명령어를 입력하여 프로그램을 실행한다

 

sudo python ./read_dht11.py

 

서버에서 데이터를 보내는 것을 확인할 수 있다.

 

 

웹 브라우저를 실행하고, "http:// [자신의 IP]:5000"으로 접속하여 결과를 확인할 수 있다.

 

728x90