基于Arduino Uno的简易可视化操作界面设计

news2024/9/25 19:14:33

        Arduino UNO是基于ATmega328P的Arduino开发板。它有14个数字输入/输出引脚(其中6个可用于PWM输出)、6个模拟输入引脚,一个16 MHz的晶体振荡器,一个USB接口,一个DC接口,一个ICSP接口,一个复位按钮。Arduino一词意味着该款开发板可以使用Arduino官方和第三方库文件,简化开发流程,可以让我们在不了解单片机底层原理下对其进行充分开发,因此Arduino获得了众多初级开发者的喜爱。

一、总体设计

        本次项目采用模块化编程的设计方式,因为在实际设计中,我们利用状态者模式隔离不同模式下的功能操作,如下:

        程序整体设计思路来自于状态者模式,对于初学者并不友好,使用C++语言设计,参考代码如下:

#include "State.h"

//状态1,继承重写doThing
void StateCase1::doThing(CurState *s){
  //静态变量作为开关,防止重复创建对象
  static int count = 0;
  //进行开关判断,创建过就不再创建
  if(count == 0){
    s->getOled()->setLogo(new ServoP(s->getOled()));
    count = 1;                  
  }
  //按下1按键,滑动到2状态
  if(m_command == 1){
    delete s->getCase(); //回收状态管理者的此时指针
    s->setCase(new StateCase2); //new 一个新的状态,设置进去这里为2
    count = 0; //开关打开,方便下次跳转到这时创建对象
  }
  //按下1按键,滑动到3状态
  else if(m_command == 2){
    delete s->getCase(); //回收状态管理者的此时BaseCase指针
    s->setCase(new StateCase3); //new 一个新的状态,设置进去这里为3
    count = 0; //开关打开,方便下次跳转到这时创建对象
  }
  //5键为确定,跳转到状态5
  else if(m_command == 5){
    delete s->getCase(); //回收状态管理者的此时BaseCase指针
    s->setCase(new StateCase4); //new 一个新的状态,设置进去这里为3
    count = 0; //开关打开,方便下次跳转到这时创建对象 
  }
}

void StateCase2::doThing(CurState *s){
  //静态变量作为开关,放置重复创建对象
  static int count = 0;
  //进行开关判断,创建过就不再创建
  if(count == 0){
    s->getOled()->setLogo(new MusicP(s->getOled()));
    count = 1;
  }
  //按下1按键,滑动到1状态
  else if(m_command == 2){
    delete s->getCase(); //回收状态管理者的此时BaseCase指针
    s->setCase(new StateCase1); //new 一个新的状态,设置进去这里为1
    count = 0; //开关打开,方便下次跳转到这时创建对象 
  }  
  else if(m_command == 5){
    delete s->getCase(); //回收状态管理者的此时BaseCase指针
    s->setCase(new StateCase5); //new 一个新的状态,设置进去这里为5
    count = 0; //开关打开,方便下次跳转到这时创建对象 
  }
}

//以下状态剩余类推
void StateCase3::doThing(CurState *s){
  static int count = 0;
  if(count == 0){
    s->getOled()->setLogo(new ClockP(s->getOled()));
    count = 1;
  }
  if(m_command == 1){
    delete s->getCase();
    s->setCase(new StateCase1);
    count = 0;
  }
  else if(m_command == 5){
    delete s->getCase();
    s->setCase(new StateCase7);
    count = 0;
  }
}

void StateCase4::doThing(CurState *s){
  static int count = 0;
  static int angle=0;
  if(count == 0){
    s->getOled()->setLogo(new Servo_fun(s->getOled()));
    count = 1;
  }
  s->getOled()->printW(48, 32, 2, angle);
  if(m_command == 3){
    delete s->getCase();
    s->setCase(new StateCase1);
    angle = 0;
    s->getServo()->write(0);
    count = 0;
  }
  else if(m_command == 1){
    angle += 30;
    if(angle>180){
      angle = 180;
    }
    s->getServo()->write(angle);
  }
  else if(m_command == 2){
    angle -= 30;
    if(angle < 0){
      angle = 0;
    }
    s->getServo()->write(angle);
  }  
}

void StateCase5::doThing(CurState *s){
  static int count = 0;
  static int pos = 16;
  s->getOled()->printW(100, pos, 2, "*");
  if(count == 0){
    s->getOled()->setLogo(new Playlist(s->getOled()));
    count = 1;
  }  
  if(m_command == 3){
    delete s->getCase();
    s->setCase(new StateCase2);
    count = 0;
  }
  else if(m_command == 1){
    pos -= 16;
    if(pos<16){
      pos = 16;
    }
  }
  else if(m_command == 2){
    pos += 16;
    if(pos>32){
      pos = 32;
    }
  }
  else if(m_command == 5 && pos==16){
    delete s->getCase();
    s->setCase(new StateCase6);
    count = 0;    
  }
}

void StateCase6::doThing(CurState *s){
  static int count = 0;
  if(count == 0){
    s->getOled()->setLogo(new Playing(s->getOled()));
    count = 1;
  }
  s->getBuzzer()->on();
  if(m_command == 3){
    delete s->getCase();
    s->setCase(new StateCase5);
    s->getBuzzer()->off();
    count = 0;        
  }
}

void StateCase7::doThing(CurState *s){
  static int count = 0;
  static int Time_ms = 0, Time_s = 0;
  static int time_flag = 0;
  if(time_flag ==1){
    delay(10);
    Time_ms++;
    if(Time_ms >= 100){
      Time_ms = 0;
      Time_s++;
    }
  }
  s->getOled()->printW(48, 32, 2, Time_s);
  s->getOled()->printW(80, 32, 2, Time_ms);
  if(count == 0){
    s->getOled()->setLogo(new ClockCount(s->getOled()));
    count = 1;
  }  
  if(m_command == 3){
    delete s->getCase();
    s->setCase(new StateCase3);
    Time_ms = 0;
    Time_s = 0;
    time_flag = 0;
    count = 0;        
  }
  if(m_command == 5){
    time_flag = 1;
  }
  if(m_command == 2){
    time_flag = 0;
  }
}
#pragma once
#include "UiLogo.h"
#include "MyOledH.h"
#include <Servo.h>
#include "Buzzer.h"
#include <Arduino.h>

//提前声明,方便下面BaseCase类的声明
class CurState;

//定义基类并设置虚函数,由于setCommand都一样,这个就不重写
class BaseCase{
public:
  //获取指令,来源于状态管理者的set方法,而状态管理者来指令源于按键
  virtual void setCommand(int command){
    m_command = command;
  }
  virtual void doThing(CurState *s) = 0;
protected:
  int m_command;
};

//状态管理者
class CurState{
public:
  //各种set和get方法
  void setOled(MyOled *oled){
    m_oled = oled;
  }

  void setCase(BaseCase *Case){
    m_case = Case;
  }

  MyOled *getOled(void){
    return m_oled;
  }

  BaseCase *getCase(void){
    return m_case;
  }

  void setCommand(int command){
    m_case->setCommand(command);
  }

  void setServo(Servo *servo){
    m_servo = servo;
  }

  Servo *getServo(void){
    return m_servo;
  }

  void setBuzzer(Buzzer *buzzer){
    m_buzzer = buzzer;
  }

  Buzzer *getBuzzer(void){
    return m_buzzer;
  }

  //doThing调用m_case的doThing并将自身指针传入
  void doThing(void){
    m_case->doThing(this);
  }
private:
  //各种指针,方便m_case通过get方法获取进行操作。
  BaseCase *m_case;
  MyOled *m_oled;
  Servo *m_servo;
  Buzzer *m_buzzer;
};

//以下是7种状态的声明
class StateCase1: public BaseCase{
public:
  void doThing(CurState *s); 
};

class StateCase2: public BaseCase{
public:
  void doThing(CurState *s); 
};


class StateCase3: public BaseCase{
public:
  void doThing(CurState *s); 
};

class StateCase4: public BaseCase{
public:
  void doThing(CurState *s); 
};

class StateCase5: public BaseCase{
public:
  void doThing(CurState *s); 
};

class StateCase6: public BaseCase{
public:
  void doThing(CurState *s); 
};

class StateCase7: public BaseCase{
public:
  void doThing(CurState *s); 
};

        本次设计所使用的图形化界面,通过取字模的方式得到,参考如下:

#pragma once
#include <Arduino.h>
#include "MyOledH.h"

//各个图标获取到的16进制字模
static const unsigned char PROGMEM music_pic[] = 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFC,0x00,0x07,0xFF,0xFF,0xFC,0x00,0x04,0x00,0x00,0x04,
0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,
0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,
0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,
0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,
0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x04,
0x00,0x7C,0x00,0x00,0x04,0x00,0xFC,0x00,0x00,0x7C,0x00,0xFC,0x00,0x00,0xFC,0x00,0xF8,0x00,0x00,0xFC,0x00,0x70,0x00,0x00,
0xF8,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00};/*"未命名文件",0*/

static const unsigned char PROGMEM servo_pic[] = 
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,
0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x40,0x7C,0x02,0x00,0x00,0x00,
0x00,0x00,0x46,0xFE,0x02,0x00,0x00,0x00,0x00,0x00,0x43,0x81,0x82,0x00,0x00,0x00,0x00,0x00,0x42,0x3F,0xFF,0xFF,0xF8,0x00,
0x00,0x00,0x44,0x7F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x48,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x49,0xFF,0xFF,0xFF,0xFF,0x00,
0x00,0x00,0x49,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x48,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x44,0x7F,0xFF,0xFF,0xFC,0x00,
0x00,0x00,0x42,0x3F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x41,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0xFE,0x02,0x00,0x00,0x00,
0x00,0x00,0x40,0x7C,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,
0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,
0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x5F,0xFF,0xFA,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,
0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,
0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,
0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x0A,0x00,0x00,0x00,
0x00,0x00,0x5F,0xFF,0xFA,0x00,0x00,0x00,0x00,0x00,0x40,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x24,0x02,0x00,0x00,0x00,
0x00,0x00,0x40,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x40,0x3C,0x02,0x00,0x00,0x00,
0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x92,0x00,0x00,0x00,
0x00,0x00,0x46,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*"未命名文件",0*/


static const unsigned char PROGMEM clock_pic[] = 
{0x00,0x3F,0xFF,0xC0,0x00,0x00,0x40,0x00,0x20,0x00,0x00,0x80,0x00,0x10,0x00,0x01,0x00,0x00,0x08,0x00,0x02,0x00,0x00,0x04,
0x00,0x04,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x00,0x40,0x40,0x00,0x00,
0x00,0x20,0x80,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x10,0x80,0x00,
0x00,0x00,0x10,0x80,0x00,0x00,0x00,0x10,0x80,0x00,0xF8,0x00,0x10,0x80,0x00,0xFF,0xF8,0x10,0x80,0x00,0xFF,0xF8,0x10,0x80,
0x00,0xF8,0x00,0x10,0x80,0x00,0x20,0x00,0x10,0x80,0x00,0x20,0x00,0x10,0x80,0x00,0x20,0x00,0x10,0x80,0x00,0x20,0x00,0x10,
0x80,0x00,0x20,0x00,0x10,0x80,0x00,0x20,0x00,0x10,0x40,0x00,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x40,0x10,0x00,0x20,0x00,
0x80,0x08,0x00,0x20,0x01,0x00,0x04,0x00,0x20,0x02,0x00,0x02,0x00,0x20,0x04,0x00,0x01,0x00,0x00,0x08,0x00,0x00,0x80,0x00,
0x10,0x00,0x00,0x40,0x00,0x20,0x00,0x00,0x3F,0xFF,0xC0,0x00};/*"未命名文件",0*/

static const unsigned char PROGMEM cursor_u[] = 
{0x01,0x80,0x03,0xC0,0x07,0xE0,0x0F,0xF0,0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFF,0xFF,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,
0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0};/*"上箭头",0*/

static const unsigned char PROGMEM cursor_d[] = 
{0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0x07,0xE0,0xFF,0xFF,0x7F,0xFE,0x3F,0xFC,0x1F,0xF8,
0x0F,0xF0,0x07,0xE0,0x03,0xC0,0x01,0x80};/*"下箭头",0*/

//继承重写LogoPicture,形成很多子类,方便扩展,符合开放封闭原则

//音乐图标
class MusicP: public LogoPicture{
public:
  MusicP(MyOled *oled);
  ~MusicP(void);
  void showLogo(void);
private:
  MyOled *m_oled;
};

class ServoP: public LogoPicture{
public:
  ServoP(MyOled *oled);
  ~ServoP(void);
  void showLogo(void);
private:
  MyOled *m_oled;
};

//时钟图标
class ClockP: public LogoPicture{
public:
  ClockP(MyOled *oled);
  ~ClockP(void);
  void showLogo(void);
private:
  MyOled *m_oled;
};

//舵机图标
class Servo_fun: public LogoPicture{
public:
  Servo_fun(MyOled *oled);
  ~Servo_fun(void);
  void showLogo(void);
private:
  MyOled *m_oled;
};

//音乐播放界面
class Playlist: public LogoPicture{
public:
  Playlist(MyOled *oled);
  ~Playlist(void);
  void showLogo(void);
private:
  MyOled *m_oled;
};

//演奏中
class Playing: public LogoPicture{
public:
  Playing(MyOled *oled);
  ~Playing(void);
  void showLogo(void);
private:
  MyOled *m_oled;
};

//时钟计时界面
class ClockCount: public LogoPicture{
public:
  ClockCount(MyOled *oled);
  ~ClockCount(void);
  void showLogo(void);
private:
  MyOled *m_oled;
};

二、功能演示

        程序运行,我们可以看到图形化界面如下,可按上下进行功能切换:

      点击进入音乐界面,按上下按键可以调节舵机旋转角度,并且舵机跟着转动,如图:

        点击英语界面,选择第一个音乐,蜂鸣器鸣叫模拟音乐

        点击进入时钟界面,此时可以进行计时操作,如下:

三、设计总结

        本次设计使用Arduino IDE开发Arduino UNO,利用oled模块显示可视化界面,对应操作不同器件了,本次设计利用状态者模式进行设计,为程序的可扩展性提供了很大便利。

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

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

相关文章

完整gpt应用(自用)

qrc.py 把gpt_qrc.qrc转化成gpt_qrc.py pyrcc5 -o icons_rc.py icons.qrc <RCC><qresource prefix"img"><file>img/53.png</file><file>img/ai.png</file><file>img/关闭.png</file><file>img/最小化.png&l…

9.15 BFS中等 133 Clone Graph review 138 随机链表的复制

133 Clone Graph //错误代码class Solution { public:Node* cloneGraph(Node* node) {//邻接表、BFS---》类似于二叉树的层次遍历if(!node || !node->val) return node;//构造队列queue<Node*> prev;prev.push(node);//构造新的图结点列表vector<Node*> adjList…

ESP8266_MicroPython——ADC_PWM

MicroPython 文章目录 MicroPython前言一、ADC二、PWM 前言 这一节简单学习一下ACD和PWM 一、ADC ADC(analog to digital conversion) 模拟数字转换。意思就是将模拟信号转化成数字信号&#xff0c;由于单片机只能识别二级进制数字&#xff0c;所以外界模拟信号常常会通过 A…

OpenCV结构分析与形状描述符(22)计算图像中某个轮廓或区域的矩函数moments()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算一个多边形或光栅化形状直到三阶的所有矩。 该函数计算一个向量形状或光栅化形状直到三阶的矩。结果返回在 cv::Moments 结构中。 函数原型…

数据结构————二叉树基础知识(零基础包会的!)

今天带来数据结构二叉树的知识&#xff0c;保证大家不会离散数学或者没有数据结构基础&#xff0c;也能明明白白的。 一&#xff0c;树 1&#xff0c;树的结构 我们在了解什么是二叉树之前我们先了解下什么是树&#xff0c;树是一种非线性的数据结构&#xff0c;它是由n个节点…

Bootstrap 警告信息(Alerts)使用介绍

本章将讲解警告&#xff08;Alerts&#xff09;以及 Bootstrap 所提供的用于警告的 class。警告&#xff08;Alerts&#xff09;向用户提供了一种定义消息样式的方式。它们为典型的用户操作提供了上下文信息反馈。 您可以为警告框添加一个可选的关闭按钮。为了创建一个内联的可…

C# 实现二维数据数组导出到 Excel

目录 功能需求 范例运行环境 Excel DCOM 配置 设计实现 组件库引入 ​编辑​ 方法设计 生成二维数据数组 核心方法实现 调用示例 总结 功能需求 将数据库查询出来的数据导出并生成 Excel 文件&#xff0c;是项目中经常使用的一项功能。本文将介绍通过数据集生成二维…

基于TCP的网络计算器实现

目录 一. 重新理解协议 二. 序列化与反序列化 2.1 概念 2.2 重新理解 read、write、recv、send 和 tcp 为什么支持全双工 2.3 理解TCP面向字节流 三. 请求应答模块实现 3.1 添加与解析报头 3.2 定制协议&#xff1a; 3.3 Json 四. 计算模块实现…

字典转换(根据字典转换、根据id转换)

一、三种转换方式 翻译场景:序列化时候转换 适用类型: 字典type转中文用户id转用户名部门id转名称附件id转url路径1.1 根据另一个映射字段 翻译保存到此字段 根据创建者createBy的id,查询名称设置到 createName 1.2 直接根据此字段值翻译后替换此字段值 ossId 替换为 url …

医疗监测数据检测系统源码分享

医疗监测数据检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

vue3透传、注入

属性透传 传递给子组件时&#xff0c;没有被子组件消费的属性或事件&#xff0c;常见的如id、class 注意1 1.class、style是合并的&#xff0c;style中如果出现重复的样式&#xff0c;以透传属性为准2.id属性是以透传属性为准&#xff0c;其他情况透传属性名相同&#xff0c…

深度学习云服务器免费使用教程

#云服务器# #深度学习# #人工智能# #计算机视觉# 本文为各位学习深度学习的入门选手而创建&#xff0c;降低深度学习的入门门槛。 谷歌云服务器Colab&#xff1a; T4GPU。限额&#xff0c;需要科学上网&#xff0c;不能使用终端。 谷歌云服务器地址&#xff1a;欢迎使用 C…

C语言 | Leetcode C语言题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; char * toHex(int num){int i0;char *nums(char*)malloc(sizeof(char)*32);unsigned int newnum(unsigned int)num;if(num0){nums[0]0;nums[1]\0;return nums;}while(newnum>1){int flagnewnum%16;newnum/16;if(flag<9){nums[i]flag0…

华为OD机试 - 计算误码率(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

Acwing 队列

模拟队列 主要思想&#xff1a;先进先出&#xff08;注意与栈做区分&#xff09;&#xff0c;队尾插入&#xff0c;队头删除。设置一个数组存储数据&#xff0c;队头指针指向队列第一个元素&#xff08;初始为0&#xff09;&#xff0c;队尾指针指向最后一个元素&#xff08;初…

Qt常用控件——QSpinBox

文章目录 QSpinBox核心属性及信号点餐示例 QSpinBox核心属性及信号 QSpinBox或者QDoubleSpinBox表示微调框&#xff0c;带有按钮的输入框&#xff0c;可以用来输入整数/浮点数或者通过点击按钮调整数值大小 QSpinBox和QDoubleSpinBox用法基本相同&#xff0c;本篇以QSpinBox为…

Ubuntu 安装包下载(以20版本 阿里镜像站为例子)

Ubuntu安装包下载 上一篇文章写了一些国内常用的镜像站&#xff0c;这篇以阿里云镜像站Ubuntu20版本为例。 https://mirrors.aliyun.com/ubuntu-releases/ 1.点击自己想要下载的版本 2.点击以amd64.iso为结尾的文件&#xff0c;这个是安装文件&#xff0c;如果是桌面端&…

C++初阶学习——探索STL奥秘——vector的模拟实现

vector的结构比较特殊&#xff0c;成员变量为三个指针 #pragma once #include <iostream> using std::cin; using std::cout; using std::endl;#include <string> using std::string;namespace Yohifo {template<class T>class vector{public:typedef T val…

使用jmeter做性能测试实践过程中需要注意什么

前言 在驾驭Apache JMeter进行性能测试之旅中&#xff0c;深刻理解其特性和限制是至关重要的。以下是提升JMeter效能的关键策略&#xff0c;旨在挖掘其潜力&#xff0c;克服局限&#xff0c;实现精准测试。 1.精确调控线程数 推荐阈值&#xff1a;将线程数控制在300以内&…

模拟视频推到WVP推流列表

效果 1. wvp创建RTMP 2. 使用ffmpeg将本地的视频转为rtmp ffmpeg -re -i F:rtsp\123.mp4 -c copy -f flv rtmp://192.168.1.237:1935/cd/10001?sign=Z4Y3eYeSg