學習目標
- ✓認識多物理量環境模組的資料整合。
- ✓將 GY-39 設為 MCU_IIC 並使用 0x5B。
- ✓讀取光度、溫濕度、氣壓與高度資料。
SENSOR / GY39
GY-39-44009 類型模組把光度與 BME280 類環境資料整合,再由板上 MCU 透過 MCU_IIC 回傳。桃園版 Blockly 預設使用 0x5B,教學時要先確認模組版本與 S0 模式。
先確認這一課要學會什麼,以及桌面上需要哪些材料。
GY-39 的板上 MCU 會把多個感測器資料整理成固定格式;MCU_IIC 模式下,Arduino 讀取的是模組整理後的資料,不是直接讀每顆晶片。
依模組說明將 S0 接地。
從 0x5B 的資料暫存器取得整包資料。
分離光度、溫度、壓力、濕度與高度。
GY-39 市面版本可能不同;若模組無回應,先確認板上晶片與工作模式。
桃園版 Blockly 的 GY-39 積木以 MCU_IIC 為前提;S0 接地後使用 SDA/SCL,不要把 UART 腳當 I2C。
| 模組腳位 | 接到控制板 | 訊號方向 | 檢查重點 |
|---|---|---|---|
| VCC | 3.3–5V 依模組 | 電源 | 確認轉接板規格。 |
| GND | GND | 地線 | 共地。 |
| SDA | A4 / SDA | I2C 資料 | MCU_IIC 模式。 |
| SCL | A5 / SCL | I2C 時脈 | MCU_IIC 模式。 |
| S0 | GND | 模式設定 | 依 GY-39 版本說明選 MCU_IIC。 |
已將 5 條線路依同一筆資料逐列對齊;電壓仍須依手上模組版本確認。
積木名稱與型別以桃園版 Blockly 現行程式為準,不以通用積木替代。
playrobot_gy39_setup啟動 0x5B MCU_IIC 模式
位置:感測器 → 環境感測器 → GY-39/MAX4400playrobot_gy39_update讀取一整包環境資料
位置:感測器 → 環境感測器 → GY-39/MAX4400playrobot_gy39_lux讀取照度
位置:感測器 → 環境感測器 → GY-39/MAX4400playrobot_gy39_temperature讀取溫度
位置:感測器 → 環境感測器 → GY-39/MAX4400playrobot_gy39_pressure_hpa讀取氣壓
位置:感測器 → 環境感測器 → GY-39/MAX4400每次更新後同時列印 lux、溫度與氣壓。
sensor_blockarduino_delayplayrobot_gy39_updateplayrobot_gy39_luxsensor_blockarduino_serial_printsensor_blockarduino_delayplayrobot_gy39_updateplayrobot_gy39_luxsensor_blockarduino_serial_print確認 S0 與 I2C 接線。
為什麼:UART 模式與 MCU_IIC 的腳位不同。先更新再讀各個數值積木。
為什麼:各數值要來自同一筆資料。遮住模組或移到窗邊。
為什麼:lux 是最容易直接觀察的變化。playrobot_gy39_setup:啟動 0x5B MCU_IIC 模式
下載桃園版 Blockly 專案或對應的文字程式。
| 測試情境 | 可能讀值 | 判讀 |
|---|---|---|
| 手遮住模組 | lux 明顯改變 | 光度資料來自 MAX4400 類光感測器。 |
| 上下樓層 | 氣壓可能不同 | 大氣壓力會隨高度與天氣變化。 |
這段程式把「GY-39/MAX4400 四合一氣象模組」的實體接線、桃園版 Blockly 積木與 Arduino 執行流程接在一起。先對照腳位,再看初始化、讀值、輸出與等待的順序;每一步都可以回到本頁的積木範例實測。
#include <Wire.h>
const uint8_t GY39_ADDR = 0x5B;
void setup() {
Serial.begin(115200);
Wire.begin();
}
void loop() {
Wire.beginTransmission(GY39_ADDR);
Wire.write(0x00);
Wire.endTransmission(false);
if (Wire.requestFrom(GY39_ADDR, (uint8_t)14) == 14) {
uint8_t data[14];
for (uint8_t i = 0; i < 14; ++i) data[i] = Wire.read();
Serial.println("GY-39 data received");
}
delay(1000);
}#include <Wire.h>函式庫提供桃園版 Blockly 產生器所需的底層功能;若這裡的函式庫或物件名稱不對,後面的 playrobot_gy39_setup 就算接線正確也無法使用。
// VCC → 3.3–5V 依模組、GND → GND、SDA → A4 / SDA、SCL → A5 / SCL、S0 → GND本頁接線是 VCC → 3.3–5V 依模組、GND → GND、SDA → A4 / SDA、SCL → A5 / SCL、S0 → GND。程式常數、積木欄位與實體線材必須使用同一組設定;若改了其中一邊,另外兩邊也要一起改。
void setup() {啟動序列埠、I²C/UART 或感測器初始化通常只需要做一次,所以要放在「初始化」區,不要每一圈重複建立裝置。這也對應範例中的啟動積木。
void loop() {重複執行區先讓感測器更新,再讀取 GY-39/MAX4400 初始化。若元件有 data ready、可用性或逾時條件,先判斷狀態再使用數值,避免把無效資料當成真實測量。
if (Wire.requestFrom(GY39_ADDR, (uint8_t)14) == 14) {先把原始值、單位或狀態送到序列埠,才能和預期結果比較;等待時間則決定更新速度。若看到亂碼,先檢查鮑率;若數值跳動,先增加合理的取樣間隔或做校正。
先從「電源、接線、腳位、物體」四個方向檢查,再修改程式。
先檢查:確認 S0 模式、SDA/SCL 與位址。
處理方式:依模組手冊將 S0 接地並重新掃描 I2C。
先檢查:確認模組版本與資料格式。
處理方式:不要混用 UART 範例,先以同一版本手冊解析 14 bytes。
先檢查:確認模組內部 BME280 或版本。
處理方式:將結果視為模組整合資料,必要時核對晶片型號。
從顯示數值,逐步走向條件判斷、燈號回饋與雷達專題。
題目:遮光與照光,列印 lux。
這題要延伸「GY-39/MAX4400 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
題目:記錄光度、溫度、濕度、氣壓。
這題要延伸「GY-39/MAX4400 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
題目:畫出 14 bytes 與各物理量的欄位對應。
這題要延伸「GY-39/MAX4400 初始化」的基本讀值:先保留已驗證的接線與初始化,再把題目要求的資料處理加在重複執行區。先把資料整理成可觀察的序列埠或表格結果。
確認 GY-39-44009、3–5V、MCU_IIC 與 0.045–188000 lux 等產品資訊。
補充 S0 模式、MCU_IIC 與 0x5B 資料介面。
對照 setup、update 與環境資料積木。