STM32应用开发——BH1750光照传感器详解

STM32应用开发——BH1750光照传感器详解

目录

  • STM32应用开发——BH1750光照传感器详解
    • 前言
    • 1 硬件介绍
      • 1.1 BH1750简介
      • 1.2 硬件接线
    • 2 软件编程
      • 2.1 软件原理
        • 2.1.1 IIC设备地址
        • 2.1.2 IIC读写
        • 2.1.3 BH1750指令集
        • 2.1.4 BH1750工作流程
        • 2.1.5 BH1750测量模式
      • 2.2 测试代码
      • 2.3 运行测试
    • 结束语

前言

几年前我发布了一篇关于STM32+BH1750光照传感器的博客,因为大学时期经验欠缺,无论是代码还是博客,都有很多不足之处,也收到了非常多同学的反馈。于是我重新整理了代码和文章,这是一个全新版本。

1 硬件介绍

1.1 BH1750简介

BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。

注:这个模块只适用于室内环境或者学习使用,户外场景下会超量程。

BH1750的引脚如下:

引脚号名称功能
1VCC电源正
2ADDR地址端口
3GND电源负
4SDAIIC数据线
5DVIIIC端口参考电压
6SCLIIC时钟线

注:上述引脚指的是芯片的引脚,如果用的是某宝买的那种传感器模式,引出来的排针引脚排列是不同的。

参考外围电路如下:
在这里插入图片描述

1.2 硬件接线

本文使用STM32F103作为主控MCU,STM32和BH1750的引脚连接如下表:

STM32BH1750功能
VCCVCC电源正,3.3V供电
GNDGND电源负
PA4SCLIIC时钟线,必须外接上拉电阻
PA5SDAIIC数据线,必须外接上拉电阻
GNDADDR地址端口

注:BH1750用的是模块,模块上已经有接上拉电阻了,因此STM32这边就不需要再接了。另外,ADDR引脚默认有一个下拉电阻,因此不接地其实也是没关系的。

BH1750模块的电路图如下:
在这里插入图片描述

2 软件编程

2.1 软件原理

BH1750是一个IIC设备,通讯协议遵循标准IIC协议。只需要着重关注设备地址,发送命令,读取寄存器即可。

2.1.1 IIC设备地址

所有IIC设备都有一个专属的设备地址,BH1750也不例外,BH1750一共有2个设备地址,可以通过芯片的ADDR引脚切换。
数据手册原文如下:
在这里插入图片描述
翻译过来的话,设备地址的配置如下:

ADDR引脚电平7bit地址8bit地址
高电平0x230x46
低电平0x5C0xB8

注:这里解释一下7bit地址和8bit地址。
IIC设备的地址一般来说都只有7位,也就是7bit地址,BH1750数据手册上面写的也是7bit地址。
但是设备地址并不是单独使用的,在地址后面需要补1个读写位(不懂的先看下IIC通信协议),也就相当于把7bit的地址左移了1位,那么得到的值就是8bit地址。
所以,在IIC进行读写的时候,要用7bit地址还是8bit地址取决于你这个读写函数里面有没有对这个地址进行移位操作。

2.1.2 IIC读写

1、IIC写入流程。
在这里插入图片描述
时序解释:先发送设备地址+读写位,再发送指令数据。

题外话:
大多数IIC设备,在发送的这串数据中,往往会把第1个字节的数据作为1个寄存器地址(有些也叫偏移),随后才是真正的数据。这样一来,就可以通过1个字节或多个字节的寄存器地址,来实现数据和命令的扩展。
不过BH1750可能是因为功能比较简单,它没有采用这种方式,读写似乎都在同一个寄存器里面操作。

2、IIC读取流程。
在这里插入图片描述
时序解释:先发送设备地址+读写位,随后读取两个数据(其中高位数据在前,低位数据在后)。

题外话:
这个读取的流程跟绝大多数IIC设备的读取流程是一样的。

2.1.3 BH1750指令集

在初始化BH1750时,通过发送1个字节的指令即可配置BH1750的模式。

详细指令集如下表:
在这里插入图片描述

2.1.4 BH1750工作流程

根据数据手册的描述,配置流程如下图:

在这里插入图片描述
总结一下这个流程:
第1步:给BH1750供电。
第2步:BH1750上电后默认为断电模式(此断电模式不是说芯片没有电,而是芯片没有进入工作模式)。
第3步:通过发送指令,把BH1750配置为通电模式(此时芯片进入工作模式)。
第4步:发送测量指令(测量方式有多种,详细信息看上面2.1.3的指令集)。
第5步:读取测量结果并转换成光照值。

按照上面这个流程走,就可以使BH1750正常工作。

2.1.5 BH1750测量模式

BH1750有6种测量模式,每种模式有各自的特点,详见下表:

测量模式精度测量时间备注
一次H分辨率模式1 lx120ms该模式配置完成后会自动进行一次测量,测量完成后会切换到断电模式
一次H分辨率模式20.5 lx120ms该模式配置完成后会自动进行一次测量,测量完成后会切换到断电模式
一次L分辨率模式4 lx16ms该模式配置完成后会自动进行一次测量,测量完成后会切换到断电模式
连续H分辨率模式1 lx120ms该模式配置完成后会自动进行连续测量,无需重复配置
连续H分辨率模式20.5 lx120ms该模式配置完成后会自动进行连续测量,无需重复配置
连续L分辨率模式4 lx16ms该模式配置完成后会自动进行连续测量,无需重复配置

总结:
L分辨率模式采集时间短,但精度差,适用于采集光照变化大且变化非常快的场景。
H分辨率模式采集时间长,但精度高,适用于光照变化速度不快的场景。
一次采集模式适用于采集间隔时间长或者需要省电的场景。
连续采集模式适用于对设备节能没有要求的大多数场景。

2.2 测试代码

根据上述原理,编写测试代码,主要的代码清单如下:

文件名代码内容
iic_software.h定义了软件IIC所需的引脚定义和电平设置,方便修改IO或者移植
iic_software.c软件IIC代码主体
bh1750.h定义了BH1750的相关信息,如设备地址,命令等
bh1750.cBH1750驱动主体,底层调用软件IIC接口
uart.c串口主体,用来打印测量过程和结果
main.c主函数

注:除了串口的代码,其他代码全部都在下面贴出来了。串口的教程很多,这里就不细说了,本文主要介绍如何驱动BH1750,尝试了几种测量模式,结果都由串口打印出来,不需要使用串口的话注释掉即可,如果需要现在在LCD屏或者OLED屏,请自行增加这部分的代码。

测试示例代码如下:

iic_software.h :

#ifndef __IIC_SOFTWARE_H__
#define __IIC_SOFTWARE_H__#include "stm32f10x.h"
#include "stm32f10x_gpio.h"// IIC SCL引脚配置
#define IIC_SCL_CLOCK   RCC_APB2Periph_GPIOA     // 时钟
#define IIC_SCL_PORT    GPIOA                    // 端口
#define IIC_SCL_PIN     GPIO_Pin_4               // 引脚号
// IIC SCL电平设置
#define SET_IIC_SCL(s)  s > 0 ? GPIO_SetBits(IIC_SCL_PORT, IIC_SCL_PIN) : GPIO_ResetBits(IIC_SCL_PORT, IIC_SCL_PIN)// IIC SDA引脚配置
#define IIC_SDA_CLOCK   RCC_APB2Periph_GPIOA     // 时钟
#define IIC_SDA_PORT    GPIOA                    // 端口
#define IIC_SDA_PIN     GPIO_Pin_5               // 引脚号
// IIC SDA电平设置
#define SET_IIC_SDA(s)  s > 0 ? GPIO_SetBits(IIC_SDA_PORT, IIC_SDA_PIN) : GPIO_ResetBits(IIC_SDA_PORT, IIC_SDA_PIN)  
#define READ_IIC_SDA    GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN)void iic_init(void);
uint8_t iic_write_bytes(uint8_t addr, uint8_t *buf, uint8_t buf_size);
uint8_t iic_receive_bytes(uint8_t addr, uint8_t *buf, uint8_t buf_size);#endif

iic_software.c :

#include "iic_software.h"
#include "delay.h"
#include "stdio.h"/* IIC软件模拟时序延时函数 */
void iic_delay(uint16_t us)
{delay_us(us);
}/* IIC起始信号 */
void set_iic_sda_mode(uint8_t mode)
{GPIO_InitTypeDef GPIO_InitStruct;if(mode > 0){// 设置为输出模式GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏或推挽,外部需要接上拉电阻}else{// 设置为输入模式GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 浮空或上拉,外部需要接上拉电阻}GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Pin = IIC_SDA_PIN;GPIO_Init(IIC_SDA_PORT, &GPIO_InitStruct);
}/* IIC起始信号 */
void iic_start(void)
{SET_IIC_SDA(1);SET_IIC_SCL(1);iic_delay(5);SET_IIC_SDA(0);     SET_IIC_SCL(0);          iic_delay(5);  
}/* IIC停止信号 */
void iic_stop(void)
{SET_IIC_SCL(0);SET_IIC_SDA(0);                iic_delay(5);                    SET_IIC_SCL(1);           SET_IIC_SDA(1);                  iic_delay(5);
}/* IIC发送应答信号 */
uint8_t iic_send_ack(int ack)
{set_iic_sda_mode(1);if(ack == 1){// 发送ACkSET_IIC_SDA(1); }else if(ack == 0){// 发送NACKSET_IIC_SDA(0); }else{return 0;  // 入参有误,发送失败}         SET_IIC_SCL(1);     iic_delay(5);     SET_IIC_SCL(0);     iic_delay(5);    return 1;  // 发送成功
}/* IIC接收应答信号 */
uint8_t iic_wait_ack(void)
{uint8_t ack = 0;uint8_t timeout = 5;SET_IIC_SDA(1); set_iic_sda_mode(0);  // SDA输入模式SET_IIC_SCL(1);           iic_delay(5);  while(timeout--)       {// 等待从设备发送ACKif(READ_IIC_SDA == 0){// 读到应答信号ack = 1;  }else{// 没有读到应答信号,继续等待iic_delay(1);if(timeout == 0){// 等待超时ack = 0; }}}           SET_IIC_SCL(0);             iic_delay(5);        set_iic_sda_mode(1); // SDA输出模式return ack;
}/* IIC总线发送1个字节数据 */
uint8_t iic_send_byte(uint8_t dat)
{uint8_t i;for (i = 0; i < 8; i++){if(0x80 & dat){SET_IIC_SDA(1); }else{SET_IIC_SDA(0); }dat <<= 1;SET_IIC_SCL(1);          iic_delay(5);             SET_IIC_SCL(0); iic_delay(5);}return iic_wait_ack();  // 返回从设备应答信号
}/* IIC总线接收1个字节数据 */
uint8_t iic_receive_byte(void)
{uint8_t i;uint8_t dat = 0;uint8_t bit;set_iic_sda_mode(0);  // SDA输入模式for (i = 0; i < 8; i++){dat <<= 1;SET_IIC_SCL(1);iic_delay(5);if(READ_IIC_SDA == 1){bit = 0X01;}else{bit = 0x00;  }dat |= bit;        //读数据    SET_IIC_SCL(0);iic_delay(5);}        set_iic_sda_mode(1); // SDA输出模式return dat;
}/* IIC发送多个数据 */
uint8_t iic_write_bytes(uint8_t addr, uint8_t *buf, uint8_t buf_size)
{uint8_t i;uint8_t result = 0;iic_start();                   // 起始信号if(iic_send_byte(addr << 1))   // 发送设备地址(7bit地址){// 收到应答,发送成功for (i = 0; i < buf_size; i++)  // 发送数据{if(iic_send_byte(buf[i])){// 收到应答,发送成功result = 1;}else{// 没有收到应答,发送失败result = 0; }}}iic_stop();                   // 发送停止信号return result;
}/* IIC接收多个数据 */
uint8_t iic_receive_bytes(uint8_t addr, uint8_t *buf, uint8_t buf_size)
{uint8_t i;    uint8_t result = 0;iic_start();                        // 起始信号if(iic_send_byte((addr << 1) | 1))  // 发送设备地址(7bit地址){for (i = 0; i < buf_size; i++)    // 连续读取数据{*buf++ = iic_receive_byte(); if (i == buf_size - 1){iic_send_ack(1);   // 最后一个数据需要回NACK}else{        iic_send_ack(0);   // 发送ACK}}result = 1;}iic_stop();                // 停止信号return result;
}/* IIC初始化 */
void iic_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(IIC_SCL_CLOCK, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Pin = IIC_SCL_PIN;GPIO_Init(IIC_SCL_PORT, &GPIO_InitStruct); RCC_APB2PeriphClockCmd(IIC_SDA_CLOCK, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Pin = IIC_SDA_PIN;GPIO_Init(IIC_SDA_PORT, &GPIO_InitStruct); 
}

bh1750.h :

#ifndef __BH1750_H__
#define __BH1750_H__#include "stm32f10x.h"#define BH1750_ADDRESS_LOW      0x23    // addr low  7bit:0x23 8bit:0x46
#define BH1750_ADDRESS_HIGH     0x5C    // addr high 7bit:0x5C 8bit:0xB8/*bh1750 registers define */
#define BH1750_POWER_ON			0x01	// power on
#define BH1750_POWER_DOWN   	0x00	// power down
#define BH1750_RESET			0x07	// reset	
#define BH1750_CON_H_RES_MODE	0x10	// Continuously H-Resolution Mode
#define BH1750_CON_H_RES_MODE2	0x11	// Continuously H-Resolution Mode2 
#define BH1750_CON_L_RES_MODE	0x13	// Continuously L-Resolution Mode
#define BH1750_ONE_H_RES_MODE	0x20	// One Time H-Resolution Mode
#define BH1750_ONE_H_RES_MODE2	0x21	// One Time H-Resolution Mode2
#define BH1750_ONE_L_RES_MODE	0x23	// One Time L-Resolution Modeuint8_t bh1750_init(void);
void bh1750_read_example(void);#endif

bh1750.c :

#include "bh1750.h"
#include "iic_software.h"
#include "delay.h"#define LOG_ENABLE#ifdef LOG_ENABLE#include "stdio.h"#define LOG   printf
#else#define LOG(format, ...)    
#endifuint8_t current_mode;    // BH1750的测量模式
float current_light;     // BH1750的测量光照值// BH1750延时函数
void bh1750_delay(uint16_t ms)
{// ms级延时,BH1750每次测量都需要时间,该函数用于等待测量结果delay_ms(ms);
}// 写命令
uint8_t bh1750_write_cmd(uint8_t cmd)
{return iic_write_bytes(BH1750_ADDRESS_LOW, &cmd, 1);
}// 写寄存器
uint8_t bh1750_read_regs(uint8_t *buf, uint8_t buf_size)
{return iic_receive_bytes(BH1750_ADDRESS_LOW, buf, buf_size);
}// 复位
uint8_t bh1750_reset(void)
{return bh1750_write_cmd(BH1750_RESET);
}
// 打开电源
uint8_t bh1750_power_on(void)
{return bh1750_write_cmd(BH1750_POWER_ON);
}// 关闭电源
uint8_t bh1750_power_down(void)
{return bh1750_write_cmd(BH1750_POWER_DOWN);
}// 设置测量模式
uint8_t bh1750_set_measure_mode(uint8_t mode)
{uint8_t result = 0;if(bh1750_write_cmd(mode)){result =  1;}return result;
}// 单次读取光照值
uint8_t bh1750_single_read_light(uint8_t mode, float *light)
{// 单次测量模式在测量后会自动设置为断电模式   uint8_t temp[2];uint8_t result = 0;if(mode != BH1750_ONE_H_RES_MODE && mode != BH1750_ONE_H_RES_MODE2 && mode != BH1750_ONE_L_RES_MODE){LOG("bh1750 single read measure mode error! mode:0x%02x\n", mode);return result;}if(bh1750_set_measure_mode(mode)) // 每次采集前先设置模式{LOG("bh1750 set measure mode success! mode:0x%02x\n", mode);current_mode = mode;switch (mode){case BH1750_ONE_H_RES_MODE:  // 单次H分辨率模式(精度1lx,测量时间120ms)bh1750_delay(120);  // 等待采集完成break;case BH1750_ONE_H_RES_MODE2: // 单次H分辨率模式(精度0.5lx,测量时间120ms)bh1750_delay(120);  // 等待采集完成break;case BH1750_ONE_L_RES_MODE:  // 单次L分辨率模式(精度4lx,测量时间16ms)bh1750_delay(16);  // 等待采集完成break;default:break;}if(bh1750_read_regs(temp, 2))  // 读取测量结果{*light = ((float)((temp[0] << 8) + temp[1]) / 1.2); // 换算成光照值result = 1;}else{LOG("bh1750 read light failed!");}}else{LOG("bh1750 set measure mode failed! mode:0x%02x\n", mode);return result;}return result;
}// 连续读取光照值
uint8_t bh1750_continuous_read_light(uint8_t mode, float *light)
{   uint8_t temp[2];uint8_t result = 0;if(mode != BH1750_CON_H_RES_MODE && mode != BH1750_CON_H_RES_MODE2 && mode != BH1750_CON_L_RES_MODE){LOG("bh1750 continuous read measure mode error! mode:0x%02x\n", mode);return result;}if(mode != current_mode){// 要使用的测量模式和BH1750当前的模式不同,则配置成相同模式if(bh1750_set_measure_mode(mode)){LOG("bh1750 set measure mode success! mode:0x%02x\n", mode);current_mode = mode;}else{// 模式设置失败LOG("bh1750 set measure mode failed! mode:0x%02x\n", mode);return result;}switch (mode){case BH1750_CON_H_RES_MODE:  // 连续H分辨率模式(精度1lx,测量时间120ms)bh1750_delay(120);  // 等待采集完成break;case BH1750_CON_H_RES_MODE2: // 连续H分辨率模式(精度0.5lx,测量时间120ms)bh1750_delay(120);  // 等待采集完成break;case BH1750_CON_L_RES_MODE:  // 连续L分辨率模式(精度4lx,测量时间16ms)bh1750_delay(16);  // 等待采集完成break;default:break;}}if(bh1750_read_regs(temp, 2))  // 读取测量结果{*light = ((float)((temp[0] << 8) + temp[1]) / 1.2); // 换算成光照值result = 1;}else{LOG("bh1750 read light failed!");}return result;
}// BH1750初始化
uint8_t bh1750_init(void)
{uint8_t result = 0;iic_init();        // IIC初始化result = bh1750_power_on(); // 打开BH1750电源current_mode = 0;return result;
}// 参考例程:使用BH1750读取光照值
void bh1750_read_example(void)
{
#if 1// 单次采集模式if(bh1750_single_read_light(BH1750_ONE_H_RES_MODE2, &current_light)){LOG("bh1750 single read light: %0.1f\n", current_light);}bh1750_delay(100);
#else// 连续采集模式if(bh1750_continuous_read_light(BH1750_CON_H_RES_MODE2, &current_light)){LOG("bh1750 continuous read light: %0.1f\n", current_light);}bh1750_delay(120); // 注:因为连续读取函数里面没有做延迟等待处理,因此这里的等待时间如果小于测量时间,那么读取到的值有可能是上一轮测量的值
#endif
}

main.c :

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "bh1750.h"int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init();              uart_init(115200);      bh1750_init();while(1){bh1750_read_example();}        
}    

2.3 运行测试

通过逻辑分析仪抓取IIC通讯的波形,分别测试了一次H分辨率模式2连续H分辨率模式2,结果如下:

1、一次H分辨率模式2时序测量
初始化设备:
先发送通电命令(0x01),再设置为单次 H 分辨率模式 2(0x21)。
请添加图片描述
读取光照值(设备地址为0x23):
在这里插入图片描述
串口打印结果:
在这里插入图片描述

2、连续H分辨率模式2时序测量
初始化设备:
先发送通电命令(0x01),再设置为连续 H 分辨率模式 2(0x11)。
在这里插入图片描述

读取光照值(设备地址为0x23):
在这里插入图片描述
串口打印结果:
在这里插入图片描述

3、其他测量
测量IIC时钟周期:
软件模拟的CLK周期约为13us,换算成频率约76.9kHz。
IIC参考时钟是100kHz,不过一般小于400kHz都是没什么问题的,需要调快的话可以修改上面模拟IIC收发函数的CLK延时时间来实现。
在这里插入图片描述
测试结果:IIC波形没有异常,串口结果没有异常,BH1750工作一切正常。

结束语

关于STM32如何驱动BH1750的讲解就到这里,如果还有什么问题,欢迎在评论区留言。

源码下载:
链接:https://pan.baidu.com/s/1aX2bYBAOgnkBlL2lzmGYjg
提取码:1234

如果这篇文章能够帮到你,就…你懂的。
在这里插入图片描述

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

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

相关文章

【剪映专业版】10时间线工具:主轨磁吸、自动吸附、联动、预览轴、全局缩放预览

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 主轨&#xff1a;有封面标志的轨道才是主轨。 主轨磁吸&#xff1a;开启后&#xff0c;在主轨上移动素材&#xff0c;自动向前磁吸&#xff0c;在其他轨道上移动无此效果&#xff1b;关闭后&#xff0c;不自动向前磁吸&…

6个步骤轻松实现Postman接口压力测试(建议收藏)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这里讲是postman做接口并发测试&#xff0c;基础用法不做…

这些年背过的面试题--MySQL篇

MySQL一直是面试中的热点问题&#xff0c;也难道了很多的面试者。其实MySQL没那么难&#xff0c;只是大家没有系统化、实战性的过去学习、总结。同时很多开发者在实际的开发过程中也很少去接触一些偏向底层的知识。 本手册&#xff0c;已总结成完整的PDF文档。想获取该文档&am…

opencv的cmake报错

opencv编译报错 CMakeDownloadLog.txt #use_cache "D:/opencv/.cache" #do_unpack "ippicv_2021.8_win_intel64_20230330_general.zip" "71e4f58de939f0348ec7fb58ffb17dbf" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/1…

遇事不决 量子力学?

文章目录 引入量子力学产生的必然性量子力学名称的由来粒子&#xff1f;波&#xff1f;波粒二象性测不准原理 &#xff08;不确定原理&#xff09;叠加态原理 量子纠缠态叠加量子纠缠量子纠缠实验 逻辑判断&#xff0c;量子力学到底完善吗观测量子纠缠&#xff1f;那我们宏观世…

快慢指针的应用

快慢指针的原理 快慢指针是利用两个指针移动速度的不一样&#xff0c;实现一些有趣的追击行为。就像上学时求解的那些操场上的追击问题一样。 问题1&#xff1a;判断两个链表是否相交。&#xff08;链表不存在环结构&#xff09; 形如&#xff1a; 方法&#xff1a;循环第一…

谷歌开源专业代码模型:对硬件要求低,性能超强!

谷歌发布了面向企业、开发人员的全新代码模型Code Gemma&#xff0c;一共有基础预训练、指令微调和快速推理三个版本。 Code Gemma是基于谷歌在今年2月发布的Gemma模型之上开发而成。其参数很小只有20亿和70亿两种&#xff0c;但使用了超过5000亿tokens的代码、数学、文本等数…

vue2和vue3的v-if与v-for优先级对比

Vue.js 中使用最多的两个指令就是 v-if 和 v-for&#xff0c;因此我们可能会想要同时使用它们。虽然官方不建议这样做&#xff0c;但有时确实是必须的&#xff0c;我们来了解下他们的工作方式&#xff1a; 在 vue 2.x 中&#xff0c;在一个元素上同时使用 v-if 和 v-for 时&am…

【第七届openGauss技术文章征集】 openGauss新版本征文活动来啦!

活动背景 2024年3月30日&#xff0c;openGauss 6.0.0版本正式上线&#xff0c;该版本与之前版本特性功能保持兼容&#xff0c;在内核能力、DataPod三层资源池化架构、DataKit数据全生命周期管理平台、生态兼容性等方面全面增强。&#xff08;下方【点击原文】即可查看更多【新…

【GPT-4最新研究】GPT-4与科学探索:揭秘语言模型在科学领域的无限可能

各位朋友们&#xff0c;你们知道吗&#xff1f;自然语言处理领域最近取得了巨大的突破&#xff01;大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;简直就像打开了新世界的大门。它们不仅在语言理解、生成和翻译方面表现出色&#xff0c;还能涉足许多其他领域&…

【绘图案例-屏幕截图 Objective-C语言】

一、屏幕截图 1.接下来,我们来说这个屏幕截图, 1.看一下我们的ppt, 屏幕截图呢,核心代码,也就是一句话, 我们看ppt上说,有时候需要从屏幕上的某一个View啊,截取一个图片出来,然后呢,这个里边儿,它举的一个例子,就是这个东西,捕鱼达人的这个图片,实际上,屏幕截图…

突破界限:LangChain 引领 AI 应用构建的新时代

前言 在上一篇文章中我们对 ChatWithPDF 的方案设计进行了整体的概览&#xff0c;现在细化下整体流程&#xff0c;如下图所示&#xff1a; 针对上面的流程&#xff0c;我们思考&#x1f914;一下会面临的问题&#xff1a; 如何读取 PDF 中的内容&#xff1f;&#xff08;肯定…

一些重新开始面试之后的八股文汇总

一、内存中各项名词说明 1、机器内存概念说明 linux中的free命令可以查看机器的内存使用情况&#xff0c;vmstat命令也可以 其中不容易被理解的是&#xff1a; 内存缓冲/存数&#xff08;buffer/cached&#xff09; 1.buffers和cache也是RAM划分出来的一部分地址空间 2.buff…

如何利用逻辑引擎的对象变量节点优化表单数据处理?

JVS逻辑引擎-对象变量节点 概述 对象变量是面向对象编程中的一个重要概念。在编程中&#xff0c;对象变量用于存储对象的引用。在Java中&#xff0c;使用“类名变量名”可以创建一个对象变量&#xff0c;但此时对象变量本身并没有任何值。要赋予对象变量具体的值&#xff0c;…

Type-C接口PD取电IC6500

一、引言 随着科技的不断进步&#xff0c;移动设备已经成为我们日常生活中不可或缺的一部分。其中&#xff0c;电源管理对于确保设备的稳定运行和延长电池寿命至关重要。Type-C接口作为现代移动设备的主要电源和数据接口&#xff0c;其高效、便捷的特性得到了广泛应用。而Powe…

基于springboot实现音乐网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现音乐网站管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足&#xff0c;创建了一个计算机管理音乐网站的方案。文章介绍了音乐…

李彦宏:开源模型会越来越落后

李彦宏&#xff1a;开源模型会越来越落后 昨天听完的李总讲座 大家以前用开源觉得开源便宜&#xff0c;其实在大模型场景下&#xff0c;开源是最贵的。所以&#xff0c;开源模型会越来越落后。 ——李彦宏 至于开源还是闭源&#xff0c;这和企业的利益息息相关。 随着科技的迅猛…

新品上市|水深测量专家 HD-680双变频测深仪

自动跟踪 一键测量 测深参数自动调节&#xff0c;换能器内置温度传感器&#xff0c;声速自动解算&#xff0c;提升数据精度&#xff0c;解放双手&#xff0c;提高测量效率。 高低频结合可实时显示淤泥厚度 HD-680双变频测深仪高低频双通道同时工作&#xff0c;全新升级的双频测…

如何使用WinSCP通过固定公网TCP地址实现远程连接内网设备传输文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

VIN车辆识别代码查询API接口是什么

VIN车辆识别代码查询API接口又叫VIN码查询接口、VIN码识别接口、车辆VIN码解析接口、车架号查询车辆信息接口&#xff0c;通过输入车辆VIN识别码&#xff08;车架号&#xff09;获取车辆参数信息&#xff0c;返回车辆品牌、车型、油耗、车身形式、排量等等。那么这个接口如何对…