当前位置: 首页 > news >正文

CCS811二氧化碳传感器详解(STM32)

目录

一、介绍

二、传感器原理

1.原理图

2.引脚描述

3.工作原理介绍 

三、程序设计

main.c文件

ccs811.h文件

ccs811.c文件

四、实验效果 

五、资料获取

项目分享


一、介绍

        CCS811模块是一种气体传感器,可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2(二氧化碳)浓度,作为衡量空气质量(IAQ)的指标。它内部还集成了MCU,使得这款传感器具有了板载处理能力,在无需主机干预的情况下,即可提供等效二氧化碳等级或总挥发性有机化合物(TVOc)指标。

以下是二氧化碳传感器的参数:

型号

CCS811

工作电压

1.8~3.6V(推荐3.3V

工作电流

20mA

工作温度

-5~50

存储温度

-40~125

检测范围

400~5000ppm

通信接口

IIC

哔哩哔哩视频:

CCS811二氧化碳传感器详解(STM32)

(资料分享见文末) 

二、传感器原理

1.原理图

这里需要说明一下,SDASCL大家都比较熟悉,但是INTWAK就少见了,在这款模块中,INT相当于复位引脚,CCS811芯片内部集成的单片机程序跑飞之后可以将该引脚接地复位,同时需要WAK为低电平的时候SDASCL才能正常通信

2.引脚描述

引脚名称

描述

VCC

供给电压DC 3.3V

GND

地线

SCL

IIC时钟线

SDA

IIC数据线

WAK

低电平使能

INT

中断

RST

复位

ADD

地址选择位

3.工作原理介绍 

    CCS811-811是一种低功耗的数字气体传感器,集成了CCS801传感器和8MCU(带模数转换器(ADC)),用来检测室内的空气质量,包括二氧化碳(Co2)和广泛的挥发性有机化合物气体(VOCs,产品的低功耗特性可用在环境监测设备上,灵敏度高,智能算法计算TVOC/eCO2数值并输出IIC信号可直接与单片机通信。模块的主要特点:检测室内空气质量的金属氧化物(MOX)传感器,集成了8MCU用于运算第一级算法,集成了12ADC用于传感器读数和数字化转换,IIC从属接口可直接接入主控系统复位/中断控制。

三、程序设计

1.使用STM32F103C8T6读取CCS811二氧化碳传感器采集的数据,通过串口发送至电脑

2.将读取得到信息数据同时在OLED上显示

CCS811_SCL

PB6

CCS811_SDA

PB7

CCS811_WAK

PB5

OLED_SCL

PB11

OLED_SDA

PB10

串口

串口1

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "ccs811.h"/*****************辰哥单片机设计******************STM32* 项目			:	CCS811二氧化碳传感器实验                     * 版本			: V1.0* 日期			: 2024.8.28* MCU			:	STM32F103C8T6* 接口			:	参看ccs811.h							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥 **********************BEGIN***********************/float co2;
u8 buff[30];//参数显示缓存数组int main(void)
{ SystemInit();//配置系统时钟为72M	delay_init(72);LED_Init();LED_On();CCS811_Init();USART1_Config();//串口初始化OLED_Init();printf("Start \n");delay_ms(1000);OLED_Clear();//显示“二氧化碳:”OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChinese(32,0,2,16,1);OLED_ShowChinese(48,0,3,16,1);OLED_ShowChar(64,0,':',16,1);while (1){LED_Toggle();co2 = CCS811_GetData();OLED_ShowNum(40,20,co2,4,16,1);OLED_ShowString(80,20,"ppm",16,1);delay_ms(50);	//延时50ms}
}

ccs811.h文件

#ifndef __CCS811_H
#define	__CCS811_H
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"/*****************辰哥单片机设计******************STM32* 文件			:	CCS811二氧化碳传感器h文件                   * 版本			: V1.0* 日期			: 2024.8.28* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************//***************根据自己需求更改****************/
// CCS811 GPIO宏定义#define		CCS811_IIC_CLK										RCC_APB2Periph_GPIOB
#define 	CCS811_IIC_PORT										GPIOB
#define 	CCS811_IIC_SDA_PIN								GPIO_Pin_7	
#define 	CCS811_IIC_SCL_PIN								GPIO_Pin_6	
#define   CCS811_WAK_PORT										GPIOB
#define		CCS811_WAK_PIN										GPIO_Pin_5//IO操作函数	 
#define CCS811_IIC_SCL    PBout(6) 		//SCL
#define CCS811_IIC_SDA    PBout(7) 		//SDA	 
#define CCS811_READ_SDA   PBin(7) 		//输入SDA /*********************END**********************///CCS811
#define CCS811_Add  0x5A<<1
#define STATUS_REG 0x00						//状态寄存器
#define MEAS_MODE_REG 0x01				//测量模式和条件寄存器
#define ALG_RESULT_DATA 0x02			//算法结果。最高有效 2 个字节包含等效 CO2 (eCO2) 水平的 ppm 估计值,最低有效 2 个字节包含总 VOC 水平的 ppb 估计值
#define ENV_DATA 0x05
#define NTC_REG 0x06
#define THRESHOLDS 0x10
#define BASELINE 0x11
#define HW_ID_REG 0x20						//硬件 ID 值为 0x81
#define ERROR_ID_REG 0xE0					//错误 ID。当状态寄存器报告错误时,它的源位于此寄存器中
#define APP_START_REG 0xF4
#define SW_RESET 0xFF
#define CCS_811_ADDRESS 0x5A
#define GPIO_WAKE 0x5
#define DRIVE_MODE_IDLE 0x0
#define DRIVE_MODE_1SEC 0x10
#define DRIVE_MODE_10SEC 0x20
#define DRIVE_MODE_60SEC 0x30
#define INTERRUPT_DRIVEN 0x8
#define THRESHOLDS_ENABLED 0x4void CCS811_Init(void);
void ON_CCS811(void);
void CCS811_EN(void);
void OFF_CCS811(void);u16 CCS811_GetData(void);u8 CCS811_Single_WriteI2C_byte(u8 Slave_Address,u8 REG_Address,u8 data);
u8 CCS811_Single_MWriteI2C_byte(u8 Slave_Address,u8 REG_Address,u8 const *data,u8 length);
u8 CCS811_Single_ReadI2C(u8 Slave_Address,u8 REG_Address,u8 *REG_data,u8 length);#endif

ccs811.c文件

#include "ccs811.h"/*****************辰哥单片机设计******************STM32* 文件			:	CCS811二氧化碳传感器c文件                   * 版本			: V1.0* 日期			: 2024.8.28* MCU			:	STM32F103C8T6* 接口			:	见代码							* BILIBILI	:	辰哥单片机设计* CSDN			:	辰哥单片机设计* 作者			:	辰哥**********************BEGIN***********************/
u8 MeasureMode,Status,Error_ID;
u8 Information[10];
u8 BUF[12];typedef struct {
u16 eco2;
u16 tvoc;
u8 status;
u8 error_id;
u16 raw_data;
} ccs811_measurement_t;
ccs811_measurement_t CCS;u16 car_num;void CCS811_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(CCS811_IIC_CLK,ENABLE);//先使能外设IO PORTB时钟 GPIO_InitStructure.GPIO_Pin = CCS811_IIC_SDA_PIN|CCS811_IIC_SCL_PIN;	 // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHzGPIO_Init(CCS811_IIC_PORT, &GPIO_InitStructure);					 //根据设定参数初始化GPIO CCS811_IIC_SCL = 1;CCS811_IIC_SDA = 1;CCS811_EN();CCS811_Single_ReadI2C(CCS811_Add,0x00,&Status,1);CCS811_Single_ReadI2C(CCS811_Add,0xE0,&Error_ID,1);CCS811_Single_ReadI2C(CCS811_Add,0x02,BUF,8);CCS811_Single_ReadI2C(CCS811_Add,0x20,Information,1);  //Read CCS's information  ,ID
}//CCS811引脚输出模式控制
void CCS811_IIC_SDA_OUT(void)//SDA输出方向配置
{GPIO_InitTypeDef GPIO_InitStructure;	GPIO_InitStructure.GPIO_Pin=CCS811_IIC_SDA_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//SDA推挽输出GPIO_Init(CCS811_IIC_PORT,&GPIO_InitStructure); 						}void CCS811_IIC_SDA_IN(void)//SDA输入方向配置
{GPIO_InitTypeDef GPIO_InitStructure;	GPIO_InitStructure.GPIO_Pin=CCS811_IIC_SDA_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//SCL上拉输入GPIO_Init(CCS811_IIC_PORT,&GPIO_InitStructure);}u16 CCS811_GetData(void)
{int car;//CCS811  CO2数据采集ON_CCS811(); 					   	//nWAKE pin is asserted at least 50μs before the transaction and kept asserted throughout,nWAKE pin is active low     CCS811_Single_ReadI2C(CCS811_Add,0x00,&Status,1);CCS811_Single_ReadI2C(CCS811_Add,0xE0,&Error_ID,1);CCS811_Single_ReadI2C(CCS811_Add,0x02,BUF,8);CCS811_Single_ReadI2C(CCS811_Add,0x20,Information,1);  //Read CCS's information  ,IDOFF_CCS811(); CCS.eco2= (u16)BUF[0]*256+BUF[1];CCS.tvoc= (u16)BUF[2]*256+BUF[3];Information[0]=0;car=(float)CCS.eco2;  //二氧化碳return car;
}IIC起始函数//
/*
IIC起始:当SCL处于高电平期间,SDA由高电平变成低电平出现一个下降沿,然后SCL拉低
*/
u8 CCS811_IIC_Start(void)
{CCS811_IIC_SDA_OUT();CCS811_IIC_SDA = 1; delay_us(5);	//延时保证时钟频率低于40K,以便从机识别CCS811_IIC_SCL = 1;delay_us(5);//延时保证时钟频率低于40K,以便从机识别//if(!CCS811_READ_SDA) return 0;//SDA线为低电平则总线忙,退出CCS811_IIC_SDA = 0;   //SCL处于高电平的时候,SDA拉低delay_us(5);//if(CCS811_READ_SDA) return 0;//SDA线为高电平则总线出错,退出CCS811_IIC_SCL = 0;delay_us(5);return 1;
}
//**************************************
//IIC停止信号
/*
IIC停止:当SCL处于高电平期间,SDA由低电平变成高电平出现一个上升沿
*/
//**************************************
void CCS811_IIC_Stop(void)
{CCS811_IIC_SDA_OUT();CCS811_IIC_SDA = 0;CCS811_IIC_SCL = 0;delay_us(5);CCS811_IIC_SCL = 1;delay_us(5);CCS811_IIC_SDA = 1;//当SCL处于高电平期间,SDA由低电平变成高电平             //延时
}
//**************************************
//IIC发送应答信号
//入口参数:ack (0:ACK 1:NAK)
/*
应答:当从机接收到数据后,向主机发送一个低电平信号
先准备好SDA电平状态,在SCL高电平时,主机采样SDA
*/
//**************************************
void CCS811_IIC_SendACK(u8 i)
{CCS811_IIC_SDA_OUT();if(1==i)CCS811_IIC_SDA = 1;	             //准备好SDA电平状态,不应答else CCS811_IIC_SDA = 0;  						//准备好SDA电平状态,应答 	CCS811_IIC_SCL = 1;                    //拉高时钟线delay_us(5);                 //延时CCS811_IIC_SCL = 0 ;                  //拉低时钟线delay_us(5);    
} 
///等待从机应答
/*
当本机(主机)发送了一个数据后,等待从机应答
先释放SDA,让从机使用,然后采集SDA状态
*/
/
u8 CCS811_IIC_WaitAck(void) 	 //返回为:=1有ACK,=0无ACK
{	uint16_t i=0;CCS811_IIC_SDA_IN();CCS811_IIC_SDA = 1;delay_us(1);	        //释放SDACCS811_IIC_SCL = 1;delay_us(1);         //SCL拉高进行采样while(CCS811_READ_SDA)//等待SDA拉低{i++;      //等待计数if(i==500)//超时跳出循环break;}if(CCS811_READ_SDA)//再次判断SDA是否拉低{CCS811_IIC_SCL = 0; return RESET;//从机应答失败,返回0}delay_us(5);//延时保证时钟频率低于40K,CCS811_IIC_SCL = 0;delay_us(5); //延时保证时钟频率低于40K,CCS811_IIC_SDA_OUT();return SET;//从机应答成功,返回1
}
//**************************************
//向IIC总线发送一个字节数据
/*
一个字节8bit,当SCL低电平时,准备好SDA,SCL高电平时,从机采样SDA
*/
//**************************************
void CCS811_IIC_SendByte(u8 dat)
{  u8 i;CCS811_IIC_SDA_OUT();CCS811_IIC_SCL = 0;//SCL拉低,给SDA准备for (i=0; i<8; i++)         //8位计数器{if(dat&0x80)//SDA准备CCS811_IIC_SDA = 1;  else CCS811_IIC_SDA = 0;CCS811_IIC_SCL = 1;                //拉高时钟,给从机采样delay_us(5);        //延时保持IIC时钟频率,也是给从机采样有充足时间CCS811_IIC_SCL = 0;                //拉低时钟,给SDA准备delay_us(5); 		  //延时保持IIC时钟频率dat <<= 1;          //移出数据的最高位  }delay_us(10);
}
//**************************************
//从IIC总线接收一个字节数据
//**************************************
u8 CCS811_IIC_RecvByte()
{u8 i;u8 dat = 0;CCS811_IIC_SDA_IN();CCS811_IIC_SDA = 1;//释放SDA,给从机使用delay_us(5);         //延时给从机准备SDA时间            for (i=0; i<8; i++)         //8位计数器{ dat <<= 1;CCS811_IIC_SCL = 1;                //拉高时钟线,采样从机SDAif(CCS811_READ_SDA) //读数据    dat |=0x01;      delay_us(5);     //延时保持IIC时钟频率		CCS811_IIC_SCL = 0;           //拉低时钟线,处理接收到的数据delay_us(5);   //延时给从机准备SDA时间} return dat;
}
//**************************************
//向IIC设备写入一个字节数据
//**************************************
u8 CCS811_Single_WriteI2C_byte(u8 Slave_Address,u8 REG_Address,u8 data)
{if(CCS811_IIC_Start()==0)  //起始信号{CCS811_IIC_Stop(); return RESET;}           CCS811_IIC_SendByte(Slave_Address);   //发送设备地址+写信号if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop(); return RESET;}CCS811_IIC_SendByte(REG_Address);    //内部寄存器地址,if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop(); return RESET;}CCS811_IIC_SendByte(data);       //内部寄存器数据,if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop(); return RESET;}CCS811_IIC_Stop();   //发送停止信号return SET;
}u8 CCS811_Single_MWriteI2C_byte(u8 Slave_Address,u8 REG_Address,u8 const *data,u8 length)
{if(CCS811_IIC_Start()==0)  //起始信号{CCS811_IIC_Stop();return RESET;}           CCS811_IIC_SendByte(Slave_Address);   //发送设备地址+写信号if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop();return RESET;}CCS811_IIC_SendByte(REG_Address);    //内部寄存器地址,if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop();return RESET;}while(length){CCS811_IIC_SendByte(*data++);       //内部寄存器数据,if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop(); return RESET;}           //应答length--;}//	CCS811_IIC_SendByte(*data);       //内部寄存器数据,//	if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop(); return RESET;}CCS811_IIC_Stop();   //发送停止信号		return SET;
}//**************************************
//从IIC设备读取一个字节数据
//**************************************
u8 CCS811_Single_ReadI2C(u8 Slave_Address,u8 REG_Address,u8 *REG_data,u8 length)
{if(CCS811_IIC_Start()==0)  //起始信号{CCS811_IIC_Stop();return RESET;}          CCS811_IIC_SendByte(Slave_Address);    //发送设备地址+写信号if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop()	;return RESET;} CCS811_IIC_SendByte(REG_Address);     //发送存储单元地址if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop();return RESET;} if(CCS811_IIC_Start()==0)  //起始信号{CCS811_IIC_Stop(); return RESET;}            CCS811_IIC_SendByte(Slave_Address+1);  //发送设备地址+读信号if(!CCS811_IIC_WaitAck()){CCS811_IIC_Stop(); return RESET;}while(length-1){*REG_data++=CCS811_IIC_RecvByte();       //读出寄存器数据CCS811_IIC_SendACK(0);               //应答length--;}*REG_data=CCS811_IIC_RecvByte();  CCS811_IIC_SendACK(1);     //发送停止传输信号CCS811_IIC_Stop();                    //停止信号return SET;
}void CCS811_EN()
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTB时钟 GPIO_InitStructure.GPIO_Pin = CCS811_WAK_PIN;	 // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHzGPIO_Init(CCS811_WAK_PORT, &GPIO_InitStructure);					 //根据设定参数初始化GPIO GPIO_ResetBits(CCS811_WAK_PORT,CCS811_WAK_PIN);
}void ON_CCS811()
{GPIO_ResetBits(CCS811_WAK_PORT,CCS811_WAK_PIN);
}
void OFF_CCS811()
{GPIO_SetBits(CCS811_WAK_PORT,CCS811_WAK_PIN);
}

四、实验效果 

五、资料获取

项目分享

相关文章:

CCS811二氧化碳传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 ccs811.h文件 ccs811.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 CCS811模块是一种气体传感器&#xff0c;可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…...

Navicat 17 新特性 | 聚焦 MongoDB

随着 Navicat 17 的盛大发布&#xff0c;其一系列创新特性赢得了广大用户的热烈反响。它不仅在模型设计上实现了突破性优化&#xff0c;提升了查询与配置的效率&#xff0c;还大幅优化了用户界面的交互体验&#xff0c;原生支持国产平台与操作系统&#xff0c;同时增强 BI 能力…...

openssl的使用

1、编译 Github下载&#xff1a;https://github.com/openssl/openssl 官网下载&#xff1a;https://openssl-library.org/source/index.html 官网历史版本&#xff1a;https://www.openssl.org/source/old/ 1.1 Windows下编译 我的文章&#xff1a;OPC UA使用 Openssl库编译…...

ICETEK-DM6437-AICOM—— DMA直接存储器访问设计

#一、设计目的&#xff1a; 1 进一步了解 ICETEK-DM6437-AF 的内部存储器空间的分配及指令寻址方式&#xff1a; 内部存储器空间分配&#xff1a;研究 ICETEK-DM6437-AF 的存储器架构&#xff0c;包括但不限于片内 SRAM、片外 DRAM 和其他存储器模块。了解这些存储器的大小、起…...

【AcWing】快速排序的Go实现

快速排序的Go实现 这一部分参考了AcWing当中使用Go语言实现快速排序的题解&#xff1a;https://www.acwing.com/activity/content/code/content/296206/。 其中有很多部分非常值得参考&#xff0c;故写一个博客进行记录。 Code package mainimport "fmt"func qui…...

使用C++11的`std::future`和`std::promise`实现异步网络通信

使用C11的std::future和std::promise实现异步网络通信 在现代C编程中&#xff0c;异步编程是一个重要的主题。C11引入了std::future和std::promise&#xff0c;为异步编程提供了强大的工具。本文将详细介绍如何使用std::future和std::promise实现异步网络通信&#xff0c;并提…...

【C++登堂入室】类与对象(上)

目录 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 八、this指针 …...

【西电电装实习】5. 无人机模块及作用、上位机的操作

文章目录 前言一、硬件结构电源、电源电压测试电路晶振外围陀螺仪信号放大电路及天线空心杯&#xff08;电极&#xff09;驱动电路 软件设置整机装配PID 参数设置公式 参考文献 前言 西电电装实习&#xff0c;无人机原理图、上位机的调节方法 一、硬件结构 电源、电源电压测试…...

有关WSL和docker的介绍

目录标题 如何利用在windows上配置docker实现linux和windows容器修改WSL默认安装&#xff08;也就是linux子系统&#xff09;目录到其他盘 如何利用在windows上配置docker实现linux和windows容器 wsl的基本命令&#xff1a;参考网页 docker入门到实践&#xff1a;参考网页 官方…...

以太坊入门

1. 以太坊简介 Vitalik Buterin 在 2013 年 11 月提出了以太坊的概念&#xff0c;其关键思想是&#xff1a;开发一种图灵完备&#xff08;Turing-Complete) 的语言&#xff0c;以允许开发用于区块链和去中心化应用的任意程序&#xff08;智能合约&#xff09;。该概念与比特比相…...

秃姐学AI系列之:实战Kaggle比赛:狗的品种识别(ImageNet Dogs)

目录 前置准备 整理数据集 图片增广 读取数据集 微调预训练模型 训练函数 训练和验证模型 Kaggle提交结果 前置准备 常规导包 import os import torch import torchvision from torch import nn from d2l import torch as d2l 使用小规模数据样本 d2l.DATA_HUB[dog…...

图神经网络介绍3

1. 图同构网络&#xff1a;Weisfeiler-Lehman 测试与图神经网络的表达力 本节介绍一个关于图神经网络表达力的经典工作&#xff0c;以及随之产生的另一个重要的模型——图同构网络。图同构问题指的是验证两个图在拓扑结构上是否相同。Weisfeiler-Lehman 测试是一种有效的检验两…...

浅谈 React Fiber

想象一下&#xff0c;你正在搭建一个乐高积木城堡。 传统的搭建方式&#xff1a;一次性把所有积木拼好&#xff0c;如果中途发现某个地方拼错了&#xff0c;就需要拆掉重新拼。这个过程就像 React 15 之前的版本&#xff0c;一旦开始渲染&#xff0c;就很难中断&#xff0c;效…...

Winform实现石头剪刀布小游戏

1、电脑玩家类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace RockScissorsClothApp {public class Computer{public Card Play(){Random random new Random();int num random.Next(0, 3…...

计算机的错误计算(九十)

摘要 计算机的错误计算&#xff08;八十九&#xff09;探讨了反双曲余切函数 acoth(x)在 附近的计算精度问题。本节讨论绝对值为大数的反双曲余切函数值的计算精度问题。 Acoth(x) 函数的定义为&#xff1a; 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002e15) .…...

对游戏语音软件Oopz遭遇DDoS攻击后的一些建议

由于武汉天气太热&#xff0c;因此周末两天就没怎么出门。一直在家打《黑神话&#xff1a;悟空》&#xff0c;结果卡在广智这里一直打不过去&#xff0c;本来想找好友一起讨论下该怎么过&#xff0c;但又没有好的游戏语音软件。于是在网上搜索了一些信息&#xff0c;并偶然间发…...

解锁Android开发利器:MVVM架构_android的mvvm

// 从网络或其他数据源获取天气数据return Weather(city, "25C") }} 2.定义View&#xff1a;class WeatherActivity : AppCompatActivity() { private lateinit var viewModel: WeatherViewModel override fun onCreate(savedInstanceState: Bundle?) {super.onCre…...

llama.cpp demo

git clone https://github.com/ggerganov/llama.cpp cd llama.cpp 修改Makefile使能mfma参数 MK_CFLAGS -mfma -mf16c -mavx MK_CXXFLAGS -mfma -mf16c -mavx 安装python3依赖 cat ./requirements/requirements-convert_legacy_llama.txt numpy~1.26.4 sentencepie…...

OpenCV结构分析与形状描述符(19)查找二维点集的最小面积外接旋转矩形函数minAreaRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到一个包围输入的二维点集的最小面积旋转矩形。 该函数计算并返回指定点集的最小面积边界矩形&#xff08;可能是旋转的&#xff09;。开发者…...

[SWPU2019]Web1 超详细教程

老规矩先看源码&#xff0c;没找到啥提示&#xff0c;后面就是登录口对抗 弱口令试了几个不行&#xff0c;就注册了个账户登录进去 可以发布广告&#xff0c;能造成xss&#xff0c;但是没啥用啊感觉 查看广告信息的时候&#xff0c;注意到url当中存在id参数&#xff0c;可能存…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...