자유게시판

IOT 실시간 대시보드(라즈베리파이)

별메아리 2023. 5. 21. 11:18
728x90

우여곡절끝에 첫 번째 프로젝트가 끝나고 2번째 프로젝트를 시작할 시간이 되었고, 이번 프로젝트에서는 실시간 대시보드를 만들게 되었다. 생체데이터를 실시간으로 view로 전달해서 그래프형식으로 나타내기 하였으나 실시간 생체데이터를 받아올 곳은 없으니 우리가 실시간으로 측정 후 데이터를 받아와서 뿌려주기로 하였다.

 

처음에는 애플워치를 이용한 심박수 데이터를 가져오려고 하였으나 어플리케이션 개발은 해보질않아서 난항을 겪어 라즈베리 파이를 이용한 데이터를 가져오기로 하였다.

 

위 사진과 같이 기온,고도,기압을 측정후 서버로 전달 후 서버에서 자바스크립트로 불러와서 데이터를 가져오는식으로 대시보드를 완성했다.

from flask.json import jsonify
import mysql.connector
import Adafruit_BMP.BMP085 as BMP085
import time
import threading
from flask import Flask, render_template
from flask import Request


# MySQL 서버 연결 설정
db = mysql.connector.connect(
    host='192.168.30.8',
    user='Jin',
    password='0712',
    database='kakao'
)

cursor = db.cursor()

# BMP180 센서 객체 생성
sensor = BMP085.BMP085(busnum=1)

# Flask 애플리케이션 생성
app = Flask(__name__)

# 서버에 값 전달
@app.route('/update_sensor_data')
def update_sensor_data():
    temp = sensor.read_temperature()
    pressure = sensor.read_pressure()
    altitude = sensor.read_altitude()
    sensor_data = {'temp': temp, 'pressure': pressure, 'altitude': altitude}
    return jsonify(sensor_data)

# 루트 경로 처리
@app.route('/')
def home():
    return render_template('html/home.html')

# 데이터 측정 및 저장 함수
def measure_and_store_data():
    try:
        temp = sensor.read_temperature()
        pressure = sensor.read_pressure()
        altitude = sensor.read_altitude()
        timestamp = time.strftime('%Y-%m-%d %H:%M:%S')

        # 데이터베이스에 데이터 저장
        query = "INSERT INTO sensor_data(temp, pressure, altitude, timestamp) VALUES (%s, %s, %s, %s)"
        values = (temp, pressure, altitude, timestamp)
        cursor.execute(query, values)
        db.commit()
        print("데이터 저장 완료")

    except mysql.connector.Error as error:
        print("MySQL 예외 발생:", error)

# 초기 데이터 저장
measure_and_store_data()

# 추가적인 데이터 측정 및 저장
@app.before_first_request
def start_measurement():
    def run_measurement():
        while True:
            measure_and_store_data()
            time.sleep(5)  # 5초 간격으로 측정

    measurement_thread = threading.Thread(target=run_measurement)
    measurement_thread.start()

# Flask 애플리케이션 실행
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

# 연결 종료
cursor.close()
db.close()

데이터를 측정후 DB에 저장하는 부분과 측정해서 view로 가져가는 부분을 따로 작성하였다.

가져간 후  대쉬보드에 있는 차트에 데이터를 배열형식으로 넣어주고 삭제하는 형식으로 실시간 대시보드를 구성하였다.

각 데이터가 들어간 시간과 함께 차트에 나타내준다 배열이 5개일때 데이터를 하나 지워주고 새로 삽입하여 새로운 데이터를 표현한다. 버튼 2개를 넣어주어 데이터의 전송을 중지하거나 다시 시작하여 받아올 수 있다.

원래 표현하려던 것은 표현했으나 애플워치의 데이터를 갖고오는데에는 시간부족과 지식부족이 매우 커서 아쉬움이 남았던 프로젝트였다. 삼성에 있는 헬스 데이터도 가져오려고 하였으나, sdk 에서 어플리케이션 지원 중단으로 인해 api를 가져오는게 안되는것 같았다.

이번 프로젝트는 데이터를 측정해서 가져오며 실시간처럼 보이게 대시보드에 뿌려주는 간단한 프로젝트 였음에도 데이터를 어떻게 수집할건지 실시간으로 어떻게 뿌려줘야 하는지 고민해보는 시간을 가지며 좋은 경험이 된 프로젝트 였던것 같다.

 

다음에 비슷한 프로젝트를 한다면 좀 더 완성도 있게 만들수 있지 않을까 하고 생각해본다. 이상 마치겠다람쥐

 

728x90