智慧牧场数据 7

1 体征数据采集

需求:获取奶牛记步信息

 

三轴加速度测量:加速度测量计反应的加速向量与当前的受力方向是相反,单位为g 

陀螺仪,是用来测量角速度的,单位为度每秒(deg/s) 2000deg/s 相当于1秒钟多少转 

1.1 原理图

IIC的地址最后一1位 

一键还原原理图d1、d2连接在核心板底座的con1和con2

同时,这两个引脚pb7、8可以直接使用IIC

1.2 驱动流程

陀螺仪测量范围是+-2000,加速度测量范围是+-2G,读取初始值是为了便于校准。每次读取到xyz要减去这个值

获取两个字节数据 

 

1.3 修改cubmx工程

I2C使能 pb7和pb8引脚配置

IIC标准工程 

 

 建立sensor文件夹,用于放置传感器相关文件

查看芯片手册

采样频率参考MPU-6050寄存器映射 

1.4 修改工程代码

使用i2c的阅读函数HAL_I2C_Mem_Read()、write

#include "mpu6050.h"


#include "string.h"
#include "stdio.h"

#include "i2c.h"
int16_t Accx,Accy,Accz;


//**********************************//
//函数名称:  InitMpu6050 
//函数描述:   初始化MPU6050
//函数参数:   无
//返回值:     无
//*******************************//

void InitMpu6050(void)
{
  uint8_t WriteCmd = 0;
  
  //解除休眠状态
  WriteCmd = 0x00;
  HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, PWR_MGMT_1, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);
  //时钟速率0x06(1Khz)陀螺仪采样率0x07(125Hz)
  WriteCmd = 0x07;
  HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, SMPLRT_DIV, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);      
  WriteCmd = 0x06;
  HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);
  //不自检,2000deg/s
  WriteCmd = 0x18;
  HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, GYRO_CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);
  //(不自检,2G,5Hz)
  WriteCmd = 0x01;
  HAL_I2C_Mem_Write(&hi2c1, ADDRESS_Write, ACCEL_CONFIG, I2C_MEMADD_SIZE_8BIT, &WriteCmd, 1, 0x10);

  HAL_Delay(10);
  mpu6050_verify(&Accx, &Accy, &Accz); //读取第一次的值

}

//**********************************//
//函数名称:   mpu6050_verify
//函数描述:   MPU6050校验
//函数参数:   int16_t *x, int16_t *y, int16_t *z
//返回值:     无
//*******************************//

void  mpu6050_verify(int16_t *x, int16_t *y, int16_t *z)
{
  uint8_t ReadBuffer[10] = {0};
  
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  
        *x = (ReadBuffer[1]<<8)+ReadBuffer[0] ;
   HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  
        *y = (ReadBuffer[1]<<8)+ReadBuffer[0] ;
        
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  
        *z = (ReadBuffer[1]<<8)+ReadBuffer[0] ;

}

//**********************************//
//函数名称:   mpu6050_ReadData
//函数描述:   MPU6060获取三轴数据
//函数参数:   int16_t *x, int16_t *y, int16_t *z
//返回值:     无
//*******************************//

void  mpu6050_ReadData(float *Mx, float *My, float *Mz)
{
  int16_t x,y,z;
  
  uint8_t ReadBuffer[10] = {0};
         
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_XOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  
  x = (ReadBuffer[1]<<8)+ReadBuffer[0] ;
  x -= Accx;
  *Mx = ((float)x)/16384;
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_YOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  
  y = (ReadBuffer[1]<<8)+ReadBuffer[0] ;
  y -= Accy;
  *My = ((float)y)/16384;
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_L, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[0],1, 0x10);
  HAL_I2C_Mem_Read(&hi2c1, ADDRESS_Read, ACCEL_ZOUT_H, I2C_MEMADD_SIZE_8BIT,&ReadBuffer[1],1, 0x10);  
  z = (ReadBuffer[1]<<8)+ReadBuffer[0] ;
  z -= Accz;
  *Mz = ((float)z)/16384;

}

三轴数据读取,减去初始值校准 

主程序中定义全局变量的xyz坐标

初始化I2C
初始化mpu6050 

 

while(1)之前又写了一个while(1) 

 

2 饲养环境采集

lora中集成温湿度传感器 

 

2.1 原理图 

D2连接到核心板con2  

D2就是pb8

 2.2 驱动分析 

 

获取数据。
如果继续拉高就是70us说明时1,否则是0.
读取5个字节,获取稳定数据、湿度数据和校验码 

2.3 修改工程代码

dh11.c

#include "stdint.h"
#include "tim.h"
#include "gpio.h"
#include "dht11.h"
#include "delay.h"

//温湿度定义

uint8_t ucharT_data_H=0,ucharT_data_L=0,ucharRH_data_H=0,ucharRH_data_L=0,ucharcheckdata=0;

void DHT11_TEST(void)   //温湿传感启动
{
  uint8_t ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_humidity,ucharRH_data_L_humidity,ucharcheckdata_temp;
  uint8_t ucharFLAG = 0,uchartemp=0;
  uint8_t ucharcomdata;
  uint8_t i;  


  {
  D2_OUT_GPIO_Init();                                  //根据时序图配置为输出模式,拉低等待18毫秒
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
  HAL_Delay_ms(18);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);    //拉高,配置为输入模式,等待40us
  D2_IN_GPIO_Init();
  HAL_Delay_10us(4);         
  }

    if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))              //如果响应信号是低电平 ,是否应答____
         {
            ucharFLAG=2;                                                //无符号char型,超时保护,最多255,再+到0,如果=1设置为超时判断
            while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);  //__--80us等待拉高
            ucharFLAG=2;
            while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)&&ucharFLAG++);     //--__80us等待拉低

            for(i=0;i<8;i++)                                             //读取数据
              {
                 ucharFLAG=2; 
                 while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);     //判断是否拉高
                 HAL_Delay_10us(3);                                             //如果拉高延时30us等待磐石是否拉低
                 uchartemp=0;
                 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;          //如果还是高,代表1,否则代表0
                 ucharFLAG=2;
                 while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)&&ucharFLAG++);       //判断是否拉低,或者超时
                 if(ucharFLAG==1)break;                                        //无符号char型,超时保护,最多255,再+到0,如果=1设置为超时判断
                 ucharcomdata<<=1;                                             //左移1位
                 ucharcomdata|=uchartemp; 
               }
            ucharRH_data_H_humidity = ucharcomdata;                      //赋值给湿度高8位
            for(i=0;i<8;i++)    
              {
                 ucharFLAG=2; 
                 while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);
                 HAL_Delay_10us(3);
                 uchartemp=0;
                 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;
                 ucharFLAG=2;
                 while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)&&ucharFLAG++);   
                 if(ucharFLAG==1)break;    
                 ucharcomdata<<=1;
                 ucharcomdata|=uchartemp; 
               }
            ucharRH_data_L_humidity = ucharcomdata;                     //赋值给湿度低8位
            for(i=0;i<8;i++)    
              {
                 ucharFLAG=2; 
                 while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);
                 HAL_Delay_10us(3);
                 uchartemp=0;
                 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;
                 ucharFLAG=2;
                 while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);   
                 if(ucharFLAG==1)break;    
                 ucharcomdata<<=1;
                 ucharcomdata|=uchartemp; 
               }
            ucharT_data_H_temp      = ucharcomdata;                   //赋值给温度高8位
            for(i=0;i<8;i++)    
              {
                 ucharFLAG=2; 
                 while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);
                 HAL_Delay_10us(3);
                 uchartemp=0;
                 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;
                 ucharFLAG=2;
                 while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);   
                 if(ucharFLAG==1)break;    
                 ucharcomdata<<=1;
                 ucharcomdata|=uchartemp; 
               }
            ucharT_data_L_temp      = ucharcomdata;                 //赋值给温度低8位
            for(i=0;i<8;i++)    
              {
                 ucharFLAG=2; 
                 while((!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);
                 HAL_Delay_10us(3);
                 uchartemp=0;
                 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))uchartemp=1;
                 ucharFLAG=2;
                 while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8))&&ucharFLAG++);   
                 if(ucharFLAG==1)break;    
                 ucharcomdata<<=1;
                 ucharcomdata|=uchartemp; 
               }
            ucharcheckdata_temp     = ucharcomdata;                            //读取校验和
//            humiture=1; 
            uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_humidity+ucharRH_data_L_humidity);

          if(uchartemp==ucharcheckdata_temp)                    //判断校验和是否和读取的数据相同
          {          
              ucharT_data_H  = ucharT_data_H_temp;          //进去赋值
              ucharT_data_L  = ucharT_data_L_temp;
              ucharRH_data_H = ucharRH_data_H_humidity;
              ucharRH_data_L = ucharRH_data_L_humidity;
              ucharcheckdata = ucharcheckdata_temp;                    
          } 
       } 
    else //没用成功读取,返回0                              
       {
          ucharT_data_H  = 0;
          ucharT_data_L  = 0;
          ucharRH_data_H = 0;
          ucharRH_data_L = 0; 
       } 
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);          //重新调用systick的config,因为用到的延时毫秒和微妙都是systick,用完后要恢复

}

delay.c

#include "stm32f0xx_hal.h"
#include "delay.h"


/**
  * @}
  */
void HAL_Delay_10us(__IO uint32_t Delay)
{
        HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
	uint32_t temp;
	uint8_t fac_us=60;	        
	SysTick->LOAD=Delay*fac_us; //时间加载	  		 
	SysTick->VAL=0x00;        //清空计数器
	SysTick->CTRL=0x01 ;      //开始倒数 	 
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
	SysTick->CTRL=0x00;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	
}
/**
  * @}
  */
void HAL_Delay_ms(__IO uint32_t Delay)
{
        HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
	uint32_t temp;
	uint16_t fac_ms=6000;	        
	SysTick->LOAD=Delay*fac_ms; //时间加载	  		 
	SysTick->VAL=0x00;        //清空计数器
	SysTick->CTRL=0x01 ;      //开始倒数 	 
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
	SysTick->CTRL=0x00;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	
}
/**
  * @}
  */
void HAL_Delay_us(__IO uint32_t Delay)
{
        HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
	uint32_t temp;
	uint8_t fac_us=6;	        
	SysTick->LOAD=Delay*fac_us; //时间加载	  		 
	SysTick->VAL=0x00;        //清空计数器
	SysTick->CTRL=0x01 ;      //开始倒数 	 
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
	SysTick->CTRL=0x00;       //关闭计数器
	SysTick->VAL =0X00;       //清空计数器	
}

 

 

 

3 饲养环境控制

通过5v  二次回路AC驱动380风扇。试验里面采用了5v微型风扇 

3.1 修改工程代码

gpio D1初始化

 

#include "gpio.h"
#include "fan.h"
#include <stdbool.h>


static uint8_t FanStaus = false;

//**********************************//
//函数名称:   FanOn
//函数描述:   开启风扇
//函数参数:   无
//返回值:     无
//*******************************//

void FanOn(void)
{
    HAL_GPIO_WritePin( FAN_GPIO_PORT, FAN_PIN, FAN_ON );
    FanStaus = true;
}

//**********************************//
//函数名称:   FanOff
//函数描述:   关闭风扇
//函数参数:   无
//返回值:     无
//*******************************//


void FanOff(void)
{
    HAL_GPIO_WritePin( FAN_GPIO_PORT, FAN_PIN, FAN_OFF ); 
    FanStaus = false;
}


//**********************************//
//函数名称:   FanReadStaus
//函数描述:   读取风扇状态
//函数参数:   无
//返回值:     无
//*******************************//


uint8_t FanReadStaus( void )
{
    return FanStaus;
}


 主程序

 

SLCD_SHOW 

 

4 项目集成开发

定时采集上传数据

修改RTC文件

因为IIC,重新使用了cubmx,把IIC初始化更改了,要重新恢复
修改数据处理任务
       传感器定时上传函数

把之前rtc文件复制过来 

 

上传节点传感器函数,可以通过main函数查找,因为开发了3个设备的传感器,要进行区分。之前放在main函数的while1中
根据协议文件,修改数据包 

修改上传代码

//**********************************//
//函数名称:   SendSensorDataUP
//函数描述:   上传节点传感器数据
//函数参数:   无
//返回值:     无
//*******************************//

void SendSensorDataUP(void)
{

  printf("SendSensorDataUP\n");


//传感器类型6050
#if defined(MPU6050)
  mpu6050_ReadData(&Mx,&My,&Mz);
  printf("Mx = %.3f\n",Mx);
  printf("My = %3f\n",My);
  printf("Mz = %3f\n",Mz);

  DataPacke_t.netmsgHead = 'N';
  DataPacke_t.netPanid[0] = HI_UINT16(PAN_ID);
  DataPacke_t.netPanid[1] = LO_UINT16(PAN_ID);
  DataPacke_t.msgHead = 0x21;
  DataPacke_t.dataLength = 0x08;    //不含包头
  DataPacke_t.dataType = 0x00;
  DataPacke_t.deviceAddr[0] = HI_UINT16(ADDR);
  DataPacke_t.deviceAddr[1] = LO_UINT16(ADDR);
  DataPacke_t.sensorType  = 0x3;
  DataPacke_t.buff[0]  = int8_t(Mx*10)   //-127 128
  DataPacke_t.buff[1]  = int8_t(My*10)
  DataPacke_t.buff[2]  = int8_t(Mz*10)


  //校验码
  DataPacke_t.crcCheck = crc8((uint8_t *)&DataPacke_t,DataPacke_t.dataLength + 4);
  //发送数据包
  Radio->SetTxPacket((uint8_t *)&DataPacke_t, DataPacke_t.dataLength + 5);


//传感器类型dht11
#if defined(DHT11)
  DHT11_TEST();
  printf("TEMP = %d\n",ucharT_data_H);
  printf("HUM = %d\n",ucharRH_data_H);

  DataPacke_t.netmsgHead = 'N';
  DataPacke_t.netPanid[0] = HI_UINT16(PAN_ID);
  DataPacke_t.netPanid[1] = LO_UINT16(PAN_ID);
  DataPacke_t.msgHead = 0x21;
  DataPacke_t.dataLength = 0x07;    //不含包头
  DataPacke_t.dataType = 0x00;
  DataPacke_t.deviceAddr[0] = HI_UINT16(ADDR);
  DataPacke_t.deviceAddr[1] = LO_UINT16(ADDR);
  DataPacke_t.sensorType  = 0x1;
  DataPacke_t.buff[0]  = int8_t(ucharT_data_H)   //-127 128
  DataPacke_t.buff[1]  = int8_t(ucharRH_data_H)



  //校验码
  DataPacke_t.crcCheck = crc8((uint8_t *)&DataPacke_t,DataPacke_t.dataLength + 4);
  //发送数据包
  Radio->SetTxPacket((uint8_t *)&DataPacke_t, DataPacke_t.dataLength + 5);


//传感器类型FAN
#if defined(FAN)
  FanStaus = FanReadStaus();

  DataPacke_t.netmsgHead = 'N';
  DataPacke_t.netPanid[0] = HI_UINT16(PAN_ID);
  DataPacke_t.netPanid[1] = LO_UINT16(PAN_ID);
  DataPacke_t.msgHead = 0x21;
  DataPacke_t.dataLength = 0x06;    //不含包头
  DataPacke_t.dataType = 0x01;
  DataPacke_t.deviceAddr[0] = HI_UINT16(ADDR);
  DataPacke_t.deviceAddr[1] = LO_UINT16(ADDR);
  DataPacke_t.sensorType  = 0x3;
  DataPacke_t.buff[0]  = int8_t(FanStaus)   




  //校验码
  DataPacke_t.crcCheck = crc8((uint8_t *)&DataPacke_t,DataPacke_t.dataLength + 4);
  //发送数据包
  Radio->SetTxPacket((uint8_t *)&DataPacke_t, DataPacke_t.dataLength + 5);


#endif   


}

 修改解析代码

//**********************************//
//
//函数名称:   SlaveProtocolAnalysis
//
//函数描述:   从机协议解析
//
//函数参数:   uint8_t *buff,uint8_t len
//
//返回值:     uint8_t
//
//*******************************//

uint8_t SlaveProtocolAnalysis(uint8_t *buff,uint8_t len)
{
  uint8_t Crc8Data;

  printf("SlaveProtocolAnalysis\n");
  for (int i = 0; i < len; i++)
  {
    printf("0x%x  ",buff[i]);
  }
  printf("\n");


  if (buff[0] == NETDATA)
  {
    if (buff[1] == HI_UINT16(PAN_ID) && buff[2] == LO_UINT16(PAN_ID))
    {
      Crc8Data = crc8(&buff[0], len - 1);

      if (Crc8Data != buff[len - 1])
      {
        memset(buff, 0, len);
        return 0;
      }
      if (buff[3] == 0x21)
      {
        printf("Slave_NETDATA\n");
        if( buff[5] == 0x01)
        {
          if(buff[6] == HI_UINT16(ADDR) && buff[7] == LO_UINT16(ADDR))
          {
            if(buff[8] == 0x03)
            {
#if defined(FAN)
              if(buff[9] == true)
              {
                FanON();
              }
              else
              {
                FanOff();
              }
#endif  
            }
          }
        }
      }
      return 0;
    }
  }
  else if((buff[0] == 0x3C) && (buff[2] == 'A'))
  {

    if (DataCrcVerify(buff, len) == 0)
    {
      return 0;
    }
    if (buff[3] == HI_UINT16(PAN_ID) && buff[4] == LO_UINT16(PAN_ID))
    {
      if (buff[5] == jionPacke_t.deviceAddr[0] && buff[6] == jionPacke_t.deviceAddr[1])
      {
        slaveNativeInfo_t.deviceId = buff[7];
        printf("Slave_ACK\n");
        return 0xFF;
      }
    }
  }
  else if((buff[0] == 0x3C) && (buff[2] == 'T'))
  {
    if (DataCrcVerify(buff, len) == 0)
    {
      return 0;
    }
    if (buff[3] == HI_UINT16(PAN_ID) && buff[4] == LO_UINT16(PAN_ID))
    {
      uint32_t alarmTime = 0;
      startUpTimeHours = buff[5];
      startUpTimeMinute = buff[6];
      startUpTimeSeconds = buff[7];
      startUpTimeSubSeconds = buff[8] <<8 | buff[9];
      printf("Slave_CLOCK\n");
      printf("H:%d,M:%d,S:%d,SUB:%d\n", startUpTimeHours, startUpTimeMinute, startUpTimeSeconds, startUpTimeSubSeconds);
      alarmTime = ((DataUpTimeHours * 60 + DataUpTimeMinute) * 60 
                   + DataUpTimeSeconds) * 1000 + (DataUpTimeSubSeconds / 2) + DataUpTime;
      GetTimeHMS(alarmTime, &DataUpTimeHours, &DataUpTimeMinute, &DataUpTimeSeconds, &DataUpTimeSubSeconds);
      printf("DataUpTime->H:%d,M:%d,S:%d,SUB:%d\n", DataUpTimeHours, DataUpTimeMinute, DataUpTimeSeconds, DataUpTimeSubSeconds);
      //使能RTC
      MX_RTC_Init();
     return 0xFF;
    }
  }
  return 1;
}

CRC借用工具

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue关键知识点

watch侦听器 Vue.js 中的侦听器&#xff08;Watcher&#xff09;是 Vue提供的一种响应式系统的核心机制之一。 监听数据的变化&#xff0c;并在数据发生变化时执行相应的回调函数。 目的:数据变化能够自动更新到视图中 原理&#xff1a; Vue 的侦听器通过观察对象的属性&#…

正排索引 vs 倒排索引 - 搜索引擎具体原理

阅读导航 一、正排索引1. 概念2. 实例 二、倒排索引1. 概念2. 实例 三、正排 VS 倒排1. 正排索引优缺点2. 倒排索引优缺点3. 应用场景 三、搜索引擎原理1. 宏观原理2. 具体原理 一、正排索引 1. 概念 正排索引是一种索引机制&#xff0c;它将文档或数据记录按照某种特定的顺序…

分布式锁实战

4、分布式锁 4.1 、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#x…

【鲜货】企业数据治理的首要一步:数据溯源

目录 背景 一、数据探索溯源的定义 二、数据探索溯源的重要性 1、提高数据质量 2、增强数据信任度 3、促进数据合规性 三、数据溯源的主要方法 1、标注法 2、反向查询法 3、双向指针追踪法 四、数据探索溯源的主要步骤 1、确定溯源目标 2、收集元数据 3、分析数据…

微信小程序uniapp+vue.js旅游攻略系统9krxx

实现了一个完整的旅游攻略小程序系统&#xff0c;其中主要有用户模块、用户表模块、token表模块、收藏表模块、视频信息模块、视频类型模块、景点资讯模块、门票购买模块、旅游攻略模块、景点信息模块、论坛表模块、视频信息评论表模块、旅游攻略评论表模块、景点信息评论表模块…

噪声的力量:重新定义 RAG 系统的检索

该文得到了一个反常识的结论&#xff0c;当无关的噪声文档放在正确的位置时&#xff0c;实际上有助于提高RAG的准确性。 摘要 检索增强生成&#xff08;RAG&#xff09;系统代表了传统大语言模型&#xff08;大语言模型&#xff09;的显着进步。 RAG系统通过整合通过信息检索…

CSS基础:插入CSS样式的3种方法

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 262篇原创内容-公众号 后台回复“前端工具”可获取开发工具&#xff0c;持续更新中 后台回复“前端基础…

【UnityRPG游戏制作】Unity_RPG项目之界面面板分离和搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

2_5.Linux存储的基本管理

实验环境&#xff1a; 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称&#xff1a; SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…

stm32开发之threadx使用记录(主逻辑分析)

前言 threadx的相关参考资料 论坛资料、微软官网本次使用的开发板为普中科技–麒麟&#xff0c;核心芯片为 stm32f497zgt6开发工具选择的是stm32cubemx(代码生成工具)clion(代码编写工具)编译构建环境选择的是arm-none-gcc编译 本次项目结构 CMakeList对应的配置 set(CMAKE_…

Seata(分布式事务集成测试和总结)

文章目录 1.集成测试1.集成测试正常下单1.步骤2.浏览器访问 http://localhost:10008/order/save?userId666&productId1&nums1&money1003.注意事项和细节 2.集成测试模拟异常1.步骤1.com/sun/springcloud/controller/StorageController.java 休眠12s&#xff0c;模…

虚拟机打不开

问题 另一个程序已锁定文件的一部分&#xff0c;进程无法访问 打不开磁盘“G:\centeros\hadoop104kl\hadoop100-cl2.vmdk”或它所依赖的某个快照磁盘。 模块“Disk”启动失败。 未能启动虚拟机。 原因 前一次非正常关闭虚拟机导致.lck 文件是VMWare软件的一种磁盘锁文件&…

线性数据结构

1.数组 数组使用一块连续的内存来存储元素&#xff0c;并且元素的类型都是相同的。可以通过索引来访问。 2.链表 链表由一系列节点组成&#xff0c;每个节点包含两部分&#xff1a;数据部分和指针部分。数据部分用于存储元素的值&#xff0c;指针部分则指向下一个节点。没有使…

机器学习 - multi-class 数据集训练 (含代码)

直接上代码 # Multi-class datasetimport numpy as np RANDOM_SEED 42 np.random.seed(RANDOM_SEED) N 100 # number of points per class D 2 # dimensionality K 3 # number of classes X np.zeros((N*K, D)) y np.zeros(N*K, dtypeuint8) for j in range(K):ix rang…

多线程的入门(二)线程实现与初步使用

1.实现Runable接口 实现Runable接口&#xff0c;实现run方法&#xff1b; 这种方式创建的线程实现类执行时需要创建Thread实例去运行该任务 示例如下&#xff1a; package com.example.springbootdamo.Thread;import org.apache.logging.log4j.LogManager; import org.apach…

三子棋游戏----C语言版【超级详细 + 视频演示 + 完整源码】

㊙️小明博客主页&#xff1a;➡️ 敲键盘的小明 ㊙️ ✅关注小明了解更多知识☝️ 文章目录 前言一、三子棋的实现思路二、三子棋的实现步骤2.1 先显示游戏的菜单2.2 游戏的具体实现2.2.1 棋盘的初始化2.2.2 展示棋盘2.2.3 下棋&#x1f534;玩家下棋&#x1f534;电脑下棋2.2…

二叉树进阶——手撕二叉搜索树

troop主页&#xff1a;troop 手撕二叉搜索树 1.二叉搜索树的定义2.实现&#xff08;非递归&#xff09;补充结构2.1查找2.2插入2.3删除&#xff08;重要&#xff09;情况1(无孩子&&一个孩子&#xff09; 3.二叉搜索树的应用3.1K模型3.2KV模型3.2.1KV模型的实现 总结二叉…

RUST语言值所有权之内存复制与移动

1.RUST中每个值都有一个所有者,每次只能有一个所有者 String::from函数会为字符串hello分配一块内存 内存示例如下: 在内存分配前调用s1正常输出 在分配s1给s2后调用报错 因为s1分配给s2后,s1的指向自动失效 s1被move到s2 s1自动释放 字符串克隆使用

I2C驱动实验:读取AP3216C设备中寄存器的数据

一. 简介 经过前面几篇文章的学习&#xff0c;已经完成了I2C驱动框架&#xff0c;字符设备驱动框架&#xff0c;编写了 读写 I2C设备中寄存器的数据的代码&#xff0c;文章如下&#xff1a; I2C驱动实验&#xff1a;实现读/写I2C设备寄存器的函数-CSDN博客 本文在此基础上&a…

C#开发中一些常用的工具类分享

一、配置文件读写类 用于在开发时候C#操作配置文件读写信息 1、工具类 ReadIni 代码 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks;namesp…