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

news2024/11/25 12:45:11

目录

一、介绍

二、传感器原理

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 0x4

void 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口速度为50MHz
  GPIO_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  ,ID
	 OFF_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);	        //释放SDA
	CCS811_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;                //拉高时钟线,采样从机SDA
     
		  if(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口速度为50MHz
  GPIO_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);
}

四、实验效果 

五、资料获取

项目分享

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

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

相关文章

OPPO 全家桶:Find X8/Pro、Pad3 Pro与Enco X3即将10月登场

随着科技的不断发展&#xff0c;智能手机、平板电脑和耳机等电子产品已经成为我们日常生活中不可或缺的一部分。 作为全球知名的科技企业&#xff0c;OPPO一直致力于为消费者提供优质的产品和服务。 近日&#xff0c;有关OPPO全家桶将在10月份“凑齐”的消息引起了广泛关注。…

Elemnt-UI + 递归组件实现后台管理系统左侧菜单

Elemnt-UI 递归组件实现后台管理系统左侧菜单 在 Vue.js 中&#xff0c;允许你编写一个组件来表示一个节点&#xff0c;而这个节点可以包含多个子节点&#xff0c;每个子节点又可以是同样的组件。这种方式使得组件能够处理无限层级的嵌套结构。 应用场景 递归组件非常适合处…

2013年

B D B C D 分支结点是非叶结点 B 47 C A C C D D C A C

2010-2022年各省乡村振兴新质生产力相关变量数据(40+指标)

2010-2022年各省乡村振兴新质生产力相关变量数据&#xff08;40指标&#xff09; 1、时间&#xff1a;2010-2022年 2、来源&#xff1a;统计年鉴、能源统计年鉴、农村统计年鉴、人口和就业统计年鉴、城乡建设统计年鉴以及各省份统计年鉴 3、指标&#xff1a;省份、年份、分地…

信号量(二值信号量和计数信号量)和互斥量

信号量 信号量&#xff08;Semaphore&#xff09; 是一种实现任务间通信的机制&#xff0c; 可以实现任务之间同步或临界资源的互斥访问&#xff0c; 常用于协助一组相互竞争的任务来访问临界资源。 在多任务系统中&#xff0c; 各任务之间需要同步或互斥实现临界资源的保护&a…

图神经网络介绍3

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

第二期: 第二节 , 逻辑编程 , gpio

1 首先就是 看原理图&#xff1a; 这里有两个 &#xff2c;&#xff25;&#xff24; 核心板的原理图。 可以看到 是这个脚。 &#xff12; 然后就是 查看数据手册。 从 数据手册可以看出 &#xff0c;一共有这么多的 gpio 组&#xff0c; 但是这些 组 是有复用的&#xf…

多文件编程实现链表创建,插入,输出(上)

linklist.c #include "linklist.h" //创建空的链表&#xff0c;为头结点在堆区分配空间 linklist_t *creat_empty_linklist() {linklist_t *head NULL;head (linklist_t *) malloc(sizeof(linknode_t));if(NULL head){printf("malloc is fail!\n");ret…

网格参数的应用和数学基础

引言 对于任意两个拓扑结构相似的表面&#xff0c;可以计算它们之间的一一对应映射。如果其中一个表面由三角形网格表示&#xff0c;那么计算这种映射的问题被称为网格参数化。映射到的表面通常被称为参数域。表面网格与各种域之间的参数化在计算机图形学和几何处理中有广泛的应…

移动WEB开发(第二天)_flex布局

移动WEB开发&#xff08;第二天&#xff09;_flex布局 移动web开发——flex布局1.0传统布局和flex布局对比1.1传统布局1.2 flex布局1.3 建议 2.0 flex布局原理3.0 父项常见属性3.1 flex-direction设置主轴的方向3.2 justify-content 设置主轴上的子元素排列方式3.3 flex-wrap设…

9月美联储决策前哨战——美国CPI数据来袭

随着本周关键CPI数据的即将发布&#xff0c;市场正翘首以待&#xff0c;这将是美联储在9月17日至18日议息会议前获取的最后一块重要经济拼图。鉴于美联储官员已进入传统的政策静默期&#xff0c;8月份的CPI报告无疑将成为交易员们评估未来货币政策走向的重要标尺。 欧洲央行降…

python列表判断是否为空的三种方式

#列表是否为空判断 a[]一&#xff1a; if a:print(not null) else:print(null)二&#xff1a; b len(a) if b 0:print(null) else:print(not null)三&#xff1a; if not a:print(null) else:print(not null)运行结果&#xff1a;

Day9 | Java框架 | SpringBoot

Day9 | Java框架 | SpringBoot SpringBoot简介入门程序概述起步依赖 基础配置配置文件格式&#xff1a;3种yaml语法规则yaml数据读取三种格式 多环境启动配置文件参数命令行参数多环境开发控制&#xff1a;Maven & SpringBoot 多环境兼容 配置文件分类&#xff1a;4种 整合…

Qt+FFmpeg开发视频播放器笔记(三):音视频流解析封装

音频解析 音频解码是指将压缩的音频数据转换为可以再生的PCM(脉冲编码调制)数据的过程。 FFmpeg音频解码的基本步骤如下: 初始化FFmpeg解码器(4.0版本后可省略): 调用av_register_all()初始化编解码器。 调用avcodec_register_all()注册所有编解码器。 打开输入的音频流:…

k8s以及prometheus

#生成控制器文件并建立控制器 [rootk8s-master ~]# kubectl create deployment bwmis --image timinglee/myapp:v1 --replicas 2 --dry-runclient -o yaml > bwmis.yaml [rootk8s-master ~]# kubectl expose deployment bwmis --port 80 --target-port 80 --dry-runclient…

【深海王国】初中生也能画的电路板?目录合集

Hi٩(๑ ^ o ^ ๑)۶, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督为大家带来系列文章《初中生也能画的电路板》&#xff0c;帮你一周内快速入门PCB设计&#xff0c;手把手教你从元器件库添加、电路原理图绘制、…

如何解决在idea中的hadoop日志错误

在idea中操作hadoop的时候&#xff0c;每次运行代码都会发现有个日志错误&#xff0c;虽然不影响程序运行&#xff0c;但是无法打印日志。这是缺少依赖&#xff0c;和windows上缺少log4j的文件 解决方案&#xff1a; 1、导入slf4j依赖 2、导入hadoop中的log4j文件 1、从hado…

校园安全无小事,EasyCVR视频综合管理平台助力智慧校园视频监控系统全面升级

随着信息技术的飞速发展&#xff0c;智慧校园作为教育信息化的重要载体&#xff0c;正逐步成为提升校园安全管理、优化教育资源配置、增强师生互动体验的关键手段。其中&#xff0c;高效、智能的视频监控系统作为智慧校园不可或缺的一部分&#xff0c;扮演着至关重要的角色。TS…

Benvista PhotoZoom Pro / Classic 9.0.2 Win/mac + Plug-in中文破解版

对数码照片放大的质量不满意&#xff1f; 使用 BenVista PhotoZoom Classic9 调整图像大小&#xff0c;并通过我们屡获殊荣的独特 S-Spline 技术获得出色的效果&#xff01; 更高质量&#xff1a;PhotoZoom Classic9 专门用于在保持质量的同时放大照片。 该软件配备了 BenVista…

C++核心编程和桌面应用开发 第一天

目录 1.C的编程方式 2.双冒号::运算符 3.命名空间 3.1作用 3.2命名空间内的东西 3.3注意事项 4.using的用法 4.1using的声明 4.2using编译指令 5.C相较于C的增强 5.1全局变量检测增强 5.2函数检测增强 5.3类型转换检测增强 5.4结构体增强 5.5三目运算符增强 5.…