基于stm32驱动bh1750光照传感器的一种超简单的编程方法

2023-11-10

基于stm32驱动bh2750光照传感器的一种超简单的编程方法

前言

我要介绍的这种方法是基于rt-thread操作系统的,先介绍一下操作系统,我们初学单片机一般都是不跑操作系统的(俗称裸机),那些开发板的教程还有网上能找到的例程绝大部分也都是不跑操作系统的,初学者听到操作系统可能会害怕,其实使用操作系统并没有想象中那么难,在某些方面甚至比裸机更简单(比如我今天要讲的这个bh1750的驱动),好了,废话不多说,马上开整(步骤我分的比较细,看起来好像很复杂,其实用过RT-thread的都知道,这个操作很简单)。

如果你不想使用操作系统,要用裸机的话,可以参考我发布的博文;
BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了)

一、搭载RT-thread需要的环境

参考我的博文:RT-Thread零基础快速入门第0讲——环境安装
我们这里需要用到的软件主要有2个:1:keil5(版本在5.24以上),2:env
当然,如果你不确定是否要用rtt操作系统的话,也可以先不搭建环境,先跳到第二步下载我已经做好的工程,先运行一下看下效果(我用的是stm32f103)。

二、获取RT-thread官方源码,并新建一个工程

参考我的博文:RT-Thread零基础快速入门第1讲——新建工程
根据你的单片机型号,选择合适的bsp,生成一个新的工程。
我这里用的是stm32f103,整个工程都已经做好了,需要的话可以在下面的链接下载。
源码下载链接1:https://pan.baidu.com/s/1HnedCg3sC4HU8iEOf4dYOw ,提取码:xs8o
源码下载链接2:https://pan.baidu.com/s/1QOC01P5M99LzP4i1Voro6g,提取码:abcd

三、下载bh1750软件包

参考我的博文:RT-Thread零基础快速入门第8讲——软件包的使用
注意:RT-thread的bh1750软件包有几个版本,v1.0.0是单独的驱动(只有IIC通信部分的驱动,和裸机的程序类似),v2.0.0和latest版本除了IIC通信部分的驱动还加入了sensor的框架(这是rtt自己做的一个中间层框架,它的意义在于把很多不同种类的传感器合并到同一个框架里面,这样应用层就不需要针对不同的传感器编写不同的模块代码),总的来说就是,选择的版本不同,应用层的代码会有所区别(我这里用的是v1.0.0版本)。
env配置如下:
1
下载完之后在工程目录下可以找到一个bh1750-v1.0.0文件夹,里面有两个文件,bh1750.c和bh1750.h,这个就是我们需要的驱动代码。

四、配置IIC引脚

在工程根目录下打开env,输入menuconfig进入配置菜单,选择路径Hardware Drivers Config -> on-chip Peripheral Drivers -> Enable I2C1 BUS,配置IIC1的引脚号(不需要特定的IIC引脚,随便两个普通IO即可)
注意:1、不同芯片的工程(不同的bsp),配置菜单上面的选项在描述上可能有所不同。2、不一定要选择IIC1,也可以选IIC2或者IIC3,后面编写应用层代码时,IIC使用的通道号和现在选的一致即可。
2

五、编写应用层程序

RTT的工程里面都有一个maic.c文件,默认写的都是一个呼吸灯,我在这里添加一个线程专门用于bh1750的数据采集和打印,当然,也可以不用线程直接在main函数里面调用bh1750相关的函数。
不知道什么是线程概念的话可以看下我的博文:
RT-Thread零基础快速入门第6讲——线程管理

/* main.c
 * 功能:采集bh1750的数据并通过串口1打印,另外还有一个LED灯定时闪烁
 */
#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;   // 光照值,注意:这里定义的是浮点型,如果要通过串口打印或者显示屏显示,需要转换一下数据                      

/* BH1750数据处理线程 */
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);  // 该函数就在第四步下载的bh1750.c文件里面
		// 串口1打印光照值
        rt_kprintf("read bh1750 sensor intensity: %d%d%d%d%d.%d lx\n", (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
    }   
}

/* 主函数 */
int main(void)
{
	// LED引脚初始化
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
	
	// 创建一个线程(用来单独做bh1750的数据采集和打印)
    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);  // 启动线程
    }

    while (1)
    {
    	// LED灯定时闪烁
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }
}

六、总结

1、先搭载好rt-thread操作系统所需要的环境
2、了解rtt-thread的基本使用方法
3、编写应用层驱动代码(rtt的优点在于很多底层驱动都不需要自己写,只要在应用层调用相关的函数即可,所以使用操作系统有些时候比裸机更简单)
4、编译运行

本文用到的工程源码可以在下面的链接下载:
源码下载链接1:https://pan.baidu.com/s/1HnedCg3sC4HU8iEOf4dYOw ,提取码:xs8o
源码下载链接2:https://pan.baidu.com/s/1QOC01P5M99LzP4i1Voro6g,提取码:abcd

不熟悉rt-thread操作系统的话可以参考我发布的博文:
RT-Thread零基础快速入门第0讲——环境安装
RT-Thread零基础快速入门第1讲——新建工程
RT-Thread零基础快速入门第2讲——添加新文件到工程
RT-Thread零基础快速入门第3讲——点亮LED灯
RT-Thread零基础快速入门第4讲——按键输入
RT-Thread零基础快速入门第5讲——外部中断
RT-Thread零基础快速入门第6讲——线程管理
RT-Thread零基础快速入门第7讲——FinSH控制台
RT-Thread零基础快速入门第8讲——软件包的使用

BH1750电路原理部分我这边没有介绍,可以看下我之前发布的博文:
BH1750光照传感器超详细攻略(从原理到代码讲解,看完你就懂了)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于stm32驱动bh1750光照传感器的一种超简单的编程方法 的相关文章

  • (十) web自动化测试-PO设计模式

    十 web自动化测试 PO设计模式 文章目录 十 web自动化测试 PO设计模式 前言 一 PageObject原则 1 使用方法代替页面的功能点 2 case中不要过多暴露页面的细节 3 po本身不进行断言 4 一个方法返回另一个页面 P
  • Python运算符中/和//的区别

    首先先看单斜杆的用法 举几个栗子 gt gt gt print 5 3 type 5 3 1
  • node-sass npm安装详解

    node sass npm安装详解 npm 安装 node sass 依赖时 会从 github com 上下载 node 文件 由于国内网络环境的问题 这个下载时间可能会很长 甚至导致超时失败 解决方案就是使用其他源 或者使用工具下载 然
  • 5分钟掌握接口自动化测试,4个知识点简单易学!

    一 什么是接口测试 接口测试是一种软件测试方法 用于验证不同软件组件之间的通信接口是否按预期工作 在接口测试中 测试人员会发送请求并检查接收到的响应 以确保接口在不同场景下都能正常工作 就工具而言 常见的测试工具有Jmeter Postma

随机推荐

  • 一张900w的数据表,16s执行的SQL优化到300ms?

    大家好 我是磊哥 有一张财务流水表 未分库分表 目前的数据量为9555695 分页查询使用到了limit 优化之前的查询耗时16 s 938 ms execution 16 s 831 ms fetching 107 ms 按照下文的方式调
  • 【每日一具3】推荐一个4K、蓝光、3D高清影视下载站,影视资源丰富 发烧友必备

    我猜测大家收藏都是有些能看片源比较丰富能看最新电影的网站 这些网站往往都是采集最大资源网的片源 最新的电影收录后的画质不敢恭维 对于那些真正的影视爱好者来说这不是最好的选择 今天博谈天下给你们推荐一个4K 蓝光 3D高清影视下载站 这个网站
  • C++多态

    C 中的多态分为静态多态和动态多态两种 其中 静态多态在编译阶段实现 其原理是由函数重载实现 通过不同的实参调用其相应的同名函数 动态多态通过虚函数实现 以下着重介绍 动态多态的两个必要条件 必须通过基类的指针或者引用调用 被调用的必须是虚
  • TamperMonkey油猴脚本弹出系统通知

    TamperMonkey油猴脚本弹出系统通知 通知问题 解决方法 删除通知 修改通知内容 通知问题 安装某些TamperMonkey油猴脚本后偶尔弹出如下系统通知 通知标题显示为Microsoft Edge或Chrome 正在使用的浏览器
  • laravel模型中数据批量加入

    laravel模型中数据批量加入 控制器 关联新增批量加入 user User find 19 user gt book gt saveMany new Book title gt 哈利波特1 new Book title gt 哈利波特2
  • Java课题笔记~ SpringMVC概述

    1 1 SpringMVC简介 SpringMVC 也叫Spring web mvc 是Spring 框架的一部分 在Spring3 0 后发布的 1 2 SpringMVC的优点 基于MVC 架构 基于 MVC 架构 功能分工明确 解耦合
  • 性能测试指标全解

    最近在公司做压测时 对于各个监控工具的监控指标一脸蒙 有时候不清晰 有时候理解错误 于是 恶补基础知识 希望对广大网友有所帮助 一 性能测试指标 1 在线用户数 此指标指的是某个时间段内 在服务器上保持登录状态的用户数 在线用户数不等同于并
  • 【Go】字符串拼接

    在 Go 语言中 常见的字符串拼接方式包括 拼接 fmt Sprintf拼接 strings Join拼接 buffer Builderbuffer WriteString拼接和strings Builder WriteString拼接 1
  • 什么是to B 业务

    引言 To B or Not to B there is not a question 对于企业而言 数据分析的作用主要体现在三大领域 1 是对业务的改进优化 2 是帮助业务发现机会 3 是创造新的商业价值 数据分析最重要的是基于对业务的理
  • 常见的反爬手段、原理以及应对思路

    应对反爬的主要思路就是 尽可能的去模拟浏览器 浏览器在如何操作 代码中就如何去实现 1 通过User Agent反爬 爬虫发送请求时 请求头中默认没有User Agent 或者提供非正常的UA 应对思路 在请求时添加UA 具体应对 requ
  • 用JAVA实现网络数据包嗅探

    用JAVA实现网络数据包嗅探 网络嗅探可是说是网络开发的一个基础 SNIFFER IDS都是在这个基础上开发的 一个提供了网络分析 一个提供了入侵检测 实现一个网络嗅探程序到底有多难呢 可以很复杂 也可以很简单 在WINDOWS平台下 大多
  • 框架分析(8)-React Native

    框架分析 8 React Native 专栏介绍 React Native 特性和优势 跨平台开发 热更新 原生性能 组件化开发 第三方库支持 社区支持 限制和挑战 性能问题 第三方库兼容性 学习曲线 总结 专栏介绍 link 主要对目前市
  • 大数据开发:数仓建模常见数据模型

    在数据仓库搭建的过程当中 根据需求合理地选择数据模型 是非常关键的一个环节 对于数仓建模 很多人说不就是建表吗 哪有那么复杂 事实上 这是非常错误的思想 今天的大数据开发分享 我们来聊聊数仓建模常见的几种数据模型 目前来说 市场上主流的数据
  • Tomcat性能优化详细教程

    首先 是客户端访问tomcat的一个过程 如图所示 图中间虚线框部分是 Apache基金下的服务器来做静态资源处理的 而这部分需要花费大量时间 当用nginx和tomcat做企业级集群的时候 需要禁用掉AJP协议 一 准备工作 1 配置管理
  • ORACLE在分区表的分区字段上进行更新的方法

    有些业务表 由于数据量比较大 例如成交表 因此 为了方便查询 通常在一个日期字段上对表进行分区用以提高查询效率 但是一旦对表进行分区后 如果要对表中的记录更新 如果更新字段设计到了分区字段 那么update语句就会出错 ORA 10442
  • 学习TCP

    参考知乎 实战 我用 Wireshark 让你 看见 TCP 知乎 zhihu com 学习工具 tcpdump linux wireshark windows dump 转储 json dump a fp 转储到文件 动态数据转储为静态文
  • 关于基本功能测试用例,到底是传统的表格(Excel)形式好还是思维导图(Xmind、MindManager等)模式好?

    这个问题先抛出我的观点 具体选择哪种形式更好 需要根据具体情况来考虑 如果测试用例较为简单 可以选择表格形式 如果测试用例较为复杂 可以选择思维导图形式 但实际工作中 二者一般是结合使用的 想把握好这个度 就需要了解两种用例形式的优缺点 所
  • Windows batch编程常用语法及命令介绍

    1 echo 和 回显命令 关闭单行回显 echo off 从下一行开始关闭回显 echo off 从本行开始关闭回显 一般批处理第一行都是这个 echo on 从下一行开始打开回显 echo 显示当前是 echo off 状态还是 ech
  • 总结5种比较高效常用的排序算法

    1 概述 本文对比较常用且比较高效的排序算法进行了总结和解析 并贴出了比较精简的实现代码 包括选择排序 插入排序 归并排序 希尔排序 快速排序等 算法性能比较如下图所示 2 选择排序 选择排序的第一趟处理是从数据序列所有n个数据中选择一个最
  • 基于stm32驱动bh1750光照传感器的一种超简单的编程方法

    基于stm32驱动bh2750光照传感器的一种超简单的编程方法 目录 基于stm32驱动bh1750光照传感器的一种超简单的编程方法 前言 一 搭载RT thread需要的环境 二 获取RT thread官方源码 并新建一个工程 三 下载b