RA4M2开发(3)----读取ISL29035数据,并在OLED上显示,串口打印
概述
HS3003是一种数字式温湿度传感器,可以测量环境中的温度和湿度。读取HS3003的数据需要连接传感器到一个数据采集系统,一般是微处理器或者单片机。以下是一个简单的读取HS3003数据的概述:
- 连接电路:将HS3003传感器连接到微处理器或单片机的GPIO引脚。需要注意HS3003的电气特性,比如供电电压和信号电平等。
- 发送命令:发送读取温湿度数据的命令到HS3003传感器。具体的命令格式和通信协议需要参考HS3003的数据手册。
- 接收数据:等待HS3003传感器回应,并接收传感器发送的数据。HS3003传感器的数据一般是经过数字转换后的二进制数据,需要解析成温湿度值。
- 解析数据:将接收到的二进制数据解析成温湿度值。具体的解析算法需要参考HS3003的数据手册,一般涉及到位移、位运算、符号扩展等操作。
- 处理数据:对得到的温湿度值进行处理,比如校准、滤波、显示等。
- 循环读取:根据需要循环执行步骤2到5,以实现连续读取HS3003传感器的温湿度数据。
需要注意的是,HS3003传感器的使用和读取数据需要按照数据手册的规范和建议操作,否则可能会导致数据精度降低、传感器损坏等问题。
硬件准备
首先需要准备一个开发板,这里我准备的是芯片型号R7FAM2AD3CFP的开发板:

样品申请
https://www.wjx.top/vm/wBbmSFp.aspx#
IIC配置
配置RA4M2的I2C接口,使其作为I2C master进行通信。
对于OLED的IIC配置,可以查看往期的博客。
查看HS3003说明书,最小电路图如下所示。

由于需要读取HS3003数据,需要使用IIC接口,这里使用PMOD2上的接口(P410和P411)。

点击Stacks->New Stack->Connectivity -> I2C Master(r_sci_i2c)。

查看说明书可以得知,ISL29035的地址为0x44(1000100)。

设置IIC的配置。

R_SCI_I2C_Open()函数原型

R_SCI_I2C_Open()函数为执行IIC初始化,开启配置如下所示。
/* Initialize the I2C module */err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);
R_SCI_I2C_Write()函数原型

R_SCI_I2C_Write()函数是向IIC设备中写入数据,写入格式如下所示。
err = R_SCI_I2C_Write(&g_i2c0_ctrl, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);assert(FSP_SUCCESS == err);
R_SCI_I2C_Read()函数原型

R_SCI_I2C_Read()函数是向IIC设备中读取数据,读取格式如下所示。
err = R_SCI_I2C_Write(&g_i2c0_ctrl, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES, false);assert(FSP_SUCCESS == err);
sci_i2c_master_callback()回调函数
对于数据是否发送完毕,可以查看是否获取到I2C_MASTER_EVENT_TX_COMPLETE字段。

/* Callback function */
i2c_master_event_t i2c_event1 = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback0(i2c_master_callback_args_t *p_args)
{/* TODO: add your own code here */i2c_event1 = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event1 = p_args->event;}
}
HS3003写数据
对于HS3003写数据,手册上的操作方式如下所示。
设备地址+操作地址+数据

初始化程序如下所示。
void Humiture_HS3003_writeRegister( uint8_t reg_address, uint8_t *buffer, uint8_t len)
{err = R_SCI_I2C_Write(&g_i2c0_ctrl, buffer, len, false);assert(FSP_SUCCESS == err);/* Since there is nothing else to do, block until Callback triggers*///while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event1) && timeout_ms1>0){R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);timeout_ms1--;}if (I2C_MASTER_EVENT_ABORTED == i2c_event1){__BKPT(0);}/* Read data back from the I2C slave */i2c_event1 = I2C_MASTER_EVENT_ABORTED;timeout_ms1 = 100000;}
HS3003读数据
对于读取数据,可以直接在发送地址后,进行读取,当时需要注意再发送完地址后,要有等待时间。

读取操作函数如下所示,先发送操作地址,在进行读取,这里是一次读取32位。
uint32_t Humiture_HS3003_readRegister32(uint8_t reg_address) {uint32_t value;uint8_t data[4];timeout_ms1 = 100000;/* Read data from I2C slave */err = R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 0x04, false);assert(FSP_SUCCESS == err);while ((I2C_MASTER_EVENT_RX_COMPLETE != i2c_event1) && timeout_ms1){R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);timeout_ms1--;}if (I2C_MASTER_EVENT_ABORTED == i2c_event1){__BKPT(0);}i2c_event1 = I2C_MASTER_EVENT_ABORTED;timeout_ms1 = 100000;value=data[0];value<<=8;value|=data[1];value<<=8;value|=data[2];value<<=8;value|=data[3];return value;
}
HS3003初始化
首先需要将HS3003进行唤醒,默认情况下是睡眠模式。
唤醒需要对Measurement Requests (MR)进行操作,MR命令用于将HS300x从休眠模式唤醒。通过发送7位从地址和第8位=0 (WRITE)来发起测量请求。

对于不同精度的数据读取,等待时间是不同的。

对于等待的时间,可以参考下图红框的数据。

HS3003读取温湿度
对于读取数据,可以直接在发送地址后,进行读取,当时需要注意再发送完地址后,要有等待时间。

读取操作函数如下所示,先发送操作地址,在进行读取。
void Humiture_HS3003_init(void)
{Humiture_HS3003_writeRegister(HS300X_ADR,NULL,0);}
//读取原始的数据
uint32_t Humiture_HS3003_ReadData_Raw(uint8_t resolution )
{uint8_t rx_buf[ 4 ];uint32_t data=0;Humiture_HS3003_init();//唤醒//8bit->1.2ms//10bit->2.72ms//12bit->9.10ms//14bit->33.90msif(resolution==8)R_BSP_SoftwareDelay(1200U, BSP_DELAY_UNITS_MICROSECONDS);else if(resolution==10)R_BSP_SoftwareDelay(2720U, BSP_DELAY_UNITS_MICROSECONDS);else if(resolution==12)R_BSP_SoftwareDelay(9100U, BSP_DELAY_UNITS_MICROSECONDS);elseR_BSP_SoftwareDelay(34U, BSP_DELAY_UNITS_MILLISECONDS);data=Humiture_HS3003_readRegister32(HS300X_ADR);return data;
}
对于读取的数据,需要进行处理。
湿度在后两个字节的15-2位,温度在前2个字节的13-0位。

对于原始的数据,要对他进行处理。

Data=Humiture_HS3003_ReadData_Raw(14);Temp = (float)( (Data & 0xFFFF) >> 2);//只要低十六位Temp = Temp*HS300X_TEMP_MULTY*165-40;//HS300X_TEMP_MULTY->0.00006163516(1/(2^14-1) )Humidity = (float)( (Data >> 16) &0x3FFF );//只要高十六位,且最高2位不要Humidity = Humidity*HS300X_HUMD_MULTY*100;//HS300X_HUMD_MULTY->0.00006163516(1/(2^14-1) )
实现效果
正常显示数据。

同时串口也可以打印数据。

主程序
#include "hal_data.h"
#include <stdio.h>
#include "Humiture_HS3003.h"
#include "oled.h"
#include "bmp.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERfsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
/* Callback function */
void user_uart_callback(uart_callback_args_t *p_args)
{/* TODO: add your own code here */if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}#ifdef __GNUC__ //串口重定向#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}
int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}/* Callback function */
i2c_master_event_t i2c_event1 = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback0(i2c_master_callback_args_t *p_args)
{/* TODO: add your own code here */i2c_event1 = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event1 = p_args->event;}
}/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{i2c_event = I2C_MASTER_EVENT_ABORTED;if (NULL != p_args){/* capture callback event for validating the i2c transfer event*/i2c_event = p_args->event;}
}uint32_t timeout_ms1 = 100000;
uint32_t timeout_ms = 100000;
float Temp=0.0f;
float Humidity=0.0f;
uint32_t Data=0;//温湿度原始数据
/*******************************************************************************************************************//*** main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function* is called by main() when no RTOS is used.**********************************************************************************************************************/
void hal_entry(void)
{/* TODO: add your own code here *//* Initialize the I2C module */err = R_SCI_I2C_Open(&g_i2c3_ctrl, &g_i2c3_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);OLED_Init(); //初始化OLEDOLED_Clear() ;OLED_ShowCHinese(0,0,0);//记OLED_ShowCHinese(16,0,1);//帖OLED_ShowString(0,2,"Temp:",16);OLED_ShowString(0,4,"Humidity:",16);/* Initialize the I2C module */err = R_SCI_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);Humiture_HS3003_init();/* Open the transfer instance with initial configuration. */fsp_err_t err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);printf("hello world!\n");while(1)
{Data=Humiture_HS3003_ReadData_Raw(14);Temp = (float)( (Data & 0xFFFF) >> 2);//只要低十六位Temp = Temp*HS300X_TEMP_MULTY*165-40;//HS300X_TEMP_MULTY->0.00006163516(1/(2^14-1) )Humidity = (float)( (Data >> 16) &0x3FFF );//只要高十六位,且最高2位不要Humidity = Humidity*HS300X_HUMD_MULTY*100;//HS300X_HUMD_MULTY->0.00006163516(1/(2^14-1) )OLED_Clear() ;OLED_ShowCHinese(0,0,0);//记OLED_ShowCHinese(16,0,1);//帖OLED_ShowString(0,2,"Temp:",16);OLED_ShowString(0,4,"Humidity:",16);if(Temp<10 && Temp>=0)//0<=Temp<10{OLED_ShowNum(48,2,(int)(Temp),1,16);//显示Temp整数OLED_ShowString(56,2,".",16);OLED_ShowNum(64,2,(int)(Temp*100) - ( ((int)Temp) *100),1,16);//显示Temp小数if(( (int)(Temp*100) - ( ((int)Temp) *100) ) <10 )OLED_ShowString(64,2,"0",16);}else if (Temp>=10 && Temp<100)//10<=Temp<100{OLED_ShowNum(48,2,(int)(Temp),2,16);//显示Temp整数OLED_ShowString(64,2,".",16);OLED_ShowNum(72,2,(int)(Temp*100) - ( ((int)Temp) *100),2,16);//显示Temp小数if(( (int)(Temp*100) - ( ((int)Temp) *100) ) <10 )OLED_ShowString(72,2,"0",16);}else if (Temp>=100 && Temp<1000)//100<=Temp<1000{OLED_ShowNum(48,2,(int)(Temp),3,16);//显示Temp整数OLED_ShowString(72,2,".",16);OLED_ShowNum(80,2,(int)(Temp*100) - ( ((int)Temp) *100),2,16);//显示Temp小数if(( (int)(Temp*100) - ( ((int)Temp) *100) ) <10 )OLED_ShowString(80,2,"0",16);}if(Humidity<10)//0<=Humidity<10{OLED_ShowNum(72,4,(int)(Humidity),1,16);//显示Humidity整数OLED_ShowString(80,4,".",16);OLED_ShowNum(88,4,(int)(Humidity*100) - ( ((int)Humidity) *100),2,16);//显示Temp小数if(( (int)(Humidity*100) - ( ((int)Humidity) *100) ) <10 )OLED_ShowString(88,4,"0",16);}else if(Humidity>10 && Humidity<100){OLED_ShowNum(72,4,(int)(Humidity),2,16);//显示Humidity整数OLED_ShowString(88,4,".",16);OLED_ShowNum(96,4,(int)(Humidity*100) - ( ((int)Humidity) *100),2,16);//显示Temp小数if(( (int)(Humidity*100) - ( ((int)Humidity) *100) ) <10 )OLED_ShowString(96,4,"0",16);}printf("Temp=%.2f,Humidity=%.2f\n",Temp,Humidity);R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
}#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}
Humiture_HS3003.c
/** Humiture_HS3003.c** Created on: 2023年2月19日* Author: a8456* 交流群:615061293*/
#include "hal_data.h"
#include "Humiture_HS3003.h"
extern fsp_err_t err;
extern int timeout_ms1;
extern i2c_master_event_t i2c_event1 ;uint32_t Humiture_HS3003_readRegister32(uint8_t reg_address) {uint32_t value;uint8_t data[4];timeout_ms1 = 100000;/* Read data from I2C slave */err = R_SCI_I2C_Read(&g_i2c0_ctrl, &data, 0x04, false);assert(FSP_SUCCESS == err);while ((I2C_MASTER_EVENT_RX_COMPLETE != i2c_event1) && timeout_ms1){R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MILLISECONDS);timeout_ms1--;}if (I2C_MASTER_EVENT_ABORTED == i2c_event1){__BKPT(0);}i2c_event1 = I2C_MASTER_EVENT_ABORTED;timeout_ms1 = 100000;value=data[0];value<<=8;value|=data[1];value<<=8;value|=data[2];value<<=8;value|=data[3];return value;
}void Humiture_HS3003_writeRegister( uint8_t reg_address, uint8_t *buffer, uint8_t len)
{err = R_SCI_I2C_Write(&g_i2c0_ctrl, buffer, len, false);assert(FSP_SUCCESS == err);/* Since there is nothing else to do, block until Callback triggers*///while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event1) && timeout_ms1>0){R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);timeout_ms1--;}if (I2C_MASTER_EVENT_ABORTED == i2c_event1){__BKPT(0);}/* Read data back from the I2C slave */i2c_event1 = I2C_MASTER_EVENT_ABORTED;timeout_ms1 = 100000;}void Humiture_HS3003_init(void)
{Humiture_HS3003_writeRegister(HS300X_ADR,NULL,0);}//读取原始的数据
uint32_t Humiture_HS3003_ReadData_Raw(uint8_t resolution )
{uint8_t rx_buf[ 4 ];uint32_t data=0;Humiture_HS3003_init();//唤醒//8bit->1.2ms//10bit->2.72ms//12bit->9.10ms//14bit->33.90msif(resolution==8)R_BSP_SoftwareDelay(1200U, BSP_DELAY_UNITS_MICROSECONDS);else if(resolution==10)R_BSP_SoftwareDelay(2720U, BSP_DELAY_UNITS_MICROSECONDS);else if(resolution==12)R_BSP_SoftwareDelay(9100U, BSP_DELAY_UNITS_MICROSECONDS);elseR_BSP_SoftwareDelay(34U, BSP_DELAY_UNITS_MILLISECONDS);data=Humiture_HS3003_readRegister32(HS300X_ADR);return data;
}
Humiture_HS3003.h
/** Humiture_HS3003.h** Created on: 2023年2月19日* Author: a8456* 交流群:615061293*/#ifndef HUMITURE_HS3003_H_
#define HUMITURE_HS3003_H_#define HS300X_ADR 0x44
#define HS300X_HUMD_MULTY 0.00006163516
#define HS300X_TEMP_MULTY 0.00006163516//uint8_t HuMIture_HS3003_readRegister8(uint8_t reg_address);
uint32_t Humiture_HS3003_readRegister32(uint8_t reg_address);
void Humiture_HS3003_writeRegister( uint8_t reg_address, uint8_t *buffer, uint8_t len);void Humiture_HS3003_init(void);
uint32_t Humiture_HS3003_ReadData_Raw(uint8_t resolution);#endif /* HUMITURE_HS3003_H_ */
相关文章:
RA4M2开发(3)----读取ISL29035数据,并在OLED上显示,串口打印
概述 HS3003是一种数字式温湿度传感器,可以测量环境中的温度和湿度。读取HS3003的数据需要连接传感器到一个数据采集系统,一般是微处理器或者单片机。以下是一个简单的读取HS3003数据的概述: 连接电路:将HS3003传感器连接到微处…...
密码复杂度
检查账户认证失败次数限制 修复建议: 配置SSH方式账户认证失败次数限制 编辑/etc/pam.d/sshd文件 在auth行下方添加: auth required pam_tally.so deny5 unlock_time600 no_lock_time 在account行下方添加: account required pam_tally.s…...
Python打印() 中的 SEP 参数
默认情况下,Python 中 print() 函数的参数之间的分隔符是空格(softspace 功能),可以根据我们的选择对其进行修改并设置为任何字符、整数或字符串。“sep”参数用于实现相同的目的,它仅在python …...
AG9300方案替代|替代AG9300设计Type-C转VGA方案|CS5260设计原理图
AG9300方案替代|替代AG9300设计Type-C转VGA方案|CS5260设计原理图 安格 AG9300是一款实现USB TYPE-C到VGA数据的单片机解决方案转换器。ALGOLTEK AG9300支持USB Type-C显示端口交替模式,AG9300可以将视频和音频流从USB Type-C接口传输到VGA端口。在AG9300࿰…...
力扣-文章浏览
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1148. 文章浏览二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.其他总结前言 一、题目:1148…...
Unity提取场景中的静态文本
有些单机项目开发的时候没有做本地文本配置文件,全部写死在场景的对象上面,简单记录一下怎么提取场景里面的文本并且写入到配置文件里面using System.Collections.Generic;using System.IO;using TMPro;using UnityEditor;using UnityEngine;using Unity…...
Netty常用核心类说明
MessageToByteEncoder MessageToByteEncoder是一个抽象编码器,子类可重写encode方法把对象编码为ByteBuf输出。 MessageToByteEncoder继承自ChannelOutboundHandlerAdapter,encode在出站是被调用。 public class MyMessageEncoder extends MessageToB…...
ingress服务
user.default.svc.cluster.local是集群内部service的dns地址,集群外部想访问集群里面的service,可以通过LoadBalaner和NodePort。LoadBalaner可以获得一个公网ip;NodePort在宿主机上开一个端口,访问这个端口会把报文实际的转发到集…...
java 抽象类 详解
目录 一、抽象类概述: 二、抽象方法 : 1.概述 : 2.应用 : 3.特点 : 三、抽象类特点 : 1.关于abstract关键字 : 2.抽象类不能被实例化,只能创建其子类对象 : 3.抽象类子类的两个选择 : 四、抽象类的成员 : 1.成员变量 : 2.成员方…...
MySQL的安装(详解)
文章目录前言一、yum方式安装1、下载并安装MySQL2、 启动MySQL数据库3、查看MySQL初始密码4、登录数据库5、修改MySQL默认密码6、授予root用户远程管理权限7、输入exit退出数据库二、rpm安装方式1、检查2、卸载mariadb3、安装4、启动5、密码总结前言 本教程为Linux下安装mysql的…...
界面控件DevExpress WinForm——轻松构建类Visual Studio UI(二)
DevExpress WinForm拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任…...
BabylonJS之放烟花
一: 技术调研 1. 方案一:ParticleSystem 用ParticleSystem来实现每一束的烟花效果,如果浏览器支持WebGL2功能,使用GPUParticleSystem性能会有极大的提升。 优点: 烟花效果易实现且效果好。 缺点: 每一个P…...
vue3 布局样式的原理
style scoped <style scoped > 它的 CSS 只作用于当前组件中的元素,如果子组件只有一个根元素,也会被渗透 原理: 当我们再组建中使用scoped时,vue会自动为组件中所有元素生成一个随机的属性,形如:da…...
Qt程序使用路径方式和注意事项
Qt程序使用路径方式和注意事项 更多精彩内容👉个人内容分类汇总 👈👉Qt开发经验 👈文章目录Qt程序使用路径方式和注意事项[toc]前言一、Windows下Qt程序使用路径1.准备工作2.测试结果二、Linux下Qt程序使用路径1.准备工作2.测试结…...
和日期相关的代码和bug——一道力扣题中的小发现
目录 Day of the Week 题目大意 常规方法 Python代码 Golang代码 C代码 基姆拉尔森公式 Python代码 Golang代码 C代码 使用库函数 Python代码 Golang代码 C代码 Day of the Week Given a date, return the corresponding day of the week for that date. The inp…...
如何在2023年学习编程并获得开发者工作
丢下自负 许多进入软件开发领域的人都是从最底层开始的,你可能会获得“初级开发者”的头衔。每天面临的问题是:我有十年的专业经验了。我不是个入门员工。但尽管过去的工作经验丰富,我仍然是个入门级的开发者,我还是个新手。别总…...
Python实战之小说下载神器(三)排行榜所有小说:最全热门小说合集,总有一款适合你,好多好多好多超赞的小说...(源码分享学习)
前言 这次的是一个系列内容 给大家讲解一下何一步一步实现一个完整的实战项目案例系列之 小说下载神器(三)(GUI界面化程序) 多线程采集小说下载、采集排行榜所有小说 哈喽!大家上午好啦,我是爱看小说的栗子…...
前端监控之用户行为监控实践1(数据收集)
前文对前端监控进行了简单介绍,起因是因为当前做的一个需求,老板要看当前项目的uv、pv信息。其实这是非常简单的统计。 但在最开始接到这个需求,却难倒我了。 现在进行简单的复盘,记录一下实现方法。 一、数据记录 用户行为从大…...
【网络原理7】认识HTTP
目录 一、HTTP协议的位置 二、HTTP协议的特点&应用场景 三、HTTP协议的格式的查看 Fiddler下载与使用 编辑 如何查看HTTP请求消息 编辑 如何查看HTTP响应数据包 如何默认开启HTTPS的解析功能 四、HTTP的请求数据包的格式含义 第一部分:请求行&…...
SPI实验
目录 一、SPI 简介 二、硬件原理 ECSPI3_SCLK ECSPI3_MISO和ECSPI3_MOSI ECSPI3_SS0 三、I.MX6U ECSPI 简介 ECSPIx_RXDATA ECSPIx_TXDATA ECSPIx_CONREG ECSPIx_CONFIGREG ECSPIx_PERIODREG编辑 ECSPIx_STATREG 四、ICM-20608 简介 五、代码编写 1、创建文件及文…...
NLP-StructBERT赋能内容去重:展示海量文本相似度排查惊艳效果
NLP-StructBERT赋能内容去重:展示海量文本相似度排查惊艳效果 每次打开内容平台,你是不是也经常看到一堆“换汤不换药”的文章?标题不一样,内容却大同小异。对于平台运营者来说,这更是个头疼的问题:怎么从…...
YOLO26功能体验:官方镜像预置多种权重,开箱即用体验最新模型
YOLO26功能体验:官方镜像预置多种权重,开箱即用体验最新模型 1. 引言:告别环境配置,直接上手YOLO26 如果你对计算机视觉感兴趣,想试试最新的目标检测模型,那么YOLO26绝对值得关注。作为YOLO系列的最新成员…...
GitHub协作开发AnythingtoRealCharacters2511项目指南
GitHub协作开发AnythingtoRealCharacters2511项目指南 1. 项目概述与协作价值 AnythingtoRealCharacters2511是一个专门将动漫角色转换为写实真人形象的AI模型项目。这个模型基于Lora技术,经过30900步训练,使用103组图组(合计206张图片&…...
OpenClaw学习助手:Qwen3-4B自动整理技术文档实战
OpenClaw学习助手:Qwen3-4B自动整理技术文档实战 1. 为什么需要AI文档整理助手 作为一个经常需要阅读大量技术文档的开发者,我发现自己长期陷入"收集-遗忘-重复阅读"的恶性循环。PDF里的关键知识点总是淹没在几十页的细节中,手动…...
手把手教你理解机器人阻抗控制:阻尼-弹簧-质量模型详解
机器人阻抗控制实战:从阻尼-弹簧-质量模型到智能柔顺操作 当机械臂需要完成插拔USB接口这样的精细操作时,纯位置控制的局限性立刻显现——哪怕0.1毫米的误差都可能导致接口损坏。这正是阻抗控制技术大显身手的场景:通过模拟弹簧的柔顺特性&am…...
读书笔记--赤裸裸的统计学阅读总结感悟
最近在做统计分析时,简要阅读了《赤裸裸的统计学》,该书通过幽默生动的案例剥去大数据的枯燥外衣,揭示了统计学在现代社会中的核心作用及潜在误区。系统讲解了描述统计学、相关系数、概率期望、中心极限定理、回归分析以及假设检验等经典统计…...
EmonLibCM:嵌入式电能监测连续采样库解析
1. EmonLibCM:面向嵌入式电能监测的连续采样库深度解析EmonLibCM(Energy Monitoring Continuous Sampling Library)是一个专为资源受限嵌入式平台设计的开源电能监测库,其核心目标是实现高精度、低开销、免中断依赖的交流电参数连…...
贾子科学定理(Kucius Science Theorem):重构科学本质的公理化范式
贾子科学定理:重构科学本质的公理化范式摘要:贾子科学定理由贾子邓于2026年4月提出,颠覆传统“可证伪性”标准,以“公理驱动可结构化”重新定义科学本质,构建TMM三层体系与四大定律(真理硬度、名实分离、逻…...
OpenClaw技能开发:让Kimi-VL-A3B-Thinking理解自定义图表类型
OpenClaw技能开发:让Kimi-VL-A3B-Thinking理解自定义图表类型 1. 为什么需要定制图表解析能力 上周我尝试用OpenClaw自动整理一批金融研报时,遇到了一个典型问题:当Kimi-VL-A3B-Thinking遇到K线图时,它会把蜡烛图简单描述为&quo…...
ADC类型解析与选型指南:从闪存到ΔΣ
1. ADC基础概念与核心原理在电子系统中,模拟信号到数字信号的转换(ADC)是实现物理世界与数字世界交互的关键桥梁。作为一名嵌入式开发者,我经常需要根据项目需求选择不同类型的ADC拓扑结构。让我们先拆解ADC的核心工作机制。ADC转…...
