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

软件I2C读写MPU6050代码

1、硬件电路

  • SCL引到了STM32的PB10号引脚,SDA引到了PB11号引脚
  • 软件I2C协议: 用普通GPIO口,手动反转电平实现协议,不需要STM32内部的外设资源支持,故端口是可以任意指定
  • MPU605在SCL和SDA自带了两个上拉电阻,故不需要额外接上拉电阻
  • AD0引脚:修改从机地址的最低位,其内置了下拉电阻,故引脚悬空时,相当于接地
  • INT:中断信号输出引脚,没用到,不接

2、I2C部分代码解释 

(1)发送字节

void MyI2C_SendByte(uint8_t Byte)
{//先把数据放到SDA上面,然后SCL先置1,再置零,将SDA上面的数据送出去uint8_t i;for (i = 0; i < 8; i ++){MyI2C_W_SDA(Byte & (0x80 >> i));//先去最高位MyI2C_W_SCL(1);//驱动时钟走一个脉冲MyI2C_W_SCL(0);}
}
  •  除了终止条件,SCL以高电平结束,所有单元以低电平结束,方便各个单元的拼接
  •  趁着SCL是低电平,先把数据放在SDA上,再MyI2C_W_SCL(1);MyI2C_W_SCL(0);
  • SCL是原本是低电平,此时先高电平再低电平,使得SDA走一个时钟,读取SCL的数据

 (2)读取字节

SCL低电平期间,从机将数据位依次放到SDA线上(高位先行)

 

uint8_t MyI2C_ReceiveByte(void)
{//SDA先置1,这个时候从机把第一个数据放到SDA上,然后SCL置1,读取从机的数据uint8_t i, Byte = 0x00;MyI2C_W_SDA(1);//主机释放SDA,从机把数据放到SDA,这时,主机释放SCL,SCL高电平,主机就能读取数据(高位先行)for (i = 0; i < 8; i ++){MyI2C_W_SCL(1);//SCL高电平,主机就可能读取数据了//置1之后读取SDA的数据if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}//如果不是高电平,就默认是写进0MyI2C_W_SCL(0);}return Byte;//把接收的字节放回过去
}
  • 接收一个字节,开始时,SCL为低电平,从机把数据放在SDA,为了防止主机干扰从机写入数据
  • 主机先释放SDA,释放SDA相当于切换为输入模式,故在SCL低电平时,从机会把数据放到SDA
  • 如果从机想发1,就释放SDA,发0,拉低SDA,然后主机释放SCL,在SCL高电平期间,读取SDA
  • 即在SCL为低电平的时候,SDA写入数据,等SCL释放时,读SDA数据,即为读写分离的方式
  • 故在读写数据的时候,SCL是在SDA低电平的时候变化,在高电平的时候不变,

        在起始和终止的时候,SCL是在SDA高电平的时候变化 

(3)接收应答 

  • 函数进来时,SCL为低电平,主机释放SDA,防止干扰从机,同时从机把应答位放在SDA上,
  • SCL高电平,主机读取应答位,SCL低电平,进入下一个时序单元
uint8_t MyI2C_ReceiveAck(void)
{//将SDA置1后,这个时候从机把应答位放在SDA上,这个时候只需要SCL置1,后置零,读取数据即可,记得是        //在SCL为高电平的时候读取数据,然后读取完之后SCL再置零uint8_t AckBit;MyI2C_W_SDA(1);MyI2C_W_SCL(1);AckBit = MyI2C_R_SDA();//此处不一定是1,MyI2C_W_SCL(0);return AckBit;
}
  • AckBit = MyI2C_R_SDA();//此处不一定是1,  
  • 原因:I2C的引脚都是开漏输出+弱上拉配置,主机输出1,并不是强制SDA为高电平而是释放SDA
  •  I2C是在进行通信,主机释放SDA,从机在的情况下,有义务将SDA拉低,故读到0,代表从机给了应答,1则从机应答 

 3、MyI2C.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"//写SCL的函数
void MyI2C_W_SCL(uint8_t BitValue)
{GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)BitValue);Delay_us(10);
}//写SDA的函数
void MyI2C_W_SDA(uint8_t BitValue)
{GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)BitValue);Delay_us(10);
}//读SDA的函数
uint8_t MyI2C_R_SDA(void)//读
{uint8_t BitValue;BitValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);//读取SDA的线Delay_us(10);return BitValue;
}//MyI2C初始化
void MyI2C_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出模式(仍然可以输入,输入时,先输出1,再直接读取输入数据寄存器)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);//都为高电平,处于空闲状态
}//兼容起始条件和重复条件
void MyI2C_Start(void)
{MyI2C_W_SDA(1);//先确保释放数据线,再释放SCLMyI2C_W_SCL(1);MyI2C_W_SDA(0);//拉低数据线,触发通讯MyI2C_W_SCL(0);//拉低时钟线,方便数据线上的数据变化
}//终止条件
//确保释放的时候,能产生上升沿,需要先拉底数据线,后面在SCL是高电平的时候,再拉高SDA
void MyI2C_Stop(void)
{MyI2C_W_SDA(0);MyI2C_W_SCL(1);MyI2C_W_SDA(1);
}
//除了终止条件,SCL以高电平结束,所有单元以低电平结束,方便各个单元的拼接//发送一个字节的逻辑(以stm32为视角)
void MyI2C_SendByte(uint8_t Byte)
{uint8_t i;for (i = 0; i < 8; i ++){//除了终止条件,SCL以高电平结束,所有单元以低电平结束,方便各个单元的拼接//趁着SCL是低电平,先把数据放在SDA上,再让SDA走一个时钟MyI2C_W_SDA(Byte & (0x80 >> i));//先去最高位MyI2C_W_SCL(1);//驱动时钟走一个脉冲MyI2C_W_SCL(0);}
}//接收一个字节,开始时,SCL为低电平,从机把数据放在SDA,为了防止主机干扰从机写入数据
//主机先释放SDA,释放SDA相当于切换为输入模式,故在SCL低电平时,从机会把数据放到SDA
//如果从机想发1,就释放SDA,发0,拉低SDA,然后主机释放SCL,在SCL高电平期间,读取SDA
//即在SCL为低电平的时候,SDA写入数据,等SCL释放时,读SDA数据,即为读写分离的方式
//故在读写数据的时候,SCL是在SDA低电平的时候变化,在高电平的时候不变,
//在起始和终止的时候,SCL是在SDA高电平的时候变化
uint8_t MyI2C_ReceiveByte(void)
{uint8_t i, Byte = 0x00;MyI2C_W_SDA(1);//主机释放SDA,从机把数据放到SDA,这时,主机释放SCL,SCL高电平,主机就能读取数据(高位先行)for (i = 0; i < 8; i ++){MyI2C_W_SCL(1);//SCL高电平,主机就可能读取数据了if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}//如果不是高电平,就默认是写进0MyI2C_W_SCL(0);}return Byte;//把接收的字节放回过去
}//发送应答
//函数进来时,SCL为低电平,
void MyI2C_SendAck(uint8_t AckBit)
{MyI2C_W_SDA(AckBit);MyI2C_W_SCL(1);MyI2C_W_SCL(0);//进入下一个时序单元
}//接收应答
//函数进来时,SCL为低电平,主机释放SDA,防止干扰从机,同时,从机把应答位放在SDA上,
//SCL高电平,主机读取应答位,SCL低电平,进入下一个时序单元
uint8_t MyI2C_ReceiveAck(void)
{uint8_t AckBit;MyI2C_W_SDA(1);MyI2C_W_SCL(1);AckBit = MyI2C_R_SDA();//此处不一定是1,//原因:I2C的引脚都是开漏输出+弱上拉配置,主机输出1,并不是强制SDA为高电平而是释放SDA//I2C是在进行通信,主机释放SDA,从机在的情况下,有义务将SDA拉低,故读到0,代表从机给了应答,1则从机应答MyI2C_W_SCL(0);return AckBit;
}

4、MPU6050.c   在这个代码当中写到了MPU读写寄存器等函数

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"
#include "MPU6050_Reg.h"#define MPU6050_ADDRESS		0xD0//基于I2C通信的模块,实现指定地址读、指定地址写,再实现写寄存器对芯片进行配置,读寄存器得到传感器数据//指定地址写
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();//没有对应答位进行判断MyI2C_SendByte(RegAddress);MyI2C_ReceiveAck();//没有对应答位进行判断MyI2C_SendByte(Data);MyI2C_ReceiveAck();//没有对应答位进行判断MyI2C_Stop();
}//指定地址读
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{uint8_t Data;MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(RegAddress);MyI2C_ReceiveAck();MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS | 0x01);//读MyI2C_ReceiveAck();//若想要给多个数据,则用for循环接收,然后MyI2C_SendAck(0),最后再写1Data = MyI2C_ReceiveByte();MyI2C_SendAck(1);//1不给从机应答,0给从机应答(想读多个字节,给应答),如果在这里给了应答,那么从机就会源源不断发送数据MyI2C_Stop();return Data;//地址
}//目前的配置:解除睡眠、选择陀螺仪时钟,6个轴均不待机,采样分频为10
//滤波参数给最大,陀螺仪个加速度计都选择最大量程
void MPU6050_Init(void)
{MyI2C_Init();MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);//电源管理寄存器1:翻手册:一位一位赋值,不复位,解除睡眠,不需要循环,温度传感器失能,001:选择x轴的螺旋仪时钟MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);//电源管理寄存器2:00:不需要循环模式唤醒频率,后6位,每个轴的待机位,全部给0,不需要待机MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);//10分频//采样率分频,这8位决定了数据的快慢,值越小越快,根据实际的需求来,MPU6050_WriteReg(MPU6050_CONFIG, 0x06);//配置寄存器:前两位:没用,第3位到5位:000不需要外部同步,最后三位:110,最平滑的数字低通滤波器MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);//陀螺仪配置寄存器:前面三位:自测使能,不自测;4、5位:满量程选择,11,选择最大量程,后面三位无关位MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);//加速度计配置寄存器:自测给000,满量程给最大量程11,用不到高通滤波器00
}uint8_t MPU6050_GetID(void)
{return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}/*
获取数据
加速度传感器的输出数据(x轴y轴和z轴的加速度)
陀螺仪传感器的输出数据(x轴y轴和z轴的角速度)
改变MPU6050传感器的姿态,6个数据就会对应变化
*/
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{uint8_t DataH, DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);*AccX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);*AccY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);*AccZ = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);*GyroX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);*GyroY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);*GyroZ = (DataH << 8) | DataL;
}

5、MPU6050_Reg.c

#ifndef __MPU6050_REG_H
#define __MPU6050_REG_H#define	MPU6050_SMPLRT_DIV		0x19//采样率分频
#define	MPU6050_CONFIG			0x1A//配置寄存器
#define	MPU6050_GYRO_CONFIG		0x1B//陀螺仪配置寄存器
#define	MPU6050_ACCEL_CONFIG	0x1C//加速度计配置寄存器#define	MPU6050_ACCEL_XOUT_H	0x3B//加速度寄存器X轴的高8位
#define	MPU6050_ACCEL_XOUT_L	0x3C//加速度寄存器X轴的低8位
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43//陀螺仪的x轴
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48#define	MPU6050_PWR_MGMT_1		0x6B//电源管理寄存器1,地址是0x6B
#define	MPU6050_PWR_MGMT_2		0x6C//电源管理寄存器2,地址是0x6B
#define	MPU6050_WHO_AM_I		0x75#endif

6、main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MPU6050.h"uint8_t ID;
int16_t AX, AY, AZ, GX, GY, GZ;
//写好I2C底层的GPIO初始化和6各时序基本单元
//起始、终止、发送一个字节、接受一个字节、发送应答和接收应答int main(void)
{OLED_Init();MPU6050_Init();OLED_ShowString(1, 1, "ID:");ID = MPU6050_GetID();OLED_ShowHexNum(1, 4, ID, 2);while (1){MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);OLED_ShowSignedNum(2, 1, AX, 5);OLED_ShowSignedNum(3, 1, AY, 5);OLED_ShowSignedNum(4, 1, AZ, 5);OLED_ShowSignedNum(2, 8, GX, 5);OLED_ShowSignedNum(3, 8, GY, 5);OLED_ShowSignedNum(4, 8, GZ, 5);}
}

7、从机地址

该设备中只有AD0一个引脚,故只有两个名字,若有AD0和AD1两个引脚,则有4个名字

最后一位为0,否则就是把控制权交出去

I2C从机地址:1101000(AD0=0)——>1101 0000 0xD0

                        1101001(AD0=1)——>1101 0010 0xD2

8、验证结果 

将陀螺仪 放在水平位置上

显示屏读出的六个数据是

+00130 -00018

-00017 -00003

+01943 -00007

验证数据

配置的是量程最大的18g,故1943/32768=x/16g x=0.949g,接近1

把设备上倾,x轴正值,下倾,x轴负值

相关文章:

软件I2C读写MPU6050代码

1、硬件电路 SCL引到了STM32的PB10号引脚&#xff0c;SDA引到了PB11号引脚软件I2C协议&#xff1a; 用普通GPIO口&#xff0c;手动反转电平实现协议&#xff0c;不需要STM32内部的外设资源支持&#xff0c;故端口是可以任意指定MPU605在SCL和SDA自带了两个上拉电阻&#xff0c;…...

销售/回收DSOS254A是德keysight MSOS254A混合信号示波器

Agilent DSOS254A、Keysight MSOS254A、 混合信号示波器&#xff0c;2.5 GHz&#xff0c;20 GSa/s&#xff0c;4 通道&#xff0c;16 数字通道。 ​Infiniium S 系列示波器 信号保真度方面树立新标杆 500 MHz 至 8 GHz 出色的信号完整性使您可以看到真实显示的信号&#xff1…...

RIDGID里奇金属管线检测仪故障定位仪维修SR-20KIT

里奇RIDGID管线定位仪/检测仪/探测仪维修SR-20 SR-24 SR-60 美国里奇SeekTech SR-20管线定位仪对于初次使用定位仪的用户或经验丰富的用户&#xff0c;都同样可以轻易上手使用SR-20。SR-20提供许多设置和参数&#xff0c;使得大多数复杂的定位工作变得很容易。此外&#xff0c…...

NodeJs之调试

关于调试 当我们只专注于前端的时候&#xff0c;我们习惯性F12&#xff0c;这会给我们带来安全与舒心的感觉。 但是当我们使用NodeJs来开发后台的时候&#xff0c;我想噩梦来了。 但是也别泰国担心&#xff0c;NodeJs的调试是很不方便&#xff01;这是肯定的。 但是还好&…...

Java面试知识点(全)- Java并发-多线程JUC二-原子类/锁

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 JUC原子类 什么是CAS CAS的全称为Compare-And-Swap&#xff0c;直译就是对比交换。是一条CPU的原子指令&#xff0c;其作用是让CPU先进行比较两个值…...

CSS--移动web基础

01-移动 Web 基础 谷歌模拟器 模拟移动设备&#xff0c;方便查看页面效果 屏幕分辨率 分类&#xff1a; 物理分辨率&#xff1a;硬件分辨率&#xff08;出厂设置&#xff09;逻辑分辨率&#xff1a;软件 / 驱动设置 结论&#xff1a;制作网页参考 逻辑分辨率 视口 作用&a…...

Appuploader 常见错误及解决方法

转载&#xff1a;Appuploader 常见错误及解决方法 问题解决秘籍 遇到问题&#xff0c;第一个请登录苹果开发者官网 检查一遍账号是否有权限&#xff0c;是否被停用&#xff0c;是否过期&#xff0c;是否有协议需要同意&#xff0c;并且在右上角切换账号后检查所有关联的账号是否…...

消息通知之系统层事件发布相关流程

前言 Openharmony 3.1Release中存在消息通知的处理&#xff0c;消息通知包括系统层事件发布、消息订阅、消息投递与处理&#xff0c;为了开发者能够熟悉消息的处理流程&#xff0c;本篇文章主要介绍系统层事件发布的相关流程。 整体流程 代码流程 发布消息 { eventAction)w…...

Elsevier Ocean Engineering Guide for Authors 解读

文章目录 ★Types of contributions★Submission checklistEthics in publishing★Declaration of competing interestDeclaration of generative AI in scientific writingSubmission declaration and verificationPreprint posting on SSRNUse of inclusive languageReportin…...

基于Fragstats的土地利用景观格局分析

土地利用以及景观格局是当前全球环境变化研究的重要组成部分及核心内容&#xff0c;其对区域的可持续发展以及区域土地管理有非常重要的意义。通过对土地利用时空变化规律进行分析可以更好的了解土地利用变化的过程和机制&#xff0c;并且通过调整人类社会经济活动&#xff0c;…...

ffmpeg-转码脚本02

ffmpeg-转码脚本详解 高级脚本 以下为主要部分 更高级优化要见git上 mkv转码电影脚本 ECHO OFF REM 以下参数不可乱填 SET FFMPEG%~DP0\ffmpeg.exe ::------------------------------------------------------------------------------ CALL:PRO_LOOPDIR ::CALL:PRO_LOOPDIR_SU…...

SharedPreferences

Android轻量级数据存储 import android.content.Context; import android.content.SharedPreferences;public class SharedPreferencesUtil {private SharedPreferences sharedPreferences;private SharedPreferences.Editor editor;public SharedPreferencesUtil(Context con…...

服务(第二十五篇)redis的优化和持久化

持久化的功能&#xff1a;Redis是内存数据库&#xff0c;数据都是存储在内存中&#xff0c;为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失&#xff0c;需要定期将Redis中的数据以某种形式&#xff08;数据或命令&#xff09;从内存保存到硬盘&#xff1b;当下…...

David Silver Lecture 7: Policy Gradient

1 Introduction 1.1 Policy-Based Reinforcement Learning 1.2 Value-based and policy based RL 基于值的强化学习 在基于值的 RL 中&#xff0c;目标是找到一个最优的值函数&#xff0c;通常是 Q 函数或 V 函数。这些函数为给定的状态或状态-动作对分配一个值&#xff0c;表…...

知识图谱学习笔记——(五)知识图谱推理

一、知识学习 声明&#xff1a;知识学习中本文主体按照浙江大学陈华钧教授的《知识图谱》公开课讲义进行介绍&#xff0c;并个别地方加入了自己的注释和思考&#xff0c;希望大家尊重陈华钧教授的知识产权&#xff0c;在使用时加上出处。感谢陈华钧教授。 &#xff08;一&…...

用vs2010编译和调试多个arx版本的arx项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、一级标题二级标题三级标题四级标题五级标题六级标题升级原先vs2008版本的项目文件到2010,或直接用vs2010新建一个arx项目; vs中查看项目属性:Project menu -> Properties,项目名上右…...

安全相关词汇

• DEW: Data Encryption Workshop • HSM: Hardware Security Module • KMS: Key Management System • KAM: Key Account Management • DHSM: Dedicated Hardware Security Module • KPS: Key Pair Service • CSMS: Cloud Secret Management Service • PCI-DSS: …...

最新入河排污口设置论证、水质影响预测与模拟、污水处理工艺分析及典型建设项目入河排污口方案报告书

随着水资源开发利用量不断增大&#xff0c;全国废污水排放量与日俱增&#xff0c;部分河段已远远超出水域纳污能力。近年来,部分沿岸入河排污口设置不合理&#xff0c;超标排污、未经同意私设排污口等问题逐步显现&#xff0c;已威胁到供水安全、水环境安全和水生态安全&#x…...

2023年认证杯二阶段C题数据合并python以及matlab多途径实现代码

对于每种心率下给出的数据&#xff0c;我们需要进行合并才能方便后续处理&#xff0c;这里为大家展示利用python以及matlab分别实现合并的代码 import pandas as pd import os# 创建一个空的DataFrame对象 merged_data pd.DataFrame()# 设置数据文件所在的文件夹路径 folder_…...

Win11校园网不弹出登录页面怎么回事?

Win11校园网不弹出登录页面怎么回事&#xff1f;最近有用户在使用校园网的时候遇到了一些问题&#xff0c;访问登录网站的时候&#xff0c;一直无法显示登录的界面。那么遇到这个情况如何去进行解决呢&#xff1f;一起来看看以下的解决方法分享吧。 解决方法如下&#xff1a; 方…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...