加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、搭載RT-thread需要的環(huán)境
    • 二、獲取RT-thread官方源碼,并新建一個(gè)工程
    • 三、下載bh1750軟件包
    • 四、配置IIC引腳
    • 五、編寫應(yīng)用層程序
    • 六、總結(jié)
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于stm32驅(qū)動(dòng)bh1750光照傳感器的一種超簡(jiǎn)單的編程方法

10/05 08:55
1698
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

我要介紹的這種方法是基于rt-thread操作系統(tǒng)的,先介紹一下操作系統(tǒng),我們初學(xué)單片機(jī)一般都是不跑操作系統(tǒng)的(俗稱裸機(jī)),那些開發(fā)板的教程還有網(wǎng)上能找到的例程絕大部分也都是不跑操作系統(tǒng)的,初學(xué)者聽到操作系統(tǒng)可能會(huì)害怕,其實(shí)使用操作系統(tǒng)并沒(méi)有想象中那么難,在某些方面甚至比裸機(jī)更簡(jiǎn)單(比如我今天要講的這個(gè)bh1750的驅(qū)動(dòng)),好了,廢話不多說(shuō),馬上開整(步驟我分的比較細(xì),看起來(lái)好像很復(fù)雜,其實(shí)用過(guò)RT-thread的都知道,這個(gè)操作很簡(jiǎn)單)。

如果你不想使用操作系統(tǒng),要用裸機(jī)的話,可以參考我發(fā)布的博文:BH1750光照傳感器超詳細(xì)攻略 (從原理到代碼講解,看完你就懂了)

一、搭載RT-thread需要的環(huán)境

參考我的博文:RT-Thread零基礎(chǔ)快速入門第0講——環(huán)境安裝

我們這里需要用到的軟件主要有2個(gè):1:keil5(版本在5.24以上),2:env

當(dāng)然,如果你不確定是否要用rtt操作系統(tǒng)的話,也可以先不搭建環(huán)境,先跳到第二步下載我已經(jīng)做好的工程,先運(yùn)行一下看下效果(我用的是stm32f103)。

二、獲取RT-thread官方源碼,并新建一個(gè)工程

參考我的博文:RT-Thread零基礎(chǔ)快速入門第1講——新建工程

根據(jù)你的單片機(jī)型號(hào),選擇合適的bsp,生成一個(gè)新的工程。

我這里用的是stm32f103,整個(gè)工程都已經(jīng)做好了,需要的話可以在下面的鏈接下載。

源碼下載鏈接1:https://pan.baidu.com/s/1HnedCg3sC4HU8iEOf4dYOw ,提取碼:xs8o
源碼下載鏈接2:https://pan.baidu.com/s/1QOC01P5M99LzP4i1Voro6g,提取碼:abcd

三、下載bh1750軟件包

參考我的博文:RT-Thread零基礎(chǔ)快速入門第8講——軟件包的使用

注意:RT-thread的bh1750軟件包有幾個(gè)版本,v1.0.0是單獨(dú)的驅(qū)動(dòng)(只有IIC通信部分的驅(qū)動(dòng),和裸機(jī)的程序類似),v2.0.0和latest版本除了IIC通信部分的驅(qū)動(dòng)還加入了sensor的框架(這是rtt自己做的一個(gè)中間層框架,它的意義在于把很多不同種類的傳感器合并到同一個(gè)框架里面,這樣應(yīng)用層就不需要針對(duì)不同的傳感器編寫不同的模塊代碼),總的來(lái)說(shuō)就是,選擇的版本不同,應(yīng)用層的代碼會(huì)有所區(qū)別(我這里用的是v1.0.0版本)。

env配置如下:

1

下載完之后在工程目錄下可以找到一個(gè)bh1750-v1.0.0文件夾,里面有兩個(gè)文件,bh1750.c和bh1750.h,這個(gè)就是我們需要的驅(qū)動(dòng)代碼。

四、配置IIC引腳

在工程根目錄下打開env,輸入menuconfig進(jìn)入配置菜單,選擇路徑Hardware Drivers Config -> on-chip Peripheral Drivers -> Enable I2C1 BUS,配置IIC1的引腳號(hào)(不需要特定的IIC引腳,隨便兩個(gè)普通IO即可)

注意:1、不同芯片的工程(不同的bsp),配置菜單上面的選項(xiàng)在描述上可能有所不同。2、不一定要選擇IIC1,也可以選IIC2或者IIC3,后面編寫應(yīng)用層代碼時(shí),IIC使用的通道號(hào)和現(xiàn)在選的一致即可。

2

五、編寫應(yīng)用層程序

RTT的工程里面都有一個(gè)maic.c文件,默認(rèn)寫的都是一個(gè)呼吸燈,我在這里添加一個(gè)線程專門用于bh1750的數(shù)據(jù)采集和打印,當(dāng)然,也可以不用線程直接在main函數(shù)里面調(diào)用bh1750相關(guān)的函數(shù)。

不知道什么是線程概念的話可以看下我的博文:RT-Thread零基礎(chǔ)快速入門第6講——線程管理

/* main.c
 * 功能:采集bh1750的數(shù)據(jù)并通過(guò)串口1打印,另外還有一個(gè)LED燈定時(shí)閃爍
 */
#include "rtthread.h"
#include "rtdevice.h"
#include "board.h"
#include "bh1750.h"
#include <string.h>
#include <stdio.h>
#include "math.h"
#include "stdio.h"

/* 宏定義 */
#define LED0_PIN                    GET_PIN(E, 5)   // LED:PE5 

#define BH1750_DEV                  "i2c1"          // 這里和第五步配置的IIC通道要保持一致

float light;   // 光照值,注意:這里定義的是浮點(diǎn)型,如果要通過(guò)串口打印或者顯示屏顯示,需要轉(zhuǎn)換一下數(shù)據(jù)                      

/* BH1750數(shù)據(jù)處理線程 */
int bh1750_handle_entry(void)
{
    static bh1750_device_t dev = RT_NULL;

    if (dev)
    {
        bh1750_deinit(dev);
    }    
    dev = bh1750_init(BH1750_DEV);

    while(1)
    {   
        light = bh1750_read_light(dev);  // 該函數(shù)就在第四步下載的bh1750.c文件里面
		// 串口1打印光照值
        rt_kprintf("read bh1750 sensor intensity: %d%d%d%d%d.%d lxn", (int)(light * 10)/100000%10, (int)(light * 10)/10000%10, (int)(light * 10)/1000%10,  
																					(int)(light * 10)/100%10, (int)(light * 10)/10%10, (int)(light * 10)/1%10);

        rt_thread_mdelay(500);   // 采集周期500ms
    }   
}

/* 主函數(shù) */
int main(void)
{
	// LED引腳初始化
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
	
	// 創(chuàng)建一個(gè)線程(用來(lái)單獨(dú)做bh1750的數(shù)據(jù)采集和打印)
    rt_thread_t bh1750_thread = rt_thread_create("bh1750_handle", bh1750_handle_entry, RT_NULL, 1024, 20, 20);
    if(bh1750_thread)
    {
        rt_thread_startup(bh1750_thread);  // 啟動(dòng)線程
    }

    while (1)
    {
    	// LED燈定時(shí)閃爍
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }
}

六、總結(jié)

1、先搭載好rt-thread操作系統(tǒng)所需要的環(huán)境
2、了解rtt-thread的基本使用方法
3、編寫應(yīng)用層驅(qū)動(dòng)代碼(rtt的優(yōu)點(diǎn)在于很多底層驅(qū)動(dòng)都不需要自己寫,只要在應(yīng)用層調(diào)用相關(guān)的函數(shù)即可,所以使用操作系統(tǒng)有些時(shí)候比裸機(jī)更簡(jiǎn)單)
4、編譯運(yùn)行

本文用到的工程源碼可以在下面的鏈接下載:

源碼下載鏈接1:https://pan.baidu.com/s/1HnedCg3sC4HU8iEOf4dYOw ,提取碼:xs8o
源碼下載鏈接2:https://pan.baidu.com/s/1QOC01P5M99LzP4i1Voro6g,提取碼:abcd

不熟悉rt-thread操作系統(tǒng)的話可以參考我發(fā)布的博文:

RT-Thread零基礎(chǔ)快速入門第0講——環(huán)境安裝

RT-Thread零基礎(chǔ)快速入門第1講——新建工程

RT-Thread零基礎(chǔ)快速入門第2講——添加新文件到工程

RT-Thread零基礎(chǔ)快速入門第3講——點(diǎn)亮LED燈

RT-Thread零基礎(chǔ)快速入門第4講——按鍵輸入

RT-Thread零基礎(chǔ)快速入門第5講——外部中斷

RT-Thread零基礎(chǔ)快速入門第6講——線程管理

RT-Thread零基礎(chǔ)快速入門第7講——FinSH控制臺(tái)

RT-Thread零基礎(chǔ)快速入門第8講——軟件包的使用

RT-Thread零基礎(chǔ)快速入門第9講——串口(UART/RS485)

BH1750電路原理部分我這邊沒(méi)有介紹,可以看下我之前發(fā)布的博文:BH1750光照傳感器超詳細(xì)攻略 (從原理到代碼講解,看完你就懂了)

相關(guān)推薦

電子產(chǎn)業(yè)圖譜