单片机GD32F303RCT6 (Macos环境)开发 (三十三)—— 光照传感器 (BH1750)

news2024/11/19 11:16:31

GD32 + 光照传感器 BH1750的使用

1、GPIO模拟i2c配置

使用管脚为SCL PB10 SDA PB11,移植代码时可换自己的管脚。软件模拟i2c在十九章中讲过,与其不同的地方是,这里的us延时函数,换成了定时器3做us级的延时。

tim3的配置:

void timer3_config(void)
{
    /* -----------------------------------------------------------------------
	系统主频108MHZ,timer_initpara.prescaler为107,timer_initpara.period为65535,
    一us加一个数,65535重新计数,最大延时us为65535-1
    ----------------------------------------------------------------------- */
    timer_parameter_struct timer_initpara;
    rcu_periph_clock_enable(RCU_TIMER3);
    timer_deinit(TIMER3);
    /* TIMER1 configuration */
    timer_initpara.prescaler         = 108-1;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 65535-1;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER3,&timer_initpara);
    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER3);
    /* auto-reload preload enable */
    timer_disable(TIMER3);
}

void tim3_delay_us(__IO uint32_t us)
{
    timer_counter_value_config(TIMER3,0);
    timer_enable(TIMER3);

    while(timer_counter_read(TIMER3)< us);
    timer_disable(TIMER3);
}

2、光照传感器BH1750配置

1、接线图。

	GD32					BH1750
	PB10   	 ------------- 	SCL
	PB11 	 -------------	SDA
	3.3	     -------------	VCC
	GND	     -------------  GND
	GND		 -------------  ADDR

如果ADDR接地,器件八位地址为01000110,即0x46
如果ADDR接VCC,器件八位地址为10111000,即0xB8

2、初始化的流程
在这里插入图片描述
3、command命令
在这里插入图片描述
4、读写时序图
在这里插入图片描述
以ex2为例:
写命令格式为

start信号+ 器件地址 + command + stop信号。
所以swi2c封装写函数如下:

void swi2c_write_data(uint8_t device_addr,uint8_t *buf,uint8_t len)
{
    swi2c_start();
	swi2c_write_byte(device_addr);//写地址,7位地址左移,低位补0
	swi2c_wait_ack();//等待应答

    while(len)
    {
	    swi2c_write_byte(*buf++);//写位置
	    swi2c_wait_ack();
        len--;
    }
    swi2c_stop();
}

读数据格式:
start信号+ 器件地址(写) + command + 器件地址(读)+ 高低位数据 +stop信号。
封装读数据函数为:

void swi2c_read_data(uint8_t device_addr,uint8_t *buf,uint8_t len)
{
	swi2c_start();
	swi2c_write_byte((device_addr) | 0x01);//读写位改为读
	swi2c_wait_ack();

	while(len > 1)
	{
		*buf++ = swi2c_read_byte();
		swi2c_ack();
		len--;
	}
	*buf = swi2c_read_byte();//循环体结束指针已经指向最后一个字节存放位置
	swi2c_no_ack();//读一个字节结束
	swi2c_stop();	
}

5、根据初始化流程图,我们初始化bh1750的代码如下:

int init_bh1750()
{
    uint8_t power_on = BH_POWER_ON;
    uint8_t reset = BH_RESET;

    swi2c_write_data(0x46,&power_on,1);
    delay_1ms(10);
    swi2c_write_data(0x46,&reset,1);

    return 0;
}

6、读取光照值的代码如下:

int get_light_value(uint16_t *light_value)
{
	uint8_t r_light_data[2] = {0};
	uint8_t high_mode = BH_HMODE_RESOLUTION;
	
	swi2c_write_data(0x46,&high_mode,1);
	delay_1ms(180);
	swi2c_read_data(0x46,r_light_data,2);
	       
	*light_value = ((r_light_data[0] << 8) | r_light_data[1]);
	return 0;
}

在这里插入图片描述
我们采用高分辨率连续读模式,根据上图提示,最大延时180ms。

7、main函数调用。
在这里插入图片描述

3、现象与结果

在这里插入图片描述

4、代码路径

代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/603881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 找回root密码(CentOS7.6)

linux 找回root密码(CentOS7.6) 首先&#xff0c;启动系统&#xff0c;进入开机界面&#xff0c;在界面中按“e”进入编辑界面。如图 2. 进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以““Linux16”开头内容所在的行数”&#xff0c;在行的最后…

java-字符流和字节流(二)

java-字符流和字节流(二) 一、字节缓冲流 1.1字节缓冲流构造方法 字节缓冲流介绍 BufferOutputStream&#xff1a;该类实现缓冲输出流。 通过设置这样的输出流&#xff0c;应用程序可以向底层输出流写入字节&#xff0c;而不必为写入的每个字节导致底层系统的调用 BufferedIn…

chatgpt赋能python:Python动图如何优化SEO?

Python动图如何优化SEO&#xff1f; Python是一种高级编程语言&#xff0c;广泛应用于数据分析、人工智能和网站开发等领域。Python还支持创建动态图像&#xff0c;这些动态图像通常用于数据可视化、演示和教育目的。在本文中&#xff0c;我们将探讨如何使用Python创建动态图像…

chatgpt赋能python:Python加f之SEO的重要性

Python加f之SEO的重要性 随着互联网的不断发展和普及&#xff0c;越来越多的企业和个人纷纷进入到了网站建设&#xff0c;网络营销的大军之中。而SEO作为重要的一环&#xff0c;在各个领域内也变得愈加重要。而Python中的f字符串是近些年来引起广泛关注的一种新的字符串格式化…

chatgpt赋能python:Python动态内存分配:如何优化你的代码

Python动态内存分配&#xff1a;如何优化你的代码 在编写Python代码时&#xff0c;你可能已经注意到内存使用方面的一些问题。Python动态内存分配是一个重要的话题&#xff0c;它涉及到Python程序如何在运行时使用内存。本文将向您介绍Python动态内存分配的基本概念和如何优化…

chatgpt赋能python:Python动态代码在SEO中的重要性

Python动态代码在SEO中的重要性 Python是一种非常流行的编程语言&#xff0c;用于开发Web应用程序、数据分析、人工智能和机器学习。Python的动态代码能够动态生成HTML、CSS和JavaScript来创建动态网页。这种能力使Python在SEO中非常有用&#xff0c;因为它可以帮助网站排名更…

chatgpt赋能python:如何使用Python制作动画?

如何使用Python制作动画&#xff1f; Python是一种高级编程语言&#xff0c;被广泛应用于各种领域&#xff0c;包括动画制作。Python的简洁性和强大的功能使得它成为一个很好的选择来制作动画。在这篇文章中&#xff0c;我将向您介绍使用Python如何制作动画。 第一步&#xf…

Vue3 相关Composition Api 2

一&#xff0c;其他Composition Api shallowReactive 与 shallowRef shallowReactive:只处理对象最外层属性的响应式&#xff08;浅响应式&#xff09;。 shallowRef:只处理基本数据类型的响应式&#xff0c;不进行对象的响应式处理。 什么时候使用&#xff1f; 如果有一个对…

Hive

Hive 概览 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 本质是将SQL转换为MapReduce程序。 主要用途&#xff1a;用来做离线数据分析&#xff0c;比直接用MapReduce开发效率更高。 架构 数…

chatgpt赋能python:用Python制作动画,你不可错过的工具

用Python制作动画&#xff0c;你不可错过的工具 Python是一种高级编程语言&#xff0c;最初被设计用于编写自动化脚本和简化复杂任务。然而&#xff0c;如今它越来越多地被用于创意和艺术性的项目&#xff0c;甚至是动画制作。 Python在动画制作中的优势一直受到赞誉。它是一…

辅助驾驶功能开发-功能算法篇(2)-ACC-状态机跳转设计

1、ACC状态介绍 ALOD_MODE &#xff08;ACC状态&#xff09; 状态说明OFF ACC关闭状态&#xff0c;此时ACC图标不显示&#xff0c;且其他相关信号都发默认值。此状态下车辆完全由驾驶员控制。 PassiveACC已由驾驶员开启&#xff0c;但有抑制条件(如安全带、车门)满足&#xff0…

chatgpt赋能python:Python制作录屏软件,让你的屏幕动作不再错过

Python制作录屏软件&#xff0c;让你的屏幕动作不再错过 作为一名Python工程师&#xff0c;你可能有很多需要记录屏幕操作的场景&#xff0c;比如演示软件或者录制教学视频。那么&#xff0c;有没有一款Python制作的录屏软件来满足你的需求呢&#xff1f;答案是肯定的&#xf…

K-means聚类算法原理、步骤、评价指标和实现

1、聚类 聚类与分类不同&#xff0c;聚类分析分通过分析大量含有一定规律但杂乱数据&#xff0c;得到数据间内在的逻辑&#xff0c;将杂乱的数据按照所得的数据规律划分成不同的种类。K-measn、DBSCAN和层次是当前广泛使用的三种聚类方法。以下对三种方法进行分析&#xff0c;…

Mybatis 如何实现返回多个结果集——详测版

文章结构 本文介绍一个在 Mybatis 中不常见的操作&#xff0c;但是可能有些朋友刚好需要用到&#xff0c;Mybatis 如何实现返回多个结果集 什么情况会返回多个结果集&#xff1a; 存储过程多个 select 语句 具体过程如下&#xff08;作者实测&#xff1a;跟着观战就完事了&a…

chatgpt赋能python:Python:一个强大、适用广泛的编程语言

Python&#xff1a;一个强大、适用广泛的编程语言 作为一种高级编程语言&#xff0c;Python 可以轻松地完成许多计算机编程任务。它是一种协作和代码重用的语言&#xff0c;Python旨在提高生产力并减少缺陷。 对于那些想要学习编程语言的人来说&#xff0c;Python 是非常适合…

Class源码

介绍 如果想要在程序运行阶段访问某个类的所有信息&#xff0c;并支持修改类的状态或者行为的话&#xff0c;肯定会用到反射&#xff0c;而反射靠的就是Class类。 通过Class类可以获取类的实例&#xff0c;构造方法&#xff0c;字段&#xff0c;成员方法&#xff0c;接口等信…

网络编程知识点总结(3)

socket 服务器的开发步骤和代码实现 1.创建套接字 socket()函数 int socket(int domain, int type, int protocol); domain: 指明所使用的协议族&#xff0c;通常为 AF_INET&#xff0c;表示互联网协议族(TCP/IP 协议族)AF_INET IPv4因特网域. AF_INET6 IPv6 因特网域 AF_U…

屏幕录制安卓应用被发现在监视用户

据 ESET 的研究人员称&#xff0c;一款在 Google Play 商店中下载量超过 50,000 次的屏幕录像机应用程序被发现使用设备的麦克风悄悄地录制音频并窃取文件&#xff0c;这表明它可能是间谍活动的一部分。 iRecorder 是一个合法的应用程序&#xff0c;于 2021 年 9 月可用&#…

chatgpt赋能python:Python动态函数介绍

Python动态函数介绍 Python是一种高级编程语言&#xff0c;它支持动态函数。动态函数就是在Python中可以在运行时创建函数。这意味着编程者可以在编写代码时不必事先定义所有函数&#xff0c;而是可以通过Python函数来创建函数。 Python动态函数的一个好处是可以轻松地编写可…

chatgpt赋能python:Python动态列表介绍

Python动态列表介绍 Python是一种常用的高级编程语言&#xff0c;它支持多种数据结构&#xff0c;其中包括列表。以Python中的列表为例&#xff0c;本文将详细介绍Python动态列表的特点和用途。 Python中的列表 在Python中&#xff0c;列表就是一组由逗号分隔&#xff0c;放…