---
# System prepended metadata

title: 物件導向期末專題-加速規應用於交通工具

---

# 物件導向期末專題-加速規應用於交通工具

物件導向期末專題

成員:林明威 林彥鈞	鍾詠傑	黃少遠

服務單位
Email

## 摘要

目標:交通工具是人們生活不可或缺的一部分，不但與生活息息相關，防範交通事故也是重要公共議題。本專題目的為利用raspberry pi與加速規測量交通工具的即時加速度並實時檢測，並探討其影響因素。

方法:以樹梅派上的加速規偵測器傳送資料到實驗室電腦資料庫，再透過程式抓資料到Grafana上，最後以網頁呈現Grafana資料。

結果:

結論:


關鍵詞:物件導向程式、樹梅派、資料庫、智慧製造

other
交通部今公布110年度道路交通事故統計，共計發生35萬6779件事故、造成2990人死亡及47萬4376人受傷。可見交通工具安全十分重要。

## 軟體功能介紹


## 程式架構介紹

![](https://i.imgur.com/mCJogwl.png)


資料取得:
	使用感測器連接一微處理器取得資料，此感測器需要配合應用環境選擇，
	微處理器部分，助教推薦使用Arduino或樹莓派Raspberry pi，上手容易，泛用性高並且網上教學繁多。
微處理器需要進行的工作有二:
1.	接收感測器資料: 利用Arduino或樹莓派上的GPIO 腳位接取資料。
2.	傳送資料: 透過泛用的http請求將資料送往儲存伺服器。
編輯程式方面，Aruido可利用本身的Arduino IDE進行
而樹莓派可以當作他是一台小電腦，比Arduino性能更好，但使用前需要先裝好系統，樹莓派GPIO腳位相關程式教學網路上應該一抓一大把

資料儲存:
獲得資料後，為了將資料保存起來並進行後續運用，為此需要架設一伺服器。
本次專題使用了實驗室的電腦作為伺服器，將資料存在node.js server上的PostgresSQ並加上TimeScaleDB extension來實現時序資料庫處理
這次專題資訊與時間相關性高，選擇使用時序資料庫處理。

	雲端伺服器需要進行的工作有三:
1.	接收資料: 接收http請求功能
2.	儲存資料庫: 須能連結資料庫將資料存入
3.	開放接口: 為了後續資料呈現等相關應用，需開放造訪資料庫的接口

資料呈現:
	為了方便人員對歷史資料進行分析或觀察，將資料圖表化是最為常見的手段，本次使用Grafana圖表功能，從資料庫撈出資料化成圖表。
    
    
至此，遠端監控架構已初步完成，監控人員僅需觀察圖表便可了解觀測目標當前狀況，不必現場觀察目標。最後，為了進一步減輕人員負擔，對資料進行異常判斷，當異常發生時自動通報，本次使用line notify通報，line在全台灣是數一數二高普及率的軟體，做為通報手段再適合不過。



## 程式設計技巧分析





```
# mpu6050介紹:
# https://blog.gtwang.org/iot/raspberry-pi-mpu6050-six-axis-gyro-accelerometer-1/
# mpu6050套件:
# https://github.com/m-rtijn/mpu6050
# Python多線程:
# https://docs.python.org/3/library/threading.html

import time
from mpu6050 import mpu6050
import requests
from threading import Thread
import math

url = 'http://140.122.103.145:8191/gsensor/log'
sensor = mpu6050(0x68)
x = 0
y = 0
z = 0
count = 0
###dT
dT=0.1
Vx=0
Vy=0

def cal():
    global x, y, z, count # 多線程取全域變數使用global
    accelerometer_data = sensor.get_accel_data(g = True)
    # 累積加速度(不考慮方向)
    x += abs(accelerometer_data['x'])
    y += abs(accelerometer_data['y'])
    z += abs(accelerometer_data['z'])
    count += 1
    #計算速度
    Vx+=accelerometer_data['x']*dT
    Vy+=accelerometer_data['y']*dT
    V=math.sqrt(Vx*Vx+Vy*Vy)

def req():
    global x, y, z, count # 多線程取全域變數使用global
    # 計算平均加速度(不考慮方向)
    myobj = {
        'x': x / count,
        'y': y / count, 
        'z': z / count,
        #速度欄位
        'Vx':Vx,
        'Vy':Vy,
        'V':V
        }

    print(count, myobj)
    x = 0
    y = 0
    z = 0
    count = 0

    # 將平均值使用Rest API的POST方式傳至server
    post = requests.post(url, json = myobj)
    print(post)

def cal_thread():
    while True:
        # 在wihle迴圈中使用多線程確保每0.1秒會讀取一次感測值
        Thread(target=cal).start()
        time.sleep(0.1)

def req_thread():
    while True:
        time.sleep(1)
        # 在wihle迴圈中使用多線程確保每秒會觸發回傳
        Thread(target=req).start()

# 定義多線程並開始執行
thread_arr = [Thread(target=cal_thread), Thread(target=req_thread)]
for thread in thread_arr:
    thread.start()
# 最終結果會在各自的線程中依照sleep的間隔獨立執行各自的任務
```

## 優缺點分析及改進方式


## 新增功能

LINE Bot 和相機 弄積分

## 結論



