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.原理图

这里需要说明一下,SDA和SCL大家都比较熟悉,但是INT和WAK就少见了,在这款模块中,INT相当于复位引脚,CCS811芯片内部集成的单片机程序跑飞之后可以将该引脚接地复位,同时需要WAK为低电平的时候SDA、SCL才能正常通信
2.引脚描述
| 引脚名称 | 描述 |
| VCC | 供给电压DC 3.3V |
| GND | 地线 |
| SCL | IIC时钟线 |
| SDA | IIC数据线 |
| WAK | 低电平使能 |
| INT | 中断 |
| RST | 复位 |
| ADD | 地址选择位 |
3.工作原理介绍
CCS811-811是一种低功耗的数字气体传感器,集成了CCS801传感器和8位MCU(带模数转换器(ADC)),用来检测室内的空气质量,包括二氧化碳(Co2)和广泛的挥发性有机化合物气体(VOCs),产品的低功耗特性可用在环境监测设备上,灵敏度高,智能算法计算TVOC/eCO2数值并输出IIC信号可直接与单片机通信。模块的主要特点:检测室内空气质量的金属氧化物(MOX)传感器,集成了8位MCU用于运算第一级算法,集成了12位ADC用于传感器读数和数字化转换,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模块是一种气体传感器,可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…...
Navicat 17 新特性 | 聚焦 MongoDB
随着 Navicat 17 的盛大发布,其一系列创新特性赢得了广大用户的热烈反响。它不仅在模型设计上实现了突破性优化,提升了查询与配置的效率,还大幅优化了用户界面的交互体验,原生支持国产平台与操作系统,同时增强 BI 能力…...
openssl的使用
1、编译 Github下载:https://github.com/openssl/openssl 官网下载:https://openssl-library.org/source/index.html 官网历史版本:https://www.openssl.org/source/old/ 1.1 Windows下编译 我的文章:OPC UA使用 Openssl库编译…...
ICETEK-DM6437-AICOM—— DMA直接存储器访问设计
#一、设计目的: 1 进一步了解 ICETEK-DM6437-AF 的内部存储器空间的分配及指令寻址方式: 内部存储器空间分配:研究 ICETEK-DM6437-AF 的存储器架构,包括但不限于片内 SRAM、片外 DRAM 和其他存储器模块。了解这些存储器的大小、起…...
【AcWing】快速排序的Go实现
快速排序的Go实现 这一部分参考了AcWing当中使用Go语言实现快速排序的题解:https://www.acwing.com/activity/content/code/content/296206/。 其中有很多部分非常值得参考,故写一个博客进行记录。 Code package mainimport "fmt"func qui…...
使用C++11的`std::future`和`std::promise`实现异步网络通信
使用C11的std::future和std::promise实现异步网络通信 在现代C编程中,异步编程是一个重要的主题。C11引入了std::future和std::promise,为异步编程提供了强大的工具。本文将详细介绍如何使用std::future和std::promise实现异步网络通信,并提…...
【C++登堂入室】类与对象(上)
目录 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 八、this指针 …...
【西电电装实习】5. 无人机模块及作用、上位机的操作
文章目录 前言一、硬件结构电源、电源电压测试电路晶振外围陀螺仪信号放大电路及天线空心杯(电极)驱动电路 软件设置整机装配PID 参数设置公式 参考文献 前言 西电电装实习,无人机原理图、上位机的调节方法 一、硬件结构 电源、电源电压测试…...
有关WSL和docker的介绍
目录标题 如何利用在windows上配置docker实现linux和windows容器修改WSL默认安装(也就是linux子系统)目录到其他盘 如何利用在windows上配置docker实现linux和windows容器 wsl的基本命令:参考网页 docker入门到实践:参考网页 官方…...
以太坊入门
1. 以太坊简介 Vitalik Buterin 在 2013 年 11 月提出了以太坊的概念,其关键思想是:开发一种图灵完备(Turing-Complete) 的语言,以允许开发用于区块链和去中心化应用的任意程序(智能合约)。该概念与比特比相…...
秃姐学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. 图同构网络:Weisfeiler-Lehman 测试与图神经网络的表达力 本节介绍一个关于图神经网络表达力的经典工作,以及随之产生的另一个重要的模型——图同构网络。图同构问题指的是验证两个图在拓扑结构上是否相同。Weisfeiler-Lehman 测试是一种有效的检验两…...
浅谈 React Fiber
想象一下,你正在搭建一个乐高积木城堡。 传统的搭建方式:一次性把所有积木拼好,如果中途发现某个地方拼错了,就需要拆掉重新拼。这个过程就像 React 15 之前的版本,一旦开始渲染,就很难中断,效…...
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…...
计算机的错误计算(九十)
摘要 计算机的错误计算(八十九)探讨了反双曲余切函数 acoth(x)在 附近的计算精度问题。本节讨论绝对值为大数的反双曲余切函数值的计算精度问题。 Acoth(x) 函数的定义为: 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002e15) .…...
对游戏语音软件Oopz遭遇DDoS攻击后的一些建议
由于武汉天气太热,因此周末两天就没怎么出门。一直在家打《黑神话:悟空》,结果卡在广智这里一直打不过去,本来想找好友一起讨论下该怎么过,但又没有好的游戏语音软件。于是在网上搜索了一些信息,并偶然间发…...
解锁Android开发利器:MVVM架构_android的mvvm
// 从网络或其他数据源获取天气数据return Weather(city, "25C") }} 2.定义View: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()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到一个包围输入的二维点集的最小面积旋转矩形。 该函数计算并返回指定点集的最小面积边界矩形(可能是旋转的)。开发者…...
[SWPU2019]Web1 超详细教程
老规矩先看源码,没找到啥提示,后面就是登录口对抗 弱口令试了几个不行,就注册了个账户登录进去 可以发布广告,能造成xss,但是没啥用啊感觉 查看广告信息的时候,注意到url当中存在id参数,可能存…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
新版NANO下载烧录过程
一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...
解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护
摘要 本文以健康管理应用为例,展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制,实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码,演示鸿蒙系统如何平衡功能需求与隐私安…...
【Axure高保真原型】图片列表添加和删除图片
今天和大家分享图片列表添加和删除图片的原型模板,效果包括: 点击图片列表的加号可以显示图片选择器,选择里面的图片; 选择图片后点击添加按钮,可以将该图片添加到图片列表; 鼠标移入图片列表的图片&…...
