一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

零知開源——STM32F1驅動BMP581壓強傳感器使用SPI實現(xiàn)ST7789顯示的環(huán)境監(jiān)測系統(tǒng)

PCB56242069 ? 來源:PCB56242069 ? 作者:PCB56242069 ? 2025-07-03 16:39 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

?零知開源是一個真正屬于國人自己的開源軟硬件平臺,在開發(fā)效率上超越了Arduino平臺并且更加容易上手,大大降低了開發(fā)難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創(chuàng)作產(chǎn)品,測試產(chǎn)品。快來動手試試吧!

?訪問零知開源平臺,獲取更多實戰(zhàn)項目和教程資源吧!

(1)項目概述

本文將詳細介紹如何在零知標準板上實現(xiàn)BMP581氣壓傳感器與ST7789顯示屏的協(xié)同工作,重點解決SPI總線沖突問題,并展示環(huán)境數(shù)據(jù)的實時監(jiān)測顯示。實現(xiàn)以下系統(tǒng)功能:

>實時采集溫度和氣壓數(shù)據(jù)
>計算并顯示海拔高度
>在240x320彩色顯示屏上直觀展示數(shù)據(jù)

>通過串口輸出監(jiān)測數(shù)據(jù)

(2)項目難點

當兩個SPI設備共享總線時,會產(chǎn)生總線競爭導致通信失敗。本文將重點介紹兩種解決方案。

(3)解決思路

方案一:將顯示屏改為軟件SPI驅動,與傳感器的硬件SPI物理隔離。

方案二:通過精確控制CS引腳狀態(tài),確保同一時間只有一個設備使用SPI總線。

一、硬件準備與連接

1.1硬件清單

組件 型號 數(shù)量
主控板 零知標準板 1
氣壓傳感器 BMP581 1
顯示屏 ST7789 (240x320) 1
杜邦線 公對公 若干

1.2 接線方案

零知標準板(STM32F103RBT6) BMP581(硬件SPI) ST7789(軟件SPI)
3.3V VCC VCC
GND GND GND
10 CS /
11(MOSI) SDA /
12(MISO) SDO /
13(SCK) SCL /
6 / CS
2 / DC
8 / SDA
7 / SCL
4 / RES

1.3 硬件連線圖

wKgZPGhmQQWAC7FBAAcVlFGRYe0838.png

1.4 接線實物圖

wKgZO2hmQO-AAghfACkyJPmxvhk374.png

二、完整代碼實現(xiàn)

采取軟件SPI替換ST7789的通信方式解決總線沖突的方案,確保零知IDE包含以下庫文件:

SparkFun_BMP581_Arduino_Library.h

Adafruit_GFX.h

Adafruit_ST7789.h

SPI.h

2.1 初始化定義

定義顯示屏和BMP581氣壓傳感器驅動的相關參數(shù)

// BMP581 SPI通信參數(shù)
uint8_t bmp581_cs = 10;  // BMP581 片選引腳
uint32_t clockFrequency = 100000;  // 設置SPI時鐘頻率

// ST7789 顯示屏引腳定義
#define TFT_CS   6  // 設置軟件SPI的片選引腳
#define TFT_RST  4   // 顯示屏復位引腳
#define TFT_DC   2  // 顯示屏數(shù)據(jù)/控制命令引腳
#define TFT_MOSI 8  // 軟件SPI的MOSI引腳
#define TFT_SCLK 7  // 軟件SPI的SCK引腳

// 傳感器和顯示屏的對象創(chuàng)建與初始化
BMP581 pressureSensor;
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

// 定義顯示屏參數(shù)
#define SCREEN_WIDTH  240
#define SCREEN_HEIGHT 320
#define ST77xx_PURPLE 0x862F
#define VALUE_SIZE    3
#define LABEL_SIZE    1

// 顏色定義
#define BACKGROUND  ST77XX_BLACK
#define TEXT_COLOR  ST77XX_WHITE
#define TEMP_COLOR  ST77xx_PURPLE
#define PRESS_COLOR ST77XX_CYAN
#define ALT_COLOR   ST77XX_GREEN
#define BOX_COLOR   ST77XX_ORANGE
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.2 初始化配置

配置串口通信波特率為115200,ST7789顯示屏大小、方向和交互內容顯示,開啟BMP581的SPI通信連接,繪制顯示屏標題和數(shù)據(jù)內容標簽

void setup() {
    // 開啟串口監(jiān)視器并設置波特率為115200
    Serial.begin(115200);
    Serial.println("BMP581 with ST7789 Display Example");

    // 初始化SPI
    SPI.begin();

    // 初始化顯示屏
    tft.init(SCREEN_WIDTH, SCREEN_HEIGHT);
    tft.setRotation(3);
    tft.fillScreen(BACKGROUND);
    tft.setTextColor(TEXT_COLOR);

    // 初始化BMP581傳感器
    while (pressureSensor.beginSPI(bmp581_cs, clockFrequency) != BMP5_OK) {
        Serial.println("Error: BMP581 not connected, check wiring and CS pin!");
        tft.setCursor(10, 10);
        tft.setTextSize(2);
        tft.print("Sensor not found!");
        delay(1000);
        tft.fillScreen(BACKGROUND);
    }

    Serial.println("BMP581 connected!");
    drawStaticElements();
}

2.3 讀取傳感器數(shù)據(jù)

loop函數(shù)循環(huán)獲取實時的大氣壓強和溫度數(shù)據(jù),并通過經(jīng)驗公式轉換為海拔高度數(shù)據(jù),將獲得的數(shù)據(jù)實時更新到TFT顯示屏界面上

void loop() {
    // 從寄存器獲取到數(shù)值
    bmp5_sensor_data data = {0, 0};
    int8_t err = pressureSensor.getSensorData(&data);

    if (err == BMP5_OK) {
        // 將氣壓數(shù)據(jù)轉換以百帕為單位 (1 hPa = 100 Pa)
        float pressure_hPa = data.pressure / 100.0;

        // 使用經(jīng)驗公式計算海拔高度數(shù)據(jù)
        float altitude = (1013.25 - pressure_hPa) / 12 * 100;

        // 更新屏幕
        updateTextDisplay(data.temperature, pressure_hPa, altitude);

        // 打印串口監(jiān)視數(shù)據(jù)
        Serial.print("Temperature (C): ");
        Serial.print(data.temperature);
        Serial.print("tPressure (hPa): ");
        Serial.print(pressure_hPa);
        Serial.print("tAltitude (m): ");
        Serial.println(altitude);
    } else {
        Serial.print("Error getting data from sensor! Error code: ");
        Serial.println(err);
    }

    delay(1000);  // 每秒更新一次數(shù)據(jù)
}

2.4 UI界面更新

void drawStaticElements() {
  tft.fillScreen(BACKGROUND);
  
  // 繪制標題
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_YELLOW);
  tft.setCursor(SCREEN_WIDTH/2 + 120, 10);
  tft.print("BMP581 SENSOR");
  
  // 繪制溫度數(shù)據(jù)容器
  drawDataBox(30, 10, "TEMPERATURE", "(C)", TEMP_COLOR);
  
  // 繪制氣壓數(shù)據(jù)容器
  drawDataBox(30, 90, "PRESSURE", "(hPa)", PRESS_COLOR);
  
  // 繪制海拔數(shù)據(jù)容器
  drawDataBox(30, 170, "ALTITUDE", "(m)", ALT_COLOR);
}

void drawDataBox(int x, int y, const char* label, const char* unit, uint16_t color) {
    // 繪制數(shù)據(jù)容器
    tft.drawRoundRect(x, y, SCREEN_WIDTH - 60, 60, 10, BOX_COLOR);

    // 繪制數(shù)據(jù)標題
    tft.setTextSize(LABEL_SIZE);
    tft.setTextColor(color);
    tft.setCursor(x + 15, y + 10);
    tft.print(label);

    // 繪制數(shù)據(jù)單位
    tft.setTextSize(LABEL_SIZE - 1);
    tft.setCursor(x + SCREEN_WIDTH - 60 - 40, y + 10);
    tft.print(unit);
}

void updateTextDisplay(float temp, float pressure, float altitude) {
  updateDataValue(30, 10, temp, 1, TEMP_COLOR);  // 更新溫度數(shù)據(jù)
  updateDataValue(30, 90, pressure, 1, PRESS_COLOR);  // 更新氣壓數(shù)據(jù)
  updateDataValue(30, 170, altitude, 1, ALT_COLOR);  // 更新海拔數(shù)據(jù)
}

void updateDataValue(int x, int y, float value, int decimals, uint16_t color) {
    // 清除舊數(shù)據(jù)
    tft.fillRect(x + 10, y + 30, SCREEN_WIDTH - 80, 25, BACKGROUND);

    // 寫入新數(shù)據(jù)
    tft.setTextSize(VALUE_SIZE);
    tft.setTextColor(color);
    tft.setCursor(x + 15, y + 30);
    tft.print(value, decimals);
}

2.5 項目完整代碼獲取

通過網(wǎng)盤分享的文鏈接:
https://pan.baidu.com/s/125lFvyjRd98dkqMkYh0TSA?pwd=d4m4

三、實際效果展示

3.1 顯示屏信息解讀

成功運行后,顯示屏將分為三個區(qū)域顯示:

溫度區(qū):灰色標簽,顯示攝氏度

氣壓區(qū):紅色標簽,顯示百帕

海拔區(qū):紫色標簽,顯示米

3.2 視頻演示效果

https://www.bilibili.com/video/BV1MR3tzzEXm/?spm_id_from=333.1387.homepage.video_card.click&vd_source=a31e3d8d8ce008260eee442534c2f63d

將通過傳感器獲取到的氣壓值與app海拔儀氣壓值進行對比

3.3 串口監(jiān)視器數(shù)據(jù)

同時,串口監(jiān)視器將每秒輸出一次數(shù)據(jù):

wKgZPGhmQJaANRfrAACYRHkVkXY741.png

四、SPI沖突解決方案詳解

4.1 問題現(xiàn)象

當BMP581和ST7789共享硬件SPI總線時:顯示屏無法正常顯示,傳感器數(shù)據(jù)讀取不穩(wěn)定,系統(tǒng)可能完全無法工作

4.2 根本原因

SPI總線需要獨占訪問

兩個設備共享MOSI、MISO、SCK信號

片選(CS)信號控制不足

總線競爭導致數(shù)據(jù)沖突

4.3 方案一

軟件SPI驅動顯示屏:將顯示屏改為軟件SPI驅動,與傳感器的硬件SPI物理隔離。

// ST7789使用軟件SPI
#define TFT_CS   6  // 顯示屏片選
#define TFT_RST  4  // 復位引腳
#define TFT_DC   2  // 數(shù)據(jù)/命令選擇
#define TFT_MOSI 8  // 軟件SPI數(shù)據(jù)引腳
#define TFT_SCLK 7  // 軟件SPI時鐘引腳

// 創(chuàng)建顯示屏對象(使用軟件SPI)
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

優(yōu)勢:

完全避免硬件SPI沖突

簡化編程邏輯

更穩(wěn)定的通信表現(xiàn)

靈活的引腳分配

4.4 方案二

共享SPI總線+顯式CS控制:通過精確控制CS引腳狀態(tài),確保同一時間只有一個設備使用SPI總線。

// BMP581 SPI參數(shù)
uint8_t bmp581_cs = 10;  // BMP581芯片選擇引腳
uint32_t clockFrequency = 100000;  // BMP581的SPI時鐘頻率

// ST7789顯示屏引腳配置
#define TFT_CS   6  // 顯示屏芯片選擇引腳(與BMP581不同)

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);   //使用硬件SPI驅動方式

void setup() {
    // ...其他初始化...
    
    // 初始化CS引腳
    pinMode(TFT_CS, OUTPUT);
    digitalWrite(TFT_CS, HIGH);  // 初始取消選擇顯示屏
    pinMode(bmp581_cs, OUTPUT);
    digitalWrite(bmp581_cs, HIGH);  // 初始取消選擇傳感器
}

void loop() {
    // 讀取傳感器數(shù)據(jù)
    digitalWrite(TFT_CS, HIGH);  // 取消選擇顯示屏
    err = pressureSensor.getSensorData(&data);
    digitalWrite(bmp581_cs, HIGH);  // 取消選擇傳感器
    
    // 更新顯示
    digitalWrite(bmp581_cs, HIGH);  // 確保傳感器已取消選擇
    updateTextDisplay(...);
}

關鍵點:

通信前確保另一個設備被取消選擇

通信后立即取消選擇當前設備

初始化時所有CS引腳設為HIGH

軟件SPI的MOSI和SCK引腳共用,片選(CS)引腳需要單獨設置

五、海拔計算與精度說明

代碼中使用簡化的海拔計算公式:

float altitude = (1013.25 - pressure_hPa) / 12 * 100;

計算原理

1013.25 hPa:標準海平面氣壓
氣壓梯度:每下降12 hPa,海拔升高約100米

精度考慮 ,實際測量中可能存在10-50米的誤差,主要因素包括:

當?shù)貧庀髼l件變化

溫度對氣壓的影響

傳感器本身的測量誤差

公式本身的近似性

六、常見問題解決

1.顯示屏白屏或花屏

檢查RES引腳連接
確認軟件SPI引腳配置正確

嘗試降低軟件SPI速度

在tft.init()后添加tft.setSPISpeed(10000000)

2.傳感器讀取失敗

檢查硬件SPI連接
確保CS引腳配置正確
測量傳感器供電電壓(應為3.3V)

3.數(shù)據(jù)顯示異常

檢查引腳定義是否正確
確認顯示屏旋轉方向設置合適
驗證傳感器數(shù)據(jù)在串口的輸出是否正常

七、方案對比與選擇建議

特性 方案一(軟件SPI) 方案二(硬件SPI+CS控制)
實現(xiàn)難度 簡單 ★☆☆ 中等 ★★☆
穩(wěn)定性 高 ★★★ 中 ★★☆
性能 中 ★★☆ 高 ★★★
資源占用 較高(需要額外引腳) 低(共享SPI引腳)
推薦場景 初學者/快速實現(xiàn) 高性能應用/引腳受限

推薦選擇:

對于大多數(shù)應用,方案一(軟件SPI驅動顯示屏) 是更簡單可靠的選擇

只有在需要高速刷新或引腳資源緊張時才考慮方案二

八、總結

本文詳細介紹了在零知增強板上實現(xiàn)BMP581傳感器與ST7789顯示屏協(xié)同工作的完整過程,重點解決了SPI總線沖突問題。關鍵點包括:

硬件連接:正確連接SPI設備,特別是CS引腳

SPI沖突解決:

推薦方案:使用軟件SPI驅動顯示屏
備選方案:共享硬件SPI+精確CS控制

數(shù)據(jù)采集與顯示:實時獲取環(huán)境數(shù)據(jù)并直觀展示

海拔計算:使用簡化公式計算海拔高度

通過本教程,開發(fā)者可以快速構建穩(wěn)定可靠的環(huán)境監(jiān)測系統(tǒng),更多零知開發(fā)教程:

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2564

    文章

    52843

    瀏覽量

    765905
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1794

    瀏覽量

    95396
  • stm32f1
    +關注

    關注

    1

    文章

    60

    瀏覽量

    12486
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    開源——STM32F1驅動BMP581壓強傳感器使SPI實現(xiàn)ST7789顯示環(huán)境監(jiān)測系統(tǒng)

    實現(xiàn)BMP581氣壓傳感器ST7789顯示屏的協(xié)同工作,重點解決SPI總線沖突問題,并展示
    發(fā)表于 07-03 17:26

    STM32F1驅動BMP581壓強傳感器使SPI實現(xiàn)ST7789顯示環(huán)境監(jiān)測系統(tǒng)

    監(jiān)測系統(tǒng)
    PCB56242069
    發(fā)布于 :2025年07月03日 16:30:04

    開源——基于STM32F407VET6增強板的四路獨立計時器

    TFT_RST 4 蜂鳴器&LED 3 按鈕 1 14 按鈕 215 按鈕 3 16 按鈕 4 17 1.3 連接硬件圖 主控增強板和ST7789
    發(fā)表于 07-01 10:31

    開源——基于STM32F407VET6增強板的四路獨立計時器

    本教程介紹基于STM32F407VET6增強板的四路獨立計時器實現(xiàn)方案。項目采用TFT顯示屏、蜂鳴器和按鈕構建交互
    的頭像 發(fā)表于 07-01 10:13 ?139次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——基于<b class='flag-5'>STM32F</b>407VET6<b class='flag-5'>零</b><b class='flag-5'>知</b>增強板的四路獨立計時器

    開源——STM32F103RBT6驅動 ICM20948 九軸傳感器及 vofa + 上位機可視化教程

    STM32F1本教程使用標準板(STM32F103RBT6)通過I2C驅動ICM20948九軸傳感器
    發(fā)表于 06-09 14:53

    開源——STM32F103RBT6驅動 ICM20948 九軸傳感器及 vofa + 上位機可視化教程

    本教程使用標準板(STM32F103RBT6)通過I2C驅動ICM20948九軸傳感器,實現(xiàn)
    的頭像 發(fā)表于 06-09 14:01 ?316次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——<b class='flag-5'>STM32F</b>103RBT6<b class='flag-5'>驅動</b> ICM20948 九軸<b class='flag-5'>傳感器</b>及 vofa + 上位機可視化教程

    開源——STM32F4驅動MAX31865實現(xiàn)PT100高精度測溫

    材料增強板(STM32F407VET6) MAX31865模塊(支持三線制PT100) 三線制PT100傳感器 0.96寸I2C OLED顯示
    發(fā)表于 05-26 18:52

    開源——STM32F1驅動MAX31865讀取三線PT100溫度傳感器

    使用Callendar-Van Dusen方程計算。 4.演示視頻STM32F1驅動MAX31865讀取三線PT100溫度傳感器 五、常見問題1.OLED無
    發(fā)表于 05-23 18:27

    開源——STM32F1驅動MAX31865讀取三線PT100溫度傳感器

    本教程詳細介紹了如何使用標準板(STM32F103RBT6)通過MAX31865模塊讀取三線制PT100鉑電阻溫度,并通過I2C OLED實時顯示溫度值和電阻值。教程內容包括硬件接
    的頭像 發(fā)表于 05-23 18:05 ?438次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——<b class='flag-5'>STM32F1</b><b class='flag-5'>驅動</b>MAX31865讀取三線PT100溫度<b class='flag-5'>傳感器</b>

    ESP32驅動ST7789觸摸屏開發(fā)指南:LVGL主題設置與示波器面板

    處理器 屏幕ST7789 2.4寸240×320分辨率 觸摸芯片XPT2046電阻式觸摸控制器 接線SPI使用硬件SPI接口接線圖 三、環(huán)境搭建1
    發(fā)表于 04-29 10:20

    st7789軟件包不能添加是怎么回事?

    1、在UI界面上可以看到st7789,但在packages中沒有。 2、沒有看到對應的下載信息。 3、在對應github中可以正常下載。 4、RTT版本為5.1.0. 5、類似的ili9341的添加是正常的。
    發(fā)表于 03-20 07:51

    智慧路燈的環(huán)境監(jiān)測功能如何實現(xiàn)

    管理提供了豐富、實時的數(shù)據(jù)支持,還有助于提升城市居民的生活質量,打造宜居環(huán)境。那么,叁仟智慧路燈究竟是如何實現(xiàn)環(huán)境監(jiān)測功能的呢?接下來,讓我們深入探究其中的奧秘。 ? ? ? ? 顯示
    的頭像 發(fā)表于 03-18 14:41 ?325次閱讀

    倉儲環(huán)境監(jiān)測物聯(lián)網(wǎng)系統(tǒng)方案

    系統(tǒng)的智能化水平,數(shù)之能推出了基于物聯(lián)網(wǎng)技術的倉儲環(huán)境監(jiān)測系統(tǒng)方案。 倉儲環(huán)境監(jiān)測物聯(lián)網(wǎng)系統(tǒng)方案主要基于物聯(lián)網(wǎng)云平臺
    的頭像 發(fā)表于 12-13 13:41 ?439次閱讀

    環(huán)境監(jiān)測傳感器怎么安裝的

    。 第一部分:準備工作 1. 了解傳感器類型和功能 在安裝之前,首先需要了解不同類型的環(huán)境監(jiān)測傳感器及其功能。常見的環(huán)境監(jiān)測
    的頭像 發(fā)表于 09-10 14:50 ?1135次閱讀

    環(huán)境監(jiān)測系統(tǒng)中一般不常用到的傳感器類型

    環(huán)境監(jiān)測系統(tǒng)是一套復雜的技術體系,它涉及到多種傳感器監(jiān)測設備,用于實時監(jiān)測和分析環(huán)境質量。這些
    的頭像 發(fā)表于 09-10 14:39 ?1442次閱讀