单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用

news2025/6/20 13:22:37

光感芯片veml7700的使用

1、veml有7个寄存器,每个十六位,见图。
在这里插入图片描述
00是config寄存器,
01 02 是中断设置的阈值
03是节能模式的设置
04 是得到的光的亮度值
05是得到的data of whole WHITE
06是中断设置值。
2、我们只测试得到光的亮度值,所以veml寄存器设置如下:
在这里插入图片描述

设置gain,integration time ,power save mode ,interrupt ,power on.
3、数据的换算:
在这里插入图片描述
可以用代码中公式。
在这里插入图片描述
4、代码

#include "gd32f30x.h"
#include "veml7700.h"
#include "i2c.h"
#include <stdio.h>

void veml7700_write(uint8_t reg_addr,uint8_t *p_buf)
{
#if I2C1_MODE == I2C1_MODE_SW
    swi2c_device_write_data(VEML_SLAVE_ADDR,&reg_addr,1,p_buf,2);
#endif
}

void veml7700_read(uint8_t reg_addr,uint8_t *p_buf)
{
#if I2C1_MODE == I2C1_MODE_SW
    swi2c_device_read_data(VEML_SLAVE_ADDR,&reg_addr,1,p_buf,2);
#endif
}

static int get_veml7700_default_value(uint16_t *default_value)
{
    uint8_t rx_data[2] = {0};
    veml7700_read(0x00,rx_data);
    *default_value = ((rx_data[1] << 8) | rx_data[0]);
    return 0;
}

static uint16_t veml7700_get_light_sensor_value(uint8_t command,uint16_t mask,uint8_t shift)
{
    uint8_t rx_data[2] = {0};
    uint16_t r_value = 0;

    veml7700_read(command,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    return (r_value & mask) >> shift;
}

static void veml7700_set_light_sensor_value(uint8_t value,uint8_t command,uint16_t mask,uint8_t shift)
{
    uint8_t rx_data[2] = {0};
    uint8_t tx_data[2] = {0};
    uint16_t r_value = 0;
    uint16_t tmp_value = 0;
    veml7700_read(command,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    tmp_value = r_value & ~(mask);
    tmp_value |= ((value << shift) & mask);

    tx_data[0] = tmp_value & 0xff;
    tx_data[1] = ((tmp_value >> 8) & 0xff); 
    veml7700_write(command,tx_data);
} 

static uint16_t get_power_enable()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_SD,ALS_SD_MASK,ALS_SD_SHIFT);
}

static void set_power_enable(int enable)
{
    return veml7700_set_light_sensor_value(enable,COMMAND_ALS_SD,ALS_SD_MASK,ALS_SD_SHIFT);
}

static uint16_t get_gain_value()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_GAIN,ALS_GAIN_MASK,ALS_GAIN_SHIFT);
}

static void set_gain_value(uint16_t gain)
{
    veml7700_set_light_sensor_value(gain,COMMAND_ALS_GAIN,ALS_GAIN_MASK,ALS_GAIN_SHIFT);
}

static uint16_t get_interrupt_enable()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_INT_EN,ALS_INT_EN_MASK,ALS_INT_EN_SHIFT);
}

static void set_interrupt_enable(uint16_t enable)
{
    veml7700_set_light_sensor_value(enable,COMMAND_ALS_INT_EN,ALS_INT_EN_MASK,ALS_INT_EN_SHIFT);
}

static int get_integration_time() 
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_IT,ALS_IT_MASK,ALS_IT_SHIFT);
   
}

static void set_integration_time(int time)
{
    veml7700_set_light_sensor_value(time,COMMAND_ALS_IT,ALS_IT_MASK,ALS_IT_SHIFT);
}

static int get_power_saving_mode() 
{
    return veml7700_get_light_sensor_value(COMMAND_PSM_EN,PSM_EN_MASK,PSM_EN_SHIFT);
}


static void set_power_saving_mode(int mode)
{
    veml7700_set_light_sensor_value(mode,COMMAND_PSM_EN,PSM_EN_MASK,PSM_EN_SHIFT);
}

static uint16_t get_als_reg_data()
{
    uint8_t rx_data[2] = {0};
    uint16_t r_value = 0;
 
    veml7700_read(COMMAND_ALS_DATA,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    return r_value;
}

static int normalize_resolution(int value)
{
    switch (get_gain_value())
    {

        case ALS_GAIN_X2:
        value /= 2.0;
        break;
        case ALS_GAIN_d4:
            value *= 4;
            break;
        case ALS_GAIN_d8:
            value *= 8;
            break;
        case ALS_GAIN_X1:
        default:break;
        
    }
    switch (get_integration_time()){

        case ALS_INTEGRATION_25ms:
            value *= 4;
            break;
        case ALS_INTEGRATION_50ms:
            value *= 2;
            break;
        case ALS_INTEGRATION_200ms:
            value /= 2.0;
            break;
        case ALS_INTEGRATION_400ms:
            value /= 4.0;
            break;
        case ALS_INTEGRATION_800ms:
            value /= 8.0;
            break;
        case ALS_INTEGRATION_100ms:
        default:break;
    }
    return value;    

} 

int get_lux_data(void)
{
    return normalize_resolution(get_als_reg_data() * 0.0576);
}

void veml7700_init(void)
{
    uint16_t default_value;
    get_veml7700_default_value(&default_value);
 
    if (default_value == 0x0001)
    {
        printf("Have Fined Veml7700!\r\n");
    }
    else
    {
        printf("Veml7700 not exsit %x\r\n",default_value);
        //return ;
    }

    set_power_enable(ALS_POWER_SHUTDOWN);
    printf("get_power_enable %d\r\n",get_power_enable());

    set_interrupt_enable(ALS_INTERRUPT_DISABLE);

    set_gain_value(ALS_GAIN_d8);
    printf("get_gain_value == %d\r\n",get_gain_value());

    set_integration_time(ALS_INTEGRATION_100ms);

    set_power_saving_mode(ALS_POWER_MODE_DISABLE);

    set_power_enable(ALS_POWER_ON);
}

.h 文件

	#ifndef __VEML_7700_H__
	#define __VEML_7700_H__
	
	#define ENABLE_VEML7700  1
	
	#define VEML_SLAVE_ADDR 0x20
	
	#define COMMAND_ALS_DEFAULT_VALUE       0x01  
	// Gain Register
	#define COMMAND_ALS_GAIN                0x00  
	#define ALS_GAIN_MASK                   0x1800  
	#define ALS_GAIN_SHIFT                  11  
	// ALS IT Register
	#define COMMAND_ALS_IT                  0x00  
	#define ALS_IT_MASK                     0x03C0  
	#define ALS_IT_SHIFT                    6  
	// ALS Persistence Register
	#define COMMAND_ALS_PER                 0x00  
	#define ALS_PER_MASK                    0x0030  
	#define ALS_PER_SHIFT                   4  
	// ALS INT EN Register
	#define COMMAND_ALS_INT_EN              0x00  
	#define ALS_INT_EN_MASK                 0x0002  
	#define ALS_INT_EN_SHIFT                1  
	// ALS SD Register
	#define COMMAND_ALS_SD                  0x00  
	 #define ALS_SD_MASK                     0x0001  
	#define ALS_SD_SHIFT                    0  
	// ALS Window High
	#define COMMAND_ALS_WH                  0x01  
	// ALS Window Low
	#define COMMAND_ALS_WL                  0x02  
	// ALS Power Save Mode
	#define COMMAND_PSM                     0x03  
	#define PSM_MASK                        0x0006  
	#define PSM_SHIFT                       1  
	// ALS Power Save Mode Enable
	#define COMMAND_PSM_EN                  0x03  
	#define PSM_EN_MASK                     0x0001  
	#define PSM_EN_SHIFT                    0  
	// ALS High Resolution Output Data
	#define COMMAND_ALS_DATA                0x04  
	//White Channel Output Data
	#define COMMAND_WHITE_DATA              0x05  
	// Interrupt Status
	#define COMMAND_ALS_IF_L                0x06  
	#define ALS_IF_L_MASK                   0x8000  
	#define ALS_IF_L_SHIFT                  15  
	#define COMMAND_ALS_IF_H                0x06  
	#define ALS_IF_H_MASK                   0x4000  
	#define ALS_IF_H_SHIFT                  14  
	
	#define ALS_GAIN_X1                      0x0  
	#define ALS_GAIN_X2                      0x1  
	#define ALS_GAIN_d8                      0x2  
	#define ALS_GAIN_d4                      0x3  
	
	#define ALS_INTEGRATION_25ms             0xC  
	#define ALS_INTEGRATION_50ms             0x8  
	#define ALS_INTEGRATION_100ms            0x0  
	#define ALS_INTEGRATION_200ms            0x1  
	#define ALS_INTEGRATION_400ms            0x2  
	#define ALS_INTEGRATION_800ms            0x3  
	
	#define ALS_PERSISTENCE_1                0x0  
	#define ALS_PERSISTENCE_2                0x1  
	#define ALS_PERSISTENCE_4                0x2  
	#define ALS_PERSISTENCE_8                0x3  
	
	#define ALS_POWER_MODE_1                 0x0  
	#define ALS_POWER_MODE_2                 0x1  
	#define ALS_POWER_MODE_3                 0x2  
	#define ALS_POWER_MODE_4                 0x3  
	
	#define ALS_POWER_MODE_ENABLE            0x1  
	#define ALS_POWER_MODE_DISABLE           0x0  
	
	#define ALS_INTERRUPT_ENABLE             0x1  
	#define ALS_INTERRUPT_DISABLE            0x0  
	
	#define ALS_POWER_ON                     0x0  
	#define ALS_POWER_SHUTDOWN               0x1  
	
	void veml7700_init(void);
	int get_lux_data(void);
	#endif

main函数调用,先调用init函数,然后在while循环中点用get_lux_data函数。
在这里插入图片描述
在这里插入图片描述
5、打印以及现象:
在这里插入图片描述
6、代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git

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

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

相关文章

86盒IP对讲一键报警器

86盒IP对讲一键报警器 86盒IP对讲一键报警器&#xff1a;革命性保障生命安全的利器&#xff01; 随着科技的飞速发展&#xff0c;我们的生活变得越来越方便和智能化。而86盒IP对讲一键报警器更是在这种背景下应运而生。这款产品不仅无缝对接各种手机APP&#xff0c;也可以在智…

Linux系统crash后定位方法-PCIE举例

crash解释 在Linux操作系统中&#xff0c;"crash"通常是指一种用于分析系统崩溃&#xff08;crash&#xff09;的工具或方法。当系统发生崩溃时&#xff0c;可能会产生一些关键信息&#xff0c;如错误日志、内存转储文件等。使用crash工具可以分析这些信息&#xff…

零基础自学【Web安全/网络渗透】,保姆级快速入门指南(非常详细)

前言 基础真的很简单&#xff0c;是个人稍微认点真都能懂&#xff0c;这就是好多人说的网络安全简单、易懂、好学&#xff0c;然后就是一顿浮夸的言论&#xff0c;误导那些小白&#xff0c;再然后那些小白也就跟着浮夸。这里我就给那些轻浮的人泼一桶冷水&#xff0c;懂跟学会…

香港人才引进只看本科排名,“以本科定终身”是否公平?

2022年10月20日&#xff0c;香港特首在《2022 施政报告》时公布&#xff0c;新推出高端人才通行证计划&#xff0c;简称“高才通”&#xff0c;豪言3年引入10万人才&#xff0c;接受全球百强名校本科毕业的高材生或年收入超过250万港币的高收入群体到香港工作。 香港高才通是目…

【数据结构】链表(C语言实现)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

丁鹿学堂:vue的脚手架项目基础入门和单文件代码分析

在实际开发中&#xff0c;我们都是通过脚手架创建vue项目的。 默认安装了node&#xff0c;yarn&#xff0c; 1创建项目&#xff1a; yarn create vue为了学习&#xff0c;我们选择最简单的培训&#xff0c;一路下来都选no 2 创建项目以后&#xff0c;只是搭起了架子&#x…

Uniapp一言“一句话接口调用

界面 代码 <template><view ><view class"uni-padding-wrap uni-common-mt"><view class"text-box" scroll-y"true"><text>{{data}}</text></view><view class"uni-btn-v"><butto…

(C语言版)力扣(LeetCode)栈和队列面试题

栈和队列面试题 20. 有效的括号题目解法一&#xff1a;建立栈解决解法二&#xff1a;数组模拟栈解决 225. 用队列实现栈题目解法&#xff1a;两个队列实现栈 232. 用栈实现队列题目解法&#xff1a;两个栈实现队列 622. 设计循环队列题目解法一&#xff1a;数组解法二&#xff…

AcWing算法提高课-1.3.3宠物小精灵之收服

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事。 一天&#xff0c;小智和皮卡丘来到了小精灵狩猎场&#xff0c;里面有…

Stable Diffusion 生成高清图片

Stable Diffusion 生成 8K 高清图片 0. 简介1. 安装 ultimate-upscale-for-automatic1111 插件2. 安装 4x-UltraSharp 模型3. 生成 1 张普通图片4. 生成 1 张高清图片 0. 简介 记录一下使用 Stable Diffusion 生成高清图片使用的插件和过程。 1. 安装 ultimate-upscale-for-a…

Qt推流程序(视频文件/视频流/摄像头/桌面转成流媒体rtmp+hls+webrtc)可在网页和播放器远程观看

一、前言说明 推流直播就是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号从手机端&#xff0c;电脑端&#xff0c;摄影机端打包传到服务器的过程。“推流”对网络要求比较高&#xff0c;如果网络不稳定&#xff0c;直播效果就会很差&#xff0c;观众观…

Linux基础篇-将虚拟机的网络配置成静态的

一般都是主机连接服务器&#xff0c;服务器连接主机也是为了上网&#xff0c;通过NAT地址转换就可以。为了防止服务器的IP地址变化&#xff0c;将虚拟机的IP地址设置成静态的。 NAT模式下&#xff0c;为了让主机和虚拟机之间能互相ping通&#xff0c;主机虚拟了一张网卡出来&am…

PicGo+阿里云OSS+Typora图床设置实践及解决方案

你是否遇到想跨平台看markdown文件结果图片加载不出&#xff0c;csdn上传的时候还要手动操作的命苦感&#xff0c;那就接着往下看吧&#xff01; 本文为作者在安装过程中的总结&#xff0c;争取以最简洁的方式帮助大家安装 markdown语法在程序员的生活中运用广泛&#xff0c;…

测试用例、测试流程模型、测试方法详解 超详细分解

1. 测试用例 1.1 测试用例前提 什么是测试用例&#xff1f; 一组由前提条件、测试输入、执行条件以及预期结果等组成&#xff0c;以完成对某个特定需求或者目标测试的数据&#xff0c;体现测试方案、方法、技术和策略的文档。 为什么编写测试用例 &#xff08;1&#xff0…

股票量价关系基础知识1

什么叫成交量 成交量的概念中&#xff0c;包含“成交”、“成交量”和“成交值”三个子概念。 所谓“成交”&#xff0c;就是买卖双方同意所达成的交易行为。“成交”是商业用语&#xff0c;因为股市本事就是一项商业活动&#xff0c;股票市场就是一个大商场&#xff0c;各地证…

每日学术速递5.9

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Tracking through Containers and Occluders in the Wild(CVPR 2023) 标题&#xff1a;在野外通过容器和遮挡物进行追踪 作者&#xff1a;Basile Van Hoorick, Pavel Tokmakov, Si…

C++数据封装以及定义结构的详细讲解鸭~

名字&#xff1a;阿玥的小东东 博客主页&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 定义结构 访问结构成员 结构作为函数参数 指向结构的指针 typedef 关键字 C 数据封装 数据封装的实例 设计策略 C 类 &…

UEngine运行器2.1.0——优化UEngine安装器(Ubuntu)、修复问题

介绍 新版本Deepin/UOS发布后&#xff0c;可以在应用商店安装部分官方已适配的安卓应用&#xff0c;对爱好者来说&#xff0c;不能自己安装APK软件包始终差点意思&#xff0c;本程序可以为Deepin/UOS上的UEngine安卓运行环境安装自定义APK软件包&#xff0c;并能发送安装的APK包…

【GAMES101】作业1学习总结

本系列博客为记录笔者在学习GAMES101课程时遇到的问题与思考。 GAMES101&#xff1a;课程官网GAMES101&#xff1a;B站视频GAMES101&#xff1a;相关文件下载(百度网盘) 一、基础题 通过Assignment1.pdf可以知道基础题的任务就是填充完整两个函数 get_model_matrix()get_pro…

详解c++---array和模板

目录标题 什么是array非类型模板参数函数模板的特化为什么会有特化如何进行特化类模板的特化部分特化模板特化参数的限制 模板的匹配规则模板的分离编译模板的总结 什么是array 在c语言里面使用一个括号就能申请到一段连续的空间&#xff0c;比如说想要申请一段空间用于存储10…