基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序

文章目录

  • 一、作品背景
  • 二、功能设计与实现过程
  • 三、实现基础功能
    • (一)、首先是要选材
    • (二)、原理图设计
    • (二)、第一版本PCB设计
    • (三)、焊接PCB板
    • (四)编写单片机程序
    • (五)下载程序验证
  • 四、外壳设计
    • (一)CAD图纸设计
    • (二)磨砂亚克力板
  • 五、重新设计PCB
  • 六、QT安卓APP设计
    • (一)界面设计
    • (二)QT程序设计
    • (三)APP功能设计

2021年10月27-2022年1月1日 可承接单片机设计,有意可添加Q2809786963

作品哔哩哔哩视频:https://www.bilibili.com/video/BV1Yb4y1a7AQ#reply5536921990
资料链接:
蓝牙彩灯v1.01资料链接:
CSDN:
https://download.csdn.net/download/mbs520/25149435
百度网盘:
https://pan.baidu.com/s/14Vout7Q2P6JBDZCCd8Gm6w
提取码:b7it

蓝牙彩灯v1.03资料链接:
https://download.csdn.net/download/mbs520/25150035
取走记得点赞~
有问题可以在评论区发表或者私信
在这里插入图片描述

一、作品背景

在智能的2021年代,年轻的小伙伴都患上了懒惰的症状,我也一样。
有一个难以入眠的夜晚,我打开了王者荣耀,我习惯了玩手机都要开着灯打,这样可以减少对眼睛的损伤,终于,赢了好几把,时间已经到了凌晨2点半,我也开始有了睡意,当我放下手机,准备闭眼入睡时,发现灯光格外耀眼,心烦意乱,实在不想按下那下床走好几步才能触碰到的开关,但是房间的设计就是这样,无法改变。无奈的我还是挣扎地下床按下了开关,这才安心入睡。
作为学电子专业的我并不妥协,我一定要设计一个不下床就可以关掉的灯。

二、功能设计与实现过程

(一)功能设计
1、可以用按键控制灯的亮灭、亮度以及切换颜色
2、可以用按键控制灯的6种以上显示样式
4、设计一个外壳,让它更加美观
5、设计一个手机APP,实现按键的所有功能以及能够调节灯的任意颜色
6、设计一个手机APP升级单片机程序功能,能够把单片机程序保存到某个版本的手机APP中,手机APP点击升级,就可以完成对单片机程序的升级。
(二)实现的过程
1、设计一个按键与单片机连接,编写多功能按键(单击、双击、长按)来控制灯的亮灭、亮度以及切换颜色以及6种以上显示样式

2、用CAD绘制一个与PCB大小合适的外壳,交给淘宝定制

3、用QT编写一个安卓APP,利用蓝牙模块与单片机进行通信,完成控制与升级的功能

三、实现基础功能

(一)、首先是要选材

1、LED选择:WS2812
既然是想做任意颜色的灯,那么毫无疑问选择最普遍的WS2812,24位全彩RGB彩灯,可以发出2^24=16777215种颜色。
在这里插入图片描述

2、单片机选择:STM32G0
在当今MCU那么稀贵的情况下,当然是要为自己的腰包考虑,WS2812的驱动时钟大概需要800KHZ,速度要求很高,首先选择stm32,看了一下价格,选择了和蔼可亲的stm32g030c8t6,6元还包邮
在这里插入图片描述
3、通信模块选择:蓝牙模块JDY-31
要手机控制灯,首先想到用蓝牙模块,价格考虑,选择全网最便宜的蓝牙模块JDY-31,比起HC-05,它更加小巧,就是连接速度不是很快
在这里插入图片描述

有了这3个主要材料,我们就可以开始设计一下原理图

(二)、原理图设计

1、单片机需要3.3V供电,首先设计一个电源部分,先用usb进行供电5V给ws2812,再用降压芯片降压到3.3V供给MCU,
在这里插入图片描述

2、设计一个单片机最小系统,以及预留一个下载接口,方便使用ST-LINK进行下载程序
在这里插入图片描述
3、然后要连接一个蓝牙和一个按键作为控制,再预留一个LED作为指示灯
在这里插入图片描述
4、RGB灯的电路设计,这里两组LED,用两个IO口控制,防止LED过多导致信号失真
在这里插入图片描述
这样一张原理图就设计好啦

(二)、第一版本PCB设计

1、根据原理图给定相应的封装导入PCB,再进行布局与布线,设计好一块给淘宝客服能够打印出来的PCB图纸
2D:
在这里插入图片描述

3D:
在这里插入图片描述
然后交给淘宝,这里推荐嘉立创,便宜,质量也高。
这是打印出来的第一板PCB:
在这里插入图片描述

(三)、焊接PCB板

1、打印出PCB之后,当然是要把元器件焊接到PCB板上,第一块板焊接的时候先不用一次性全部焊接上去,先焊接电源部分,看看电源芯片是否能够正常工作,比如我画的这块板子USB母座封装与原理图不对应,导致正负极直接反向,就很容易导致元器件损坏,检测完电压正常之后,再焊接其他元器件

在这里插入图片描述

(四)编写单片机程序

单片机程序包含了很多知识
1、轻量级多任务系统
2、蓝牙数据自定义控制协议、蓝牙无线升级单片机
3、多种控制方式按键+蓝牙
4、多功能按键,单击、双击、长按
5、ws2812串联控制
6、呼吸灯算法
7、颜色渐变算法

/****************************************
* 函数名称: DIS_TASK()
* 输入参数: 无
* 输出参数: 无
* 功    能: 显示任务
*
*****************************************/

void DIS_TASK(void)
{
	static u8 r=0,g=0,b=0,a=0,dir=0;
	static int i,cnt=0;
	static int color_rgb;
    SCHTaskBegin(); //开始固定格式一定要的
    while (1)
    {
		if(SysState.Dis_flag == 1)//可以更新显示
		{
					/***********************静态*******************************/
					if(SysState.Dismode == DisMode_Static)//静态
					{
						SysState.Dis_flag = 0;
						RGB_Refresh(SysState.StaticRgb,LED_NUM);//显示
						RGB2_Refresh(SysState.StaticRgb,LED_NUM);//显示
					}
					
					/***********************呼吸*******************************/
					else if(SysState.Dismode == DisMode_Breathe)//呼吸
					{
						SysState.Dedlay_Time=20;
						if(dir==0)
						{
							a += (1+a*10/0xff);
							if(a > 0xf0)dir = 1;
						}else if(dir)
						{
							a -= (1+a*10/0xff);
							if(a <= 4)dir = 0;
						}
						
						r = ((SysState.StaticRgb>>16)%0x100)*a/0xff;
						g = ((SysState.StaticRgb>>8)%0x100)*a/0xff;
						b = ((SysState.StaticRgb>>0)%0x100)*a/0xff;
						color_rgb = (r<<16) + (g<<8) + b;
						printf("%d %d %d %d\r\n",r,g,b,a);
						RGB_Refresh(color_rgb,LED_NUM);//显示
						RGB2_Refresh(color_rgb,LED_NUM);//显示
						SCHCurTaskDly(SysState.Dedlay_Time);
					}
					
					/***********************闪烁*******************************/
					else if(SysState.Dismode ==DisMode_Twinkle)//闪烁
					{
						SysState.Dedlay_Time=200;//*SysState.Dedlay_Ratio/0x0f;;
						RGB_Refresh(SysState.StaticRgb,LED_NUM);
						RGB2_Refresh(SysState.StaticRgb,LED_NUM);
						SCHCurTaskDly(SysState.Dedlay_Time);
						RGB_Refresh(0,LED_NUM);
						RGB2_Refresh(0,LED_NUM);
						SCHCurTaskDly(SysState.Dedlay_Time);
					}
					
					/***********************渐变*******************************/
					else if(SysState.Dismode ==DisMode_GraChange)//渐变
					{
						extern u8 GraChange_flag;
						SysState.Dedlay_Time=100;//*SysState.Dedlay_Ratio/0x0f;
						RgbAlg(&SysState.StaticRgb,&GraChange_flag);//渐变算法
						RGB_Refresh(SysState.StaticRgb,LED_NUM);//显示
						RGB2_Refresh(SysState.StaticRgb,LED_NUM);//显示
						SCHCurTaskDly(SysState.Dedlay_Time);
					}
					
					/***********************蹦迪*******************************/
					else if(SysState.Dismode == DisMode_DiscoDance)//蹦迪
					{
						SysState.Dedlay_Time=20;//*SysState.Dedlay_Ratio/0x0f;
						RGB_Refresh(Static_DisColor[cnt],LED_NUM);
						RGB2_Refresh(Static_DisColor[cnt],LED_NUM);
						SCHCurTaskDly(SysState.Dedlay_Time);
						RGB_Refresh(0,LED_NUM);
						RGB2_Refresh(0,LED_NUM);
						SCHCurTaskDly(SysState.Dedlay_Time*50);
					}
					
					/***********************流水*******************************/
					else if(SysState.Dismode == DisMode_RunWater)//流水
					{
						static int i=0,flag=0;
						SysState.Dedlay_Time=100;
						i++;
						if(i == LED_NUM)
						{
							i=0;flag=!flag;
						}
						if(flag){		//设置颜色		
							RGB_Refresh(SysState.StaticRgb,i+1);
							RGB2_Refresh(SysState.StaticRgb,i+1);
							SysState.Dedlay_Time=50;//*SysState.Dedlay_Ratio/0x0f;
							SCHCurTaskDly(SysState.Dedlay_Time);
						}
						else{		//灭
							RGB_Refresh(0,i+1);
							RGB2_Refresh(0,i+1);
							SysState.Dedlay_Time=50;//*SysState.Dedlay_Ratio/0x0f;
							SCHCurTaskDly(SysState.Dedlay_Time);
						}
						
					}
					
					/***********************用户*******************************/
					else if(SysState.Dismode ==DisMode_User1)  //用户
					{
						SysState.Dedlay_Time=1000;
						RGB_Refresh(SysState.StaticRgb,1);
						RGB2_Refresh(0,1);
						SCHCurTaskDly(SysState.Dedlay_Time);
						RGB2_Refresh(SysState.StaticRgb,1);
						RGB_Refresh(0,1);
						SCHCurTaskDly(SysState.Dedlay_Time);
					}
		}
		SCHCurTaskDly(10);
    }
    SCHTaskEnd();  //结束固定格式一定要的
}

(五)下载程序验证

下载程序后测试ws2812是否正常工作

四、外壳设计

(一)CAD图纸设计

感觉没有一个外壳会很难看,添加一个外壳,让世界变得美丽
在这里插入图片描述在这里插入图片描述

这中间的洞尺寸有误:5乘7改7乘7

在这里插入图片描述

(二)磨砂亚克力板

淘宝搜磨砂亚克力板定制,发送CAD图纸给师傅,就可以给你做了
这是做好的亚克力板,是按照PCB板尺寸量身定做的
在这里插入图片描述

五、重新设计PCB

重新布局设计出来第3版本成品板:PCBV1.3
在这里插入图片描述
这是打样后焊接好的样子:
在这里插入图片描述

六、QT安卓APP设计

(一)界面设计

在这里插入图片描述

(二)QT程序设计

展示部分代码:


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    this->Start_Init();
    this->File_Init();
    this->BuleTooth_Init();
    this->Label_Init();
    this->PushButton_Init();
    this->ColorSlider_Init();
    this->setFocus();
}

MainWindow::~MainWindow()
{
    bin_save(FileInfo);
    delete ui;
}

//起始代码
void MainWindow::Start_Init()
{
    //设置背景图片
    this->setStyleSheet("QMainWindow{border-image: url(:/pic/btmenuv2.jpg);}");
    //获取屏幕大小
    QScreen *screen = QApplication::screens().at(0);
    src_w = screen->size().width();
    src_h = screen->size().height();
    if(src_w <= 0  || src_h <= 0)
    {
        src_h = 2267;src_w = 1080;
        this->setGeometry(0,0,src_w,src_h);//1080   2267
        qDebug() << "src get err ======== "<< src_w <<src_h << endl;
    }
    else
    {
        this->setGeometry(0,0,src_w,src_h);//1080   2267
        qDebug() << "src get ok ======== "  << src_w <<src_h << endl;
    }

}

//蓝牙初始化
void MainWindow::BuleTooth_Init(void)
{
    //蓝牙连接初始化代码
    timer_conflag = new QTimer;
    ptimer = new QTimer;
    //QBluetoothDeviceDiscoveryAgent 这个是指扫描周围蓝牙设备!
    discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
    //QBluetoothLocalDevice 是指配置获取设备的蓝牙状态信息等!
    localDevice = new QBluetoothLocalDevice();
    //QBluetoothSocket指进行链接蓝牙设备,读写信息!
    socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);

    //多窗口初始化
    btcwindow = new BTMainWindow(this);
    btcwindow->hide();
    aboutwindow = new AboutMainWindow(this);
    aboutwindow->hide();

    connect(socket,
           SIGNAL(readyRead()),
           this,
           SLOT(readBluetoothDataEvent())
           );
    connect(socket,
           SIGNAL(connected()),
           this,
           SLOT(bluetoothConnectedEvent())
           );
    connect(socket,
           SIGNAL(disconnected()),
           this,
           SLOT(bluetoothDisconnectedEvent())
           );

    localDevice->powerOn();//打开蓝牙
    discoveryAgent->start();//开始扫描
}




//颜色条初始化
void MainWindow::ColorSlider_Init(void)
{
    QColor color;
    color.setRgb(0x00,0x00,0x00);
    colorslider_R = new ColorSlider(this);
    colorslider_G = new ColorSlider(this);
    colorslider_B = new ColorSlider(this);
    colorslider_A = new ColorSlider(this);

    colorslider_R->init(ColorSlider::RGB,ColorSlider::RED,color,0x00,0xFF);qDebug() << color << endl;
    colorslider_G->init(ColorSlider::RGB,ColorSlider::GREEN,color,0x00,0xff);qDebug() << color << endl;
    colorslider_B->init(ColorSlider::RGB,ColorSlider::BLUE,color,0x00,0xff);qDebug() << color << endl;
    colorslider_A->init(ColorSlider::RGB,ColorSlider::ALPHA,color,0x00,0xff);qDebug() << color << endl;

    colorslider_R->setGeometry(100,200,880,60);
    colorslider_G->setGeometry(100,400,880,60);
    colorslider_B->setGeometry(100,600,880,60);
    colorslider_A->setGeometry(100,800,880,60);
}
//按钮初始化
void MainWindow::PushButton_Init(void)
{
    //刷新定时器
    static QColor last_Color;
    time1= new QTimer(this);
    time1->start(1000);
    connect(time1,&QTimer::timeout,[=](){

       time1->start(100);
       if(Connect_Flag == 1)//连接指示
       {
           Connect_Flag = 0;
           btcwindow->hide();
           this->show();
           QMessageBox::information(this,tr("提示"),tr("蓝牙连接成功!"));

           QByteArray arrayData;    //发送空指令
           QString s = QString("NONE\r\n");
           qDebug() << s << endl;
           arrayData = s.toUtf8();
           socket->write(arrayData);
           s.clear();
           arrayData.clear();
       }
       if(last_Color != Color_sum)//发送指令
       {
           update();//更新
           unsigned int color_d =   ((Color_sum.alpha()/16)<<24)+(Color_sum.red()<<16) + (Color_sum.green()<<8)
                         + (Color_sum.blue()<<0) ;
           QByteArray arrayData;
           QString s = QString("COLOR:%1\r\n").arg(color_d);
           qDebug() << s << endl;
           arrayData = s.toUtf8();
           socket->write(arrayData);
           s.clear();
           arrayData.clear();
       }
       last_Color = Color_sum;

    });
    //色块按钮
    // QPushButton *phbutton[10];
    for(int i=0; i<10; i++)
    {
        int r,g,b;
        r = FileInfo->color_tab[i]>>16;
        g = (FileInfo->color_tab[i]>>8)%256;
        b = FileInfo->color_tab[i]%256;
        phbutton[i] = new QPushButton(this);
        if(i<5)phbutton[i]->setGeometry(90+i*200*src_w/1080,1600*src_h/2267,100*src_w/1080,100*src_h/2267);
        else if(i>=5)phbutton[i]->setGeometry(90+(i-5)*200*src_w/1080,1800*src_h/2267,100*src_w/1080,100*src_h/2267);
        QString s = QString("background-color: rgb(%1, %2, %3);").arg(r).arg(g).arg(b);
        phbutton[i]->setStyleSheet(s);
        phbutton[i]->setWindowFlags(Qt::WindowStaysOnTopHint);
        connect( phbutton[i],&myPushButton::clicked,[=](){
            int r,g,b;
            if(SaveColorFlag != 0)
            {
                r = Color_sum.red();
                g = Color_sum.green();
                b = Color_sum.blue();
                SaveColorFlag = 0;
                update();
                FileInfo->color_tab[i] = (r<<16)+(g<<8)+b;
                QString s = QString("background-color: rgb(%1, %2, %3);").arg(r).arg(g).arg(b);
                phbutton[i]->setStyleSheet(s);
            }
            else
            {
                r = FileInfo->color_tab[i]>>16;
                g = (FileInfo->color_tab[i]>>8)%256;
                b = FileInfo->color_tab[i]%256;
                Color_sum.setRgb(r,g,b,Color_sum.alpha());
                ColorSlider_paint_Flag = 2;
            }
        });
    }

(三)APP功能设计

1、主界面功能

按钮功能说明
连接按钮进入蓝牙连接界面/双击连接设备
关于按钮进入软件介绍/升级MCU界面
红色滑动条调节红色色彩
绿色滑动条调节绿色色彩
蓝色滑动条调节蓝色色彩
灰白滑动条调节总体亮度
颜色预览球预览当前显示颜色
颜色快捷显示单击可以显示按钮颜色
显示模式显示模式切换
底部信息显示显示接收到的信息/欢迎信息
连接信息显示显示当前连接状态

先点颜色预览球,会出现保存选择框,
再点击颜色选择按钮,即可保存当前调节好的颜色在这里插入图片描述

2、蓝牙连接界面

按钮功能说明
设备连接选择双击连接设备
返回按钮返回主界面

1、连接成功自动返回主界面
2、自动连接功能:打开APP无需动作,自动找寻蓝牙彩灯设备自动连接,无需手动连接
在这里插入图片描述

3、关于界面

按钮功能说明
作者信息显示只读
返回按钮返回主界面
显示版本蓝牙彩灯应答信号 例如1.2版本闪红灯1次,绿灯两次
升级MCU连接好蓝牙,点击升级,可以使单片机软件升到当前版本,软件版本一样切勿反复升级,可能升级失败
升级进度条显示升级进度 单片机升级失败后需要进入升级模式重新升级,否则将无法正常使用。
在这里插入图片描述

4、升级代码提示

显示类型显示内容
升级失败蓝牙彩灯显示红色
升级成功蓝牙彩灯显示绿色
升级过程蓝牙彩灯显示淡蓝色进度

在这里插入图片描述

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

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

相关文章

作为自动化测试工程师,这4个自动化测试阶段你真的知道吗?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 阶段一&#xff1…

Kubernetes集群添加新集群节点

Kubernetes集群添加新集群节点 添加worker节点 参考文档https://gitee.com/open-hand/kubeadm-ha/blob/release-1.21/docs/02/%E6%B7%BB%E5%8A%A0%20worker%20%E8%8A%82%E7%82%B9.md 添加工作节点与集群安装时初始化工作节点一样,可以在主节点上执行&#xff0c;也可以在要加…

第四章 完型填空

第四章 完型填空 第一节 真题 2020-完型填空- Section I Use of English Directions&#xff1a; Read the following text. Choose the best word (s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Being a good parent is, of cour…

springboot 连接 kafka集群(kafka版本 2.13-3.4.0)

springboot 连接 kafka集群 一、环境搭建1.1 springboot 环境1.2 kafka 依赖 二、 kafka 配置类2.1 发布者2.1.1 配置2.1.2 构建发布者类2.1.3 发布消息 2.2 消费者2.2.1 配置2.2.2 构建消费者类2.2.3 进行消息消费 一、环境搭建 1.1 springboot 环境 JDK 11 Maven 3.8.x spr…

CSDN问答机器人

文章目录 前言一、背景二、总体流程三、构建知识库四、粗排五、精排六、Prompt总结相关博客 前言 先看结果: 已经连续很多周获得了第二名(万年老二), 上周终于拿了一回第一, 希望继续保持. &#x1f601; 这是今天的榜单, 采纳的数量相对较少, 之前基本上维持在100 重点说明…

SpringBoot项目实战:自定义异常和统一参数验证(附源码)

你好&#xff0c;我是田哥 在实际开发过程中&#xff0c;不可避免的是需要处理各种异常&#xff0c;异常处理方法随处可见&#xff0c;所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块&#xff0c;不仅会造成大量的冗余代码&#xff0c;而且还影响代码的可…

母婴商家怎么建立自己的品牌,母婴产品传播渠道总结

随着互联网的发展逐渐深入我们的生活&#xff0c;线上传播的模式也越来越被大家熟知。越来越多的行业开始重视线上传播。那么母婴商家怎么建立自己的品牌&#xff0c;母婴产品传播渠道总结。 其实&#xff0c;母婴产品线上用户群体众多&#xff0c;且母婴产品用户目的明确&…

深入解析IT专业分类、方向及就业前景:高考毕业生如何选择适合自己的IT专业?重点探索近年来人工智能专业发展及人才需求

目录 一、IT专业的就业前景和发展趋势二、了解IT专业的分类和方向三、你对本专业的看法和感想四、本专业对人能力素养的要求五、建议和思考其它资料下载 当今社会&#xff0c;信息技术行业以其迅猛的发展和无限的潜力成为了吸引无数年轻人的热门选择。特别是对于高考毕业生来说…

你的企业还没搭建这个帮助中心网页,那你太落后了!

作为现代企业&#xff0c;拥有一个完善的帮助中心网页已经成为了不可或缺的一部分。帮助中心网页不仅可以提供给用户有关产品或服务的详细信息&#xff0c;还可以解答用户的疑问和提供技术支持&#xff0c;使用户在使用产品或服务时遇到问题可以很快地得到解决。因此&#xff0…

论文阅读和分析:Binary CorNET Accelerator for HR Estimation From Wrist-PPG

主要贡献&#xff1a; 一种完全二值化网络(bCorNET)拓扑结构及其相应的算法-架构映射和高效实现。对CorNET进行量化后&#xff0c;减少计算量&#xff0c;又能实现减轻运动伪影的效果。 该框架在22个IEEE SPC受试者上的MAE为6.675.49 bpm。该设计采用ST65 nm技术框架&#xff…

数据结构--队列2--双端队列--java双端队列

介绍 双端队列&#xff0c;和前面学的队列和栈的区别在于双端队列2端都可以进行增删&#xff0c;其他2个都是只能一端可以增/删。 实现 链表 因为2端都需要可以操作所以我们使用双向链表 我们也需要一共头节点 所以节点设置 static class Node<E>{E value;Node<E…

jetpack compose —— Card

jetpack compose Card 组件提供了一种简单而强大的方式来呈现卡片式的用户界面。 一、什么是 Card 组件 二、基本用法 三、属性和修饰符 四、嵌套使用和复杂布局 一、什么是 Card 组件 Card 是 Jetpack Compose 中的一个常用组件&#xff0c;用于呈现卡片式的用户界面。它…

Javaweb学习路线(3)——SpringBoot入门、HTTP协议与Tomcat服务器

一、SpringBoot入门 &#xff08;一&#xff09;第一个Springboot案例 1、创建Springboot工程&#xff0c;添加依赖。 2、定义类&#xff0c;添加方法并添加注释 3、运行测试。 pom.xml&#xff08;框架自动生成&#xff09; <?xml version"1.0" encoding&quo…

不同等级的Pads工程师,薪资差距有多大?

作为一种广泛应用在PCB设计的EDA工具&#xff0c;Pads软件在中国的电子设计行业中有着重要地位&#xff0c;尤其是不同等级的Pads工程师&#xff0c;在薪资、工作范围等有很大的差异&#xff0c;本文将从中国出发&#xff0c;多方面分析对比不同等级的Pads工程师&#xff0c;希…

24个Jvm面试题总结及答案

1.什么是Java虚拟机&#xff1f;为什么Java被称作是“平台无关的编程语言”&#xff1f; Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台&#xff0c;而不需要程序员为每…

【VMware】虚拟机安装centos7

目录 一、创建虚拟机 1、自定义 2、选择需要安装的操作系统 3、选择虚拟机安装位置 4、选择处理器配置&#xff08;可先默认&#xff09; 5、设置虚拟内存&#xff08;一般4096&#xff09; 6、选择网络连接方式 7、选择I/O控制器 8、选择磁盘类型 9、选择磁盘 10、指定磁盘容…

国内云服务器全面对比

想要领取优惠券购买云服务可以前往我的云服务器领券购买。 经过疫情三年&#xff0c;大多行业开始复苏&#xff0c;企业开始布局以后得发展&#xff0c;云服务器作为企业发展几乎是必须的&#xff0c;一个企业从无到有&#xff0c;要经历很多&#xff0c;比如企业官网搭建&…

解密混沌工程——混沌工程价值

在数字化转型、十四五规划的大背景 下&#xff0c;大规模上云、分布式的核心改造等“云化”逐渐走进企业。 但是&#xff0c;云化的发展&#xff0c;使企业系统的复杂度呈指数级增长&#xff0c;故障越来越多。 企业在数字化转型中拥抱云计算、 信创国产化、分布式核心等新技…

DVWA-Command Injection

大约 命令注入攻击的目的是在易受攻击的应用程序中注入和执行攻击者指定的命令。 在这种情况下&#xff0c;执行不需要的系统命令的应用程序就像一个伪系统外壳&#xff0c;攻击者可能会使用它 作为任何授权的系统用户。但是&#xff0c;命令的执行权限和环境与 Web 服务具有的…

JVM 调优分析 如何进行JVM调优

文章目录 1.为什么需要进行JVM调优&#xff1f;2.什么情况下可能需要JVM调优3.JVM调优参数4.JVM调优参数设置参考5.JVM内部结构1. 类加载器&#xff08;Class Loader&#xff09;2. 运行时数据区&#xff08;Runtime Data Area&#xff09;3. 垃圾收集器&#xff08;Garbage Co…