# 空速度計

撰寫人: 范紹捷/動力組/5~9代
## 📌 系統目標
使用 **STM32 MCU** 從以下來源擷取資料：
- **MPXV7002 壓力感測器**（透過 ADC 讀取電壓，計算壓力與風速）
- 透過 UART 傳輸格式化資料給 Python GUI 顯示與繪圖

## 🔧 系統架構

| 感測器/模組 | 功能           | 照片                       |
|-------------|----------------|--------------------------------|
| MPXV7002    | 壓力感測       | ![image](https://hackmd.io/_uploads/HJHmfMibxl.png)|
| stm32       | 運算          |![image](https://hackmd.io/_uploads/BJnHfzi-le.png)
| GUI 主機    | 顯示資料       | `USARTx_TX` (UART 傳輸腳位)    |
## 🔌 感測器與接腳
![螢幕擷取畫面 2025-05-21 164842](https://hackmd.io/_uploads/BkfFQzs-gx.png)




## 軟體架構
MPXV7002 
⇩ 
ADC 
⇩
壓力/風速計算
⇩
STM32 格式化字串
⇩
UART 傳送給 GUI
## 🧮 風速計算公式

### 壓力轉換公式：
```c
pressure_kPa = (voltage - 2.5) / 1.0;  // ±2kPa 對應 0.5V~4.5V
```

### 風速計算（使用伯努力定律）：
```c
airspeed_mps = sqrt(2 * abs(pressure_kPa) * 1000 / 1.225);
airspeed_kmh = airspeed_mps * 3.6;
```

## 🧰 STM32 程式碼片段
1️⃣ ADC 電壓讀取（以 12-bit 為例） *112~114行*
```c
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,100);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
ADC_Value = HAL_ADC_GetValue(&hadc1);
```
2️⃣ 壓力/風速計算 *118~121行*
```c
ADC_Volt = (float)ADC_Value/4096*3.3;
float pressure = (ADC_Volt - V_OFFSET) / SENSITIVITY;  //kPa
float airspeed = sqrt(2 * fabs(pressure) * 1000.0f / AIR_DENSITY);   
float airspeed_kmh = airspeed * 3.6f;
```
3️⃣ 格式化字串並透過 UART 傳送 *123~126行*
```c		
if(HAL_GetTick()%100 == 0){ //USRT Send
    char buf[100];
    sprintf(buf, "Volt:%.2lf V \t P:%.2lf kPa \t S:%.2lf Kmh\n", ADC_Volt,pressure,airspeed_kmh);
    HAL_UART_Transmit(&huart1, (uint8_t*)buf, strlen(buf), HAL_MAX_DELAY);
}
```
## 🧰 STM32 程式碼
![image](https://hackmd.io/_uploads/By5lM5_bxe.png)