基于STM32的摇杆开关控制小恐龙游戏(附源码)

文章目录

  • 一、 前言
    • 谷歌小恐龙
  • 二、硬件
  • 三、软件
    • 3.1 摇杆开关
    • 3.2 OLED屏幕
  • 四、展示
  • 五、总结


一、 前言

最近有看到别人在OLED屏幕上玩小恐龙,所幸查阅下资料,并下好源码。可惜他的源码的主控是STM32F103ZET6,用的是STM32CubeIDE,采用的是HAL库编写。我目前手头上并没有该主控的开发板,只能自己手动移植到STM32F103C8T6上,觉得用按键来操作小恐龙跳跃不是很舒服,所以自己改用摇杆开关用遥控向上来进行跳跃,更顺手些。

谷歌小恐龙

谷歌小恐龙是指谷歌 Chrome 浏览器中的一个小游戏,通常出现在没有网络连接时的页面(称为“无网页游戏”或“离线游戏”)。这款游戏名为“恐龙跳跃”(T-Rex Runner),玩家需要控制一只恐龙跳过障碍物,随着游戏时间的推移,速度会逐渐加快,挑战也会变得更大。

在这里插入图片描述

在这里插入图片描述

谷歌小恐龙游戏在线玩


二、硬件

老样子,用面板上搭建一个简单的实验环境。

共需要一块最小系统板,一个0.96寸的OLED显示屏(IIC驱动)和一个摇杆开关。

硬件相对比较简单,很容易实现,感兴趣的可以试下。

引脚连接:(如需更改,直接修改对应.h文件里面的宏定义)

摇杆开关X输出:PB0
摇杆开关Y输出:PB1
摇杆开关按键:PB10
OLED显示屏SCL:PA0
OLED显示屏SDA:PA1

在这里插入图片描述

对摇杆开关不了解的可以看下摇杆开关的简单应用

对OLED不了解的可以看下0.96寸OLED(IIC接口)显示屏的图像显示应用

在这里插入图片描述

三、软件

3.1 摇杆开关

这里的ADCX和ADCY的引脚要是ADC引脚,还要看一下具体的DMA通道。至于下面那个按键就是摇杆开关的SW开关引脚了,任意引脚即可。

/* Defines ------------------------------------------------------------------*/
#define Rocker_GPIO_RCC   RCC_APB2Periph_GPIOB
#define Rocker_GPIO_Port  GPIOB
#define ADCX_Pin          GPIO_Pin_0
#define ADCY_Pin          GPIO_Pin_1#define Key_GPIO_RCC      RCC_APB2Periph_GPIOB
#define Key_GPIO_Port     GPIOB
#define Key_Pin           GPIO_Pin_10//根据实际的引脚修改/* Variables Define ---------------------------------------------------------*/
uint16_t conv_val[4] = {0};float LeftTwoAxisKey_X = 0;
float LeftTwoAxisKey_Y = 0;
/* Function prototypes ------------------------------------------------------*/
/******************************************************************************** 函数名:User_Rocker_Init* 描述  :摇杆开关相关变量初始化* 输入  :void* 输出  :void* 调用  :初始化* 备注  :*******************************************************************************/
void User_Rocker_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(Rocker_GPIO_RCC, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);GPIO_InitStructure.GPIO_Pin = ADCX_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(Rocker_GPIO_Port, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = ADCY_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(Rocker_GPIO_Port, &GPIO_InitStructure);DMA_DeInit(DMA1_Channel1);									   // 将DMA的通道1寄存器重设为缺省值DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(ADC1->DR)); // 外设基址为:ADC 数据寄存器地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)conv_val;		   // 存储器地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;			   // 数据源来自外设// 缓冲区大小,应该等于数据目的地的大小DMA_InitStructure.DMA_BufferSize = 4;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;			// 外设寄存器只有一个,地址不用递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;						// 存储器地址递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据大小为半字,即两个字节DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;			// 内存数据大小也为半字,跟外设数据大小相同DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;								// 循环传输模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;							// DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;								// 禁止存储器到存储器模式,因为是从外设到存储器DMA_Init(DMA1_Channel1, &DMA_InitStructure);								// 初始化DMADMA_Cmd(DMA1_Channel1, ENABLE);												// 使能 DMA 通道ADC_DeInit(ADC1); // ADC1复位ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = ENABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 2;ADC_Init(ADC1, &ADC_InitStructure);RCC_ADCCLKConfig(RCC_PCLK2_Div8);// 配置ADC 通道的转换顺序和采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_55Cycles5);ADC_DMACmd(ADC1, ENABLE);ADC_Cmd(ADC1, ENABLE);		// 使能adc1ADC_ResetCalibration(ADC1); // 复位ADC1校准while (ADC_GetResetCalibrationStatus(ADC1));						// 等待ADC1复位校准结束ADC_StartCalibration(ADC1); // 开启ADC1校准while (ADC_GetCalibrationStatus(ADC1)); // 等待ADC1校准结束ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}/******************************************************************************** 函数名:Key_Init* 描述  :按键初始化* 输入  :void* 输出  :void* 调用  :初始化* 备注  :*******************************************************************************/
void User_Key_Init(void)
{/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启LED相关的GPIO外设时钟*/RCC_APB2PeriphClockCmd(Key_GPIO_RCC, ENABLE);/*设置引脚模式为上拉输入*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;/*选择要控制的GPIO引脚*/GPIO_InitStructure.GPIO_Pin = Key_Pin;/*调用库函数,初始化GPIO*/GPIO_Init(Key_GPIO_Port, &GPIO_InitStructure);
}/******************************************************************************** 函数名:Key_IN_Read* 描述  :Key输入模式读取引脚状态* 输入  :void* 输出  :uint8_t* 调用  :初始化* 备注  :*******************************************************************************/
uint8_t Key_IN_Read(void)
{return GPIO_ReadInputDataBit(Key_GPIO_Port, Key_Pin);
}/******************************************************************************** 函数名:Rocker_Scan* 描述  :摇杆开关扫描* 输入  :void* 输出  :void* 调用  :内部调用* 备注  :*******************************************************************************/
int Rocker_Scan(void)
{LeftTwoAxisKey_X = conv_val[0] * 3.3 / 4096;LeftTwoAxisKey_Y = conv_val[1] * 3.3 / 4096;//	printf("LeftTwoAxisKey_X=%f  LeftTwoAxisKey_Y=%f\r\n",LeftTwoAxisKey_X,LeftTwoAxisKey_Y);/*********************判断摇杆开关方向****************************/if ((LeftTwoAxisKey_X > 1) && (LeftTwoAxisKey_Y < 1)){//       printf("Up \r\n");return 1;}if ((LeftTwoAxisKey_X > 1) && (LeftTwoAxisKey_Y > 2)){//        printf("Down \r\n");}/*********************判断摇杆按键是否按下****************************/if (Key_IN_Read()){delay_syms(2);if (Key_IN_Read()){return 2;}}return 0;
}

3.2 OLED屏幕

#define IIC_GPIO_Port GPIOA
#define SDA_Pin       GPIO_Pin_1
#define SCL_Pin       GPIO_Pin_0//根据实际的引脚修改#define OLED_SCLK_Clr() GPIO_ResetBits(IIC_GPIO_Port,SCL_Pin)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(IIC_GPIO_Port,SCL_Pin)#define OLED_SDIN_Clr() GPIO_ResetBits(IIC_GPIO_Port,SDA_Pin)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(IIC_GPIO_Port,SDA_Pin)//初始化SSD1306
void OLED_Init(void)
{IIC_Init();//IIC引脚初始化delay_syms(500);OLED_WR_Byte(0xAE,OLED_CMD);//--display offOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line addressOLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128OLED_WR_Byte(0xA1,OLED_CMD);//set segment remapOLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan directionOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);//OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);//OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled paneldelay_syms(500);OLED_FillPicture(0x0);
}//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{uint8_t i,n;for(i=0;i<8;i++){OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);} //更新显示
}// 绘制重启
void OLED_DrawRestart()
{unsigned int j=0;unsigned char x, y;unsigned char byte;//OLED_SetPos(0, 0);for (y = 2; y < 5; y++){OLED_SetPos(52, y);IIC_Start();IIC_WriteByte(0x78);IIC_WaitAck();IIC_WriteByte(0x40);IIC_WaitAck();for (x = 0; x < 24; x++){byte = RESTART[j++];IIC_WriteByte(byte);IIC_WaitAck();}IIC_Stop();}OLED_ShowString(10, 3, "GAME", 16);OLED_ShowString(86, 3, "OVER", 16);
}// 绘制小恐龙
void OLED_DrawDino()
{static unsigned char dino_dir = 0;unsigned int j=0;unsigned char x, y;unsigned char byte;dino_dir++;dino_dir = dino_dir%2;for(y=0; y<2; y++){OLED_SetPos(16, 6+y);IIC_Start();IIC_WriteByte(0x78);IIC_WaitAck();IIC_WriteByte(0x40);IIC_WaitAck();for (x = 0; x < 16; x++){j = y*16 + x;byte = DINO[dino_dir][j];IIC_WriteByte(byte);IIC_WaitAck();}IIC_Stop();}
}// 绘制跳跃小恐龙
int OLED_DrawDinoJump(char reset)
{char speed_arr[] = {1, 1, 3, 3, 4, 4, 5, 6, 7};static char speed_idx = sizeof(speed_arr)-1;static int height = 0;static char dir = 0;//char speed = 4;unsigned int j=0;unsigned char x, y;char offset = 0;unsigned char byte;if(reset == 1){height = 0;dir = 0;speed_idx = sizeof(speed_arr)-1;return 0;}if (dir==0){height += speed_arr[speed_idx];speed_idx --;if (speed_idx<0) speed_idx = 0;}if (dir==1){height -= speed_arr[speed_idx];speed_idx ++;if (speed_idx>sizeof(speed_arr)-1) speed_idx = sizeof(speed_arr)-1;}if(height >= 31){dir = 1;height = 31;}if(height <= 0){dir = 0;height = 0;}if(height <= 7) offset = 0;else if(height <= 15) offset = 1;else if(height <= 23) offset = 2;else if(height <= 31) offset = 3;else offset = 4;for(y=0; y<3; y++) // 4{OLED_SetPos(16, 5- offset + y);IIC_Start();IIC_WriteByte(0x78);IIC_WaitAck();IIC_WriteByte(0x40);IIC_WaitAck();for (x = 0; x < 16; x++) // 32{j = y*16 + x; // 32byte = DINO_JUMP[height%8][j];IIC_WriteByte(byte);IIC_WaitAck();}IIC_Stop();}if (dir == 0) oled_drawbmp_block_clear(16, 8- offset, 16);if (dir == 1) oled_drawbmp_block_clear(16, 4- offset, 16);return height;
}// 绘制随机出现的仙人掌障碍物
int OLED_DrawCactusRandom(unsigned char ver, unsigned char reset)
{char speed = 5;static int pos = 128;int start_x = 0;int length = 0;unsigned int i=0, j=0;unsigned char x, y;unsigned char byte;if (reset == 1){pos = 128;oled_drawbmp_block_clear(0, 6, speed);return 128;}if (ver == 0) length = 8; //sizeof(CACTUS_1) / 2;else if (ver == 1) length = 16; //sizeof(CACTUS_2) / 2;else if (ver == 2 || ver == 3) length = 24;for(y=0; y<2; y++){if(pos < 0){start_x = -pos;OLED_SetPos(0, 6+y);}else{OLED_SetPos(pos, 6+y);}IIC_Start();IIC_WriteByte(0x78);IIC_WaitAck();IIC_WriteByte(0x40);IIC_WaitAck();for (x = start_x; x < length; x++){if (pos + x > 127) break;j = y*length + x;if (ver == 0) byte = CACTUS_1[j];else if (ver == 1) byte = CACTUS_2[j];else if(ver == 2) byte = CACTUS_3[j];else byte = CACTUS_4[j];IIC_WriteByte(byte);IIC_WaitAck();}IIC_Stop();}oled_drawbmp_block_clear(pos + length, 6, speed);pos = pos - speed;return pos + speed;
}// 绘制云朵
void OLED_DrawCloud()
{static int pos = 128;static char height=0;char speed = 3;unsigned int i=0;int x;int start_x = 0;int length = sizeof(CLOUD);unsigned char byte;//if (pos + length <= -speed) pos = 128;if (pos + length <= -speed){pos = 128;height = rand()%3;}if(pos < 0){start_x = -pos;OLED_SetPos(0, 1+height);}else{OLED_SetPos(pos, 1+height);}IIC_Start();IIC_WriteByte(0x78);IIC_WaitAck();IIC_WriteByte(0x40);IIC_WaitAck();for (x = start_x; x < length + speed; x++){if (pos + x > 127) break;if (x < length) byte = CLOUD[x];else byte = 0x0;IIC_WriteByte(byte);IIC_WaitAck();}IIC_Stop();pos = pos - speed;
}

四、展示

大概是下面这样子,如果觉得速度有点慢或者快,修改cur_speed 的值,也就是修改score/XX,改XX的大小。

cur_speed = score/20;
if (cur_speed > 29) cur_speed = 29;
delay_syms(30 - cur_speed);

屏闪的问题是手机相机拍摄的问题。实物是没问题的。

基于STM32和OLED的小恐龙游戏项目(摇杆开关控制)


五、总结

今天主要讲了基于STM32的摇杆开关控制小恐龙游戏,主要将原有的按键方式修改为摇杆控制。

感谢你的观看!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3学习day04-provide和inject、defineOptions、defineModel、Pinia、pinia持久化

15、provide和inject &#xff08;1&#xff09;作用&#xff1a;顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 &#xff08;2&#xff09;语法&#xff1a; 1&#xff09;顶层组件通过provide函数提供数据 2&#xff09;底层函数提供inject获取数据…

AR眼镜:重型机械维修保养新利器

重型机械作为工业与建设领域的重要支柱&#xff0c;其稳定运行直接影响效率与成本。然而在偏远地区&#xff0c;面临复杂故障和高昂维修成本&#xff0c;传统维修方式常显得力不从心。如今&#xff0c;安宝特的AR远程协助解决方案结合Vuzix AR眼镜&#xff0c;正悄然改变这一现…

常见八股面试题:Dubbo 和 Spring Cloud Gateway 有什么区别?

大家好&#xff0c;我是鸭鸭&#xff01; 此答案节选自鸭鸭最近弄的面试刷题神器面试鸭&#xff0c;更多大厂常问面试题&#xff0c;可以点击进行阅读哈&#xff01; 目前这个面试刷题神器刚出&#xff0c;有网页和小程序双端可以阅读&#xff01; 回归面试题&#xff01; …

【每日刷题】Day96

【每日刷题】Day96 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCP 44. 开幕式焰火 - 力扣&#xff08;LeetCode&#xff09; 2. 1022. 从根到叶的二进制数之和 - …

栈和队列(数据结构)

1. 栈(Stack) 1.1 概念 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原…

Pytorch-张量的创建

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 简介&#xff1a; 一个Python深度学习框架&#xff0c;它将数据封装成张量&#xff08;Tensor&#xff09;进行处理&#xff0c;Python中的张量就是元素为同一种数据类型的多维…

算法训练,项目

一.木材加工 题解&#xff1a; 二分答案&#xff0c;左边0&#xff0c;右边可以为最长的木头&#xff0c;但我直接赋值了一个很大的值&#xff0c;进行二分&#xff0c;随后写个check;内部遍历木头截取为mid木块的个数&#xff0c;要是>k&#xff0c;满足要求&#xff0c;还…

开源免费的海报设计器vue-fabric-editor

vue-fabric-editor 是一个基于 Vue.js 和 Fabric.js 的创新前端富文本编辑器&#xff0c;它将传统的文本输入体验与图形设计元素相结合&#xff0c;为用户提供了全新的内容创作方式。 以下是关于 vue-fabric-editor 的详细介绍&#xff1a; 一、技术特点 框架结合&#xff1a;…

快速掌握Vue:基础命令详解

1. Vue概述 Vue.js&#xff08;读音 /vjuː/, 类似于 「view」&#xff09; 是一套构建用户界面的 「渐进式框架」。与其他重量级框架不同的是&#xff0c;Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层&#xff0c;并且非常容易学习&#xff0c;非常容易与其它库…

在Visual Studio/Qt Creator 中使用CMake安装和使用vcpkg包

文章目录 0. vcpkg简介和安装0.1 vcpkg简介0.2 vcpkg安装0.2.1 如何在Visual Studio 2022以及以上版本中安装vcpkg0.2.2 在其他VS版本或Qt Creator等平台上中安装vcpkg 1. 在Visual Studio 中使用CMake安装和使用vcpkg包1.1 创建Visual Studio项目1.2 设置项目文件a. 配置CMake…

FLUX.1 实测,堪比 Midjourney 的开源 AI 绘画模型,无需本地显卡,带你免费实战

要列举 AI 绘画开源界的几个关键贡献&#xff0c;一定少不了 Stable Diffusion。 还记否前不久刚推出的 Stable Diffusion 3&#xff1f; 其背后的团队 Stability AI&#xff0c;真的是一波三折&#xff0c;其核心成员出走&#xff0c;成立了一个新公司&#xff1a;Black For…

【Hot100】LeetCode—41. 缺失的第一个正数

原题链接&#xff1a;41. 缺失的第一个正数 1- 思路 手动实现哈希的方式 1- 遍历数组&#xff1a;如果当前的元素落在了 [1,N] 区间内&#xff0c;则 i 元素 赋值在 i-1 的位置上 比如对于数字 1 落在 数组 [0] 的位置 2- 判断条件 利用 while 加条件 ①当前元素落在了 [1,N]…

LVS(Linux virual server)

一&#xff1a;环境准备&#xff1a; rhel9 软件&#xff1a;httpd&#xff0c; ipvsadm 四台纯净的rhel9机子&#xff1a;一台LVS调度设备&#xff08;双网卡&#xff09;&#xff0c;两台webserver&#xff08;单网卡仅主机&#xff09;&#xff0c;一台客户机 DR模式多…

夏天猫毛满天飞?别怕一篇文章教你空气净化器怎么选

家里猫实在太多&#xff0c;3只短毛加上2只长毛&#xff0c;简直就是行走的蒲公英。夏天一到&#xff0c;猫咪的毛发便开始肆意飞舞&#xff0c;这对爱猫人士来说无疑是个烦恼。自从养猫以后&#xff0c;已经养成了每天都打扫卫生的习惯&#xff0c;吸尘器、扫地机必不可少&…

四种推荐算法——Embedding+MLP、WideDeep、DeepFM、NeuralCF

一、EmbeddingMLP模型 EmbeddingMLP 主要是由 Embedding 部分和 MLP 部分这两部分组成&#xff0c;使用 Embedding 层是为了将类别型特征转换成 Embedding 向量&#xff0c;MLP 部分是通过多层神经网络拟合优化目标。——用于广告推荐。 Feature层即输入特征层&#xff0c;是模…

【MySQL】全面剖析索引失效、回表查询与索引下推

1.索引失效的情况 以tb_user表举例&#xff0c;id为主键索引、name和phone字段上建立了一个普通索引&#xff0c;name和phone均为varchar类型。 索引列运算 当在 WHERE 子句或 JOIN 子句中对列使用函数或表达式时&#xff0c;索引会失效。 执行以下语句&#xff0c;可以发现执…

STM32-门电路-储存器-寄存器-STM32f1-MCU-GPIO-总线-keil5-点led

1、门电路 门电路组成简单加法器&#xff1a; 二进制对电路的影响&#xff1a; 0和1代表无和有&#xff1b; 以下图例&#xff0c;演示与门&#xff1a;左1右1输出1&#xff1b; 电平标准&#xff1a;使用不同的电压表示数字0和1&#xff1b; 高电平&#xff1a;1&#xff1…

AI在医学领域:残差扩散模型预测特发性肺纤维化 (IPF)

关键词&#xff1a; IPF 进展预测、残差扩散模型、临床信息 特发性肺纤维化&#xff08;Idiopathic Pulmonary Fibrosis&#xff0c;IPF&#xff09;是一种严重且不可逆的肺部疾病&#xff0c;它会导致肺部组织出现瘢痕和增厚&#xff0c;从而引起呼吸困难。。及时对IPF进行治…

电子围栏报警系统的创新应用

在科技日新月异的今天&#xff0c;安全防护技术正以前所未有的速度发展&#xff0c;其中&#xff0c;电子围栏报警系统作为智能安防领域的佼佼者&#xff0c;正逐步成为各行各业守护安全的主要选择方案。这一创新技术的应用&#xff0c;不仅极大地提升了安全防护的效率和精准度…

24/8/7 算法笔记 支持向量机回归问题天猫双十一

import numpy as np from sklearn.svm import SVR import matplotlib.pyplot as plt X np.linspace(0,2*np.pi,50).reshape(-1,1) y np.sin(X) plt.scatter(X,y) 建模 线性核函数 svr SVR(kernel linear) svr.fit(X,y.ravel())#变成一维y_ svr.predict(X) plt.scatter(…