机器人控制器设计与编程基础实验高效版本-ESP32等单片机实验报告

news2024/9/26 1:27:32

只需要课程大纲或进度表+wokwi +大模型工具,就可以完全掌握嵌入式系统基础实验的所有核心点。


LCD

// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi
https://wokwi.com/projects/321525495180034642

#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);

#define NTP_SERVER     "pool.ntp.org"
#define UTC_OFFSET     0
#define UTC_OFFSET_DST 0

void spinner() {
  static int8_t counter = 0;
  const char* glyphs = "\xa1\xa5\xdb";
  LCD.setCursor(15, 1);
  LCD.print(glyphs[counter++]);
  if (counter == strlen(glyphs)) {
    counter = 0;
  }
}

void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    LCD.setCursor(0, 1);
    LCD.println("Connection Err");
    return;
  }

  LCD.setCursor(8, 0);
  LCD.println(&timeinfo, "%H:%M:%S");

  LCD.setCursor(0, 1);
  LCD.println(&timeinfo, "%d/%m/%Y   %Z");
}

void setup() {
  Serial.begin(115200);

  LCD.init();
  LCD.backlight();
  LCD.setCursor(0, 0);
  LCD.print("Connecting to ");
  LCD.setCursor(0, 1);
  LCD.print("WiFi ");

  WiFi.begin("Wokwi-GUEST", "", 6);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    spinner();
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.println("Online ^_^");
  LCD.setCursor(0, 1);
  LCD.println("Updating time...");

  configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}

void loop() {
  printLocalTime();
  delay(250);
}

 

实验目的

本实验旨在通过结合使用ESP32的WiFi功能、RTC(实时时钟)和LCD(液晶显示屏)模块,实现一个能够显示当前时间并通过网络同步时间的系统。具体目标包括:

  1. 掌握ESP32的WiFi连接配置及基本使用方法。
  2. 学习如何在Arduino环境下使用NTP(网络时间协议)服务来同步时间。
  3. 熟悉LCD液晶显示屏的基本操作,包括初始化、显示文本等。
  4. 综合运用ESP32、LCD和WiFi技术,构建一个具有实时时间显示功能的系统。

实验步骤

  1. 硬件连接
    • 将ESP32开发板与LCD液晶显示屏(通过I2C接口)连接。
    • 确保ESP32能够接入网络(可以是路由器、热点等)。
  2. 软件环境配置
    • 在Arduino IDE中安装ESP32的开发板支持包。
    • 引入必要的库文件,如WiFi.hWire.hLiquidCrystal_I2C.h
  3. 编写代码
    • 初始化LCD显示屏和WiFi连接。
    • 配置NTP服务器,设置时区偏移量。
    • 编写函数来检查WiFi连接状态,并在LCD上显示状态信息。
    • 编写函数从NTP服务器获取当前时间,并在LCD上格式化显示。
  4. 代码上传与调试
    • 将编写好的代码上传到ESP32开发板。
    • 观察LCD显示屏上的时间是否随时间更新,检查网络连接状态。
    • 调整代码中的NTP服务器和时区设置,确保时间显示的准确性。
  5. 优化与扩展
    • 考虑加入用户输入功能,允许用户设置时区或选择NTP服务器。
    • 实现时间的夏令时自动调整。
    • 优化WiFi连接过程的用户反馈,提高用户体验。

实验原理

  1. WiFi连接:ESP32通过WiFi模块连接到无线网络,利用TCP/IP协议与服务器进行通信。
  2. NTP时间同步:ESP32通过NTP协议向NTP服务器发送请求,获取当前的网络时间,并根据本地时区进行转换。
  3. LCD显示:LCD液晶显示屏通过I2C接口与ESP32连接,ESP32向LCD发送控制命令和显示数据,实现文本的显示和更新。

实验内容

  • ESP32 WiFi模块的配置与连接。
  • NTP服务器的选择与时区设置。
  • LCD液晶显示屏的初始化与文本显示。
  • 时间获取与显示的逻辑实现。

思考题

  1. 如何在不改变硬件连接的情况下,将LCD显示屏的显示内容从时间改为其他信息(如天气、新闻标题等)?
  2. 如果NTP服务器无法连接或时间同步失败,如何设计备用方案以保证系统时间的准确性?
  3. 如何优化WiFi连接过程的用户体验,例如添加连接状态指示灯或增加用户反馈?
  4. 如果想要将时间显示改为24小时制,需要在代码中做哪些修改?
  5. 如何利用ESP32的其他功能(如蓝牙、ADC等)来扩展这个实时时间显示系统的功能?

仿真


代码

 



#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

#define TFT_DC 35
#define TFT_CS 3
#define TFT_MOSI 37
#define TFT_CLK 36


Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK);

void setup() {
  Serial.begin(115200); 
  Serial.println("Welcome to Wokwi, CORE-S3");
  
 
  tft.begin();

  // Configure the direction of the display
  const uint8_t mode = 0xc8;
  tft.sendCommand(ILI9341_MADCTL, &mode, 1);

  tft.setCursor(88, 60);
  tft.setTextColor(ILI9341_RED);
  tft.setTextSize(3);
  tft.println("CORE-S3");
}

const uint32_t colors[] = {
  ILI9341_GREEN,
  ILI9341_CYAN,
  ILI9341_MAGENTA,
  ILI9341_YELLOW,
};
uint8_t colorIndex = 0;

void loop() {
  tft.setTextSize(2);
  tft.setCursor(36, 106);
  tft.setTextColor(colors[colorIndex++ % 4]);
  tft.println("Welcome to Wokwi!Hello");
  delay(250);
}

实验目的

本实验旨在通过使用Arduino和Adafruit_ILI9341库,在TFT显示屏上实现文本显示和颜色变换,以熟悉Arduino的图形用户界面编程和SPI通信。

实验步骤

  1. 硬件连接
    • 将TFT显示屏的DC引脚连接到Arduino的35号引脚。
    • 将TFT显示屏的CS引脚连接到Arduino的3号引脚。
    • 将TFT显示屏的MOSI引脚连接到Arduino的37号引脚。
    • 将TFT显示屏的CLK引脚连接到Arduino的36号引脚。
    • 确保TFT显示屏的电源和地线分别连接到Arduino的5V和GND。
  2. 软件准备
    • 在Arduino IDE中安装所需的库:SPI.h, Adafruit_GFX.h, Adafruit_ILI9341.h。
    • 将提供的代码复制到Arduino IDE中,并上传到Arduino板。
  3. 代码运行
    • 上传代码后,打开Arduino IDE的串口监视器,设置波特率为115200。
    • 观察TFT显示屏上的显示内容,验证文本是否正确显示,并且颜色是否按预期变换。

实验原理

  • SPI通信:Serial Peripheral Interface(SPI)是一种同步串行通信接口,用于微控制器与各种外围设备(如显示器、传感器等)之间的通信。本实验中,Arduino通过SPI接口与TFT显示屏通信,发送显示数据和命令。
  • Adafruit_ILI9341库:这是一个专门用于控制ILI9341 TFT显示屏的Arduino库。它提供了丰富的API,用于初始化显示屏、设置显示参数、绘制图形和文本等。
  • 文本显示和颜色变换:通过调用Adafruit_ILI9341库的相关函数,可以在TFT显示屏上指定位置显示文本,并设置文本的颜色。本实验中,通过循环改变颜色的索引值,实现文本颜色的变换。

实验内容

  • 初始化TFT显示屏,包括设置SPI通信参数和显示屏的显示方向。
  • 在显示屏上指定位置显示文本“CORE-S3”,并设置文本颜色为红色。
  • 在循环中,改变文本的颜色,使其在绿色、青色、品红色和黄色之间循环变换,每次变换间隔250毫秒。

思考题

  1. SPI通信的原理是什么?
    • SPI通信是一种同步串行通信方式,通过主设备(Master)和从设备(Slave)之间的时钟信号(CLK)和数据信号(MOSI/MISO)进行数据传输。主设备产生时钟信号,并控制数据传输的时机和方向。从设备根据时钟信号接收或发送数据。
  2. Adafruit_ILI9341库提供了哪些功能?
    • Adafruit_ILI9341库提供了初始化显示屏、设置显示参数(如亮度、对比度、颜色等)、绘制基本图形(如点、线、矩形、圆形等)和文本显示等功能。这些功能使得用户可以方便地控制ILI9341 TFT显示屏进行各种图形和文本的显示。
  3. 如何修改代码以在显示屏上显示不同的文本或改变文本的位置?
    • 要在显示屏上显示不同的文本,可以修改tft.println("CORE-S3");语句中的字符串内容。要改变文本的位置,可以修改tft.setCursor(88, 60);语句中的坐标值。这两个函数分别用于设置要显示的文本内容和文本在显示屏上的位置。
  4. 如果希望加快或减慢文本颜色的变换速度,应该如何修改代码?
    • 要加快或减慢文本颜色的变换速度,可以修改delay(250);语句中的延迟时间值。减小该值会加快颜色变换速度,增大该值会减慢颜色变换速度。

 

/*
 * Use of MAX72XX, DS1307 and DTH22 components to 
 * print some information on the display.
 *
 * for more examples:
 * https://github.com/MajicDesigns/MD_Parola/tree/main/examples
 * https://github.com/MajicDesigns/MD_MAX72XX/tree/main/examples
 */

// Header file includes
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <DHT.h>
#include <SPI.h>
#include <Wire.h>
#include "Font7Seg.h"

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4 // Define the number of displays connected
#define CLK_PIN    13 // CLK or SCK
#define DATA_PIN   11 // DATA or MOSI
#define CS_PIN     10 // CS or SS
#define SPEED_TIME 75 // Speed of the transition
#define PAUSE_TIME  0
#define MAX_MESG   20

// These are for the clock
#define DS1307_ADDRESS 0x68

// These are for the temperature
#define DHTPIN 2
#define DHTTYPE DHT22
#define TIMEDHT 1000

// Global variables
uint8_t wday, mday, month, year;
uint8_t hours, minutes, seconds;

char szTime[9];    // mm:ss\0
char szMesg[MAX_MESG + 1] = "";

float humidity, celsius, fahrenheit;

uint8_t degC[] = { 6, 3, 3, 56, 68, 68, 68 }; // Deg C
uint8_t degF[] = { 6, 3, 3, 124, 20, 20, 4 }; // Deg F

uint8_t clear = 0x00;

uint32_t timerDHT = TIMEDHT;

DHT dht(DHTPIN, DHTTYPE);

// Hardware SPI connection
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

void beginDS1307()
{
  // Read the values ​​(date and time) of the DS1307 module
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(clear);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 0x07);

  seconds = bcdToDec(Wire.read());
  minutes = bcdToDec(Wire.read());
  hours = bcdToDec(Wire.read() & 0xff);
  wday = bcdToDec(Wire.read());
  mday = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
}

uint8_t decToBcd(uint8_t value)
{
  return ((value / 10 * 16) + (value % 10));
}

uint8_t bcdToDec(uint8_t value)
{
  return ((value / 16 * 10) + (value % 16));
}

// Code for reading clock time
void getTime(char *psz, bool f = true)
{
  sprintf(psz, "%02d%c%02d", hours, (f ? ':' : ' '), minutes);
}

// Code for reading clock date
void getDate(char *psz)
{
  char  szBuf[10];
  sprintf(psz, "%d %s %04d", mday , mon2str(month, szBuf, sizeof(szBuf) - 1), (year + 2000));
}

// Code for get Temperature
void getTemperature()
{
  // Wait for a time between measurements
  if ((millis() - timerDHT) > TIMEDHT) {
    // Update the timer
    timerDHT = millis();

    // Reading temperature or humidity takes about 250 milliseconds!
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    humidity = dht.readHumidity();

    // Read temperature as Celsius (the default)
    celsius = dht.readTemperature();

    // Read temperature as Fahrenheit (isFahrenheit = true)
    fahrenheit = dht.readTemperature(true);

    // Check if any reads failed and exit early (to try again)
    if (isnan(humidity) || isnan(celsius) || isnan(fahrenheit)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }
  }
}

// Get a label from PROGMEM into a char array
char *mon2str(uint8_t mon, char *psz, uint8_t len)
{
  static const __FlashStringHelper* str[] =
  {
    F("Jan"), F("Feb"), F("Mar"), F("Apr"),
    F("May"), F("Jun"), F("Jul"), F("Aug"),
    F("Sep"), F("Oct"), F("Nov"), F("Dec")
  };

  strncpy_P(psz, (const char PROGMEM *)str[mon - 1], len);
  psz[len] = '\0';

  return (psz);
}

char *dow2str(uint8_t code, char *psz, uint8_t len)
{
  static const __FlashStringHelper* str[] =
  {
    F("Sunday"), F("Monday"), F("Tuesday"),
    F("Wed_Hello"), F("Thursday"), F("Friday"),
    F("Saturday")
  };

  strncpy_P(psz, (const char PROGMEM *)str[code - 1], len);

  psz[len] = '\0';

  return (psz);
}

void setup(void)
{
  Wire.begin();

  P.begin(2);
  P.setInvert(false);

  P.setZone(0,  MAX_DEVICES - 4, MAX_DEVICES - 1);
  P.setZone(1, MAX_DEVICES - 4, MAX_DEVICES - 1);

  P.displayZoneText(1, szTime, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
  P.displayZoneText(0, szMesg, PA_CENTER, SPEED_TIME, 0, PA_PRINT , PA_NO_EFFECT);

  P.addChar('$', degC);
  P.addChar('&', degF);

  dht.begin();
}

void loop(void)
{
  static uint32_t lastTime = 0; // Memory (ms)
  static uint8_t  display = 0;  // Current display mode
  static bool flasher = false;  // Seconds passing flasher

  beginDS1307();
  getTemperature();

  P.displayAnimate();

  if (P.getZoneStatus(0))
  {
    switch (display)
    {
    case 0: // Temperature deg Celsius
      P.setPause(0, 1000);
      P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_UP);
      display++;
      dtostrf(celsius, 3, 1, szMesg);
      strcat(szMesg, "$");

      break;
    case 1: // Temperature deg Fahrenheit
      P.setTextEffect(0, PA_SCROLL_UP, PA_SCROLL_DOWN);
      display++;
      dtostrf(fahrenheit, 3, 1, szMesg);
      strcat(szMesg, "&");

      break;
    case 2: // Humidity
      P.setTextEffect(0, PA_SCROLL_DOWN, PA_SCROLL_LEFT);
      display++;
      dtostrf(humidity, 3, 0, szMesg);
      strcat(szMesg, "%UR");

      break;
    case 3: // Clock
      P.setFont(0, numeric7Seg);
      P.setTextEffect(0, PA_PRINT, PA_NO_EFFECT);
      P.setPause(0, 0);

      if ((millis() - lastTime) >= 1000)
      {
        lastTime = millis();
        getTime(szMesg, flasher);
        flasher = !flasher;
      }

      if ((seconds == 00) && (seconds <= 30)) {
        display++;
        P.setTextEffect(0, PA_PRINT, PA_WIPE_CURSOR);
      }

      break;
    case 4: // Day of week
      P.setFont(0, nullptr);
      P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
      display++;
      dow2str(wday, szMesg, MAX_MESG);

      break;
    default: // Calendar
      P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
      display = 0;
      getDate(szMesg);

      break;
    }

    P.displayReset(0); // Rest zone zero
  }
}

 

实验步骤

  1. 准备硬件
    • 确保你有一块Arduino开发板(如Arduino Uno)和一个连接电脑的数据线(通常是USB线)。
    • 找到开发板上的LED_BUILTIN引脚。对于大多数Arduino板,这个内置LED通常连接在D13引脚上。
  2. 连接开发板
    • 使用USB线将Arduino开发板连接到电脑。
  3. 软件设置
    • 打开Arduino IDE(集成开发环境)。
    • 将上述提供的代码复制到Arduino IDE的代码窗口中。
    • 确认正确选择了你的Arduino板型号和端口(通常在“工具”菜单中设置)。
  4. 上传代码
    • 点击IDE中的“上传”按钮,将代码烧录到Arduino开发板上。
    • 观察IDE下方的状态栏,确认代码成功上传且没有错误信息。
  5. 观察结果
    • 观察Arduino板上的内置LED,它应该会每5秒闪烁一次(亮5秒,灭5秒)。

实验原理

本实验利用了Arduino的基本数字输出功能来控制LED的开关状态。通过pinMode()函数将D13引脚(LED_BUILTIN)设置为输出模式,然后使用digitalWrite()函数改变该引脚的电平状态(HIGH或LOW),从而控制LED的亮灭。delay()函数用于在LED状态改变之间提供时间延迟,本例中每次延迟5000毫秒(即5秒)。

实验内容

  • 学习如何使用Arduino IDE编写和上传代码。
  • 理解pinMode()digitalWrite()delay()函数的基本用法。
  • 通过实践观察LED的闪烁现象,理解数字信号对物理设备的控制原理。

思考题

  1. 代码修改:如果希望LED闪烁的频率加快,应该如何修改代码?
    • 答:可以减少delay()函数的参数值。例如,将delay(5000);改为delay(1000);,则LED会以1秒为周期闪烁。
  2. 多LED控制:如果要在Arduino上控制多个LED同时或交替闪烁,需要如何扩展代码?
    • 答:需要定义更多引脚为输出,并在loop()函数中分别对这些引脚使用digitalWrite()进行控制。例如,可以使用pinMode(9, OUTPUT);pinMode(10, OUTPUT);来设置两个额外的LED引脚,然后在循环中分别控制它们的亮灭。
  3. 故障排查:如果LED不闪烁,可能的原因有哪些,应如何排查?
    • 答:可能的原因包括:代码未成功上传、引脚连接错误、开发板未正确供电、LED损坏等。排查步骤可以包括:确认代码上传无误、检查USB连接、检查引脚是否正确设置且无短路、尝试更换LED或使用其他已知工作正常的引脚进行测试。
  4. 实际应用:列举一些利用类似原理的实际应用场景。
    • 答:交通信号灯控制、家用电器的开关控制、广告牌灯光效果、简单的报警系统指示等。

视频

ESP32等单片机实验报告快速完成-机器人控制器设计与编程基础实验高效版本


实验目的
本实验旨在通过使用Arduino和Adafruit_ILI9341库,在TFT显示屏上实现文本显示和颜色变换,以熟悉Arduino的图形用户界面编程和SPI通信。

实验步骤
硬件连接:
将TFT显示屏的DC引脚连接到Arduino的35号引脚。
将TFT显示屏的CS引脚连接到Arduino的3号引脚。
将TFT显示屏的MOSI引脚连接到Arduino的37号引脚。
将TFT显示屏的CLK引脚连接到Arduino的36号引脚。
确保TFT显示屏的电源和地线分别连接到Arduino的5V和GND。
软件准备:
在Arduino IDE中安装所需的库:SPI.h, Adafruit_GFX.h, Adafruit_ILI9341.h。
将提供的代码复制到Arduino IDE中,并上传到Arduino板。
代码运行:
上传代码后,打开Arduino IDE的串口监视器,设置波特率为115200。
观察TFT显示屏上的显示内容,验证文本是否正确显示,并且颜色是否按预期变换。
实验原理
SPI通信:Serial Peripheral Interface(SPI)是一种同步串行通信接口,用于微控制器与各种外围设备(如显示器、传感器等)之间的通信。本实验中,Arduino通过SPI接口与TFT显示屏通信,发送显示数据和命令。
Adafruit_ILI9341库:这是一个专门用于控制ILI9341 TFT显示屏的Arduino库。它提供了丰富的API,用于初始化显示屏、设置显示参数、绘制图形和文本等。
文本显示和颜色变换:通过调用Adafruit_ILI9341库的相关函数,可以在TFT显示屏上指定位置显示文本,并设置文本的颜色。本实验中,通过循环改变颜色的索引值,实现文本颜色的变换。
实验内容
初始化TFT显示屏,包括设置SPI通信参数和显示屏的显示方向。
在显示屏上指定位置显示文本“CORE-S3”,并设置文本颜色为红色。
在循环中,改变文本的颜色,使其在绿色、青色、品红色和黄色之间循环变换,每次变换间隔250毫秒。
思考题
SPI通信的原理是什么?
SPI通信是一种同步串行通信方式,通过主设备(Master)和从设备(Slave)之间的时钟信号(CLK)和数据信号(MOSI/MISO)进行数据传输。主设备产生时钟信号,并控制数据传输的时机和方向。从设备根据时钟信号接收或发送数据。
Adafruit_ILI9341库提供了哪些功能?
Adafruit_ILI9341库提供了初始化显示屏、设置显示参数(如亮度、对比度、颜色等)、绘制基本图形(如点、线、矩形、圆形等)和文本显示等功能。这些功能使得用户可以方便地控制ILI9341 TFT显示屏进行各种图形和文本的显示。
如何修改代码以在显示屏上显示不同的文本或改变文本的位置?
要在显示屏上显示不同的文本,可以修改tft.println("CORE-S3");语句中的字符串内容。要改变文本的位置,可以修改tft.setCursor(88, 60);语句中的坐标值。这两个函数分别用于设置要显示的文本内容和文本在显示屏上的位置。
如果希望加快或减慢文本颜色的变换速度,应该如何修改代码?
要加快或减慢文本颜色的变换速度,可以修改delay(250);语句中的延迟时间值。减小该值会加快颜色变换速度,增大该值会减慢颜色变换速度。


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

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

相关文章

【AI学习】Lilian Weng:What are Diffusion Models?

读OpenAI 的 Lilian Weng博客《What are Diffusion Models?》 文章链接:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 通过浏览器的在线翻译&#xff0c;直接截图了。翻译的有些问题&#xff0c;但是基本能大概看明白了。 我只是个人的记录&#xff0c;…

开发经验总结: 读写分离简单实现

背景 使用mysql的代理中间件&#xff0c;某些接口如果主从同步延迟大&#xff0c;容易出现逻辑问题。所以程序中没有直接使用这个中间件。 依赖程序逻辑&#xff0c;如果有一些接口可以走读库&#xff0c;需要一个可以显示指定读库的方式来连接读库&#xff0c;降低主库的压力…

降准降息一揽子措施点燃 A 股激情,4% 大涨之后趋势深度剖析

文章目录 牛回速归原因分析引爆点情绪和信心一根大阳线&#xff0c;千军万马来相见阴霾是否一扫而空还未可知 流动性和增量 潜在隐患等待经济复苏配套政策期待中美关系进展 短期内趋势分析空军短期内仍有余力如何看待第2日的回撤外围 趋势分析结论短期内可能仍有波折中长期会是…

【数学分析笔记】第3章第4节闭区间上的连续函数(1)

3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.1 有界性定理 【定理3.4.1】 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续&#xff0c;则 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上有界。 【证】用反证法&#xff0c;假设 f ( x ) f(x) f(x)在 [ …

2-103 基于matlab的光电信号下血氧饱和度计算

基于matlab的光电信号下血氧饱和度计算&#xff0c;光转换成电信号时&#xff0c;由于动脉对光的吸收有变化而其他组织对光的吸收基本不变&#xff0c;得到的信号就可以分为直流DC信号和交流AC信号。提取AC信号&#xff0c;就能反应出血液流动的特点。这种技术叫做光电容积脉搏…

【Linux学习】2-1 Linux系统下运行C语言输出hello word

1.双击打开VMware软件&#xff0c;点击开启此虚拟机后&#xff0c;等待点击头像输入密码进入 2.“CtrlAltt”调出命令行终端&#xff0c;输入命令sudo apt-get install vim安装vim&#xff0c;输入命令sudo apt-get install gcc安装gcc 3.输入命令vi hello.c进入C语言编写环境&…

Linux —— Socket编程(一)

一、本篇重点 1. 认识IP地址、端口号、网络字节序等网络编程中的基本概念 2. 学习Socket api的基本用法 3. 能够实现一个简单的udp客户端/服务器 二、基本概念 1. 理解源IP地址和目的IP地址 简单的理解&#xff0c;IP地址是用于标识一台机器的&#xff0c;我们通过IP地址去…

使用 UWA Gears 测试小游戏性能

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 随着小游戏的规模和用户量持续增长&#xff0c;玩家对于小游戏的性能要求也越来越高。为了能够给玩…

力扣234 回文链表 Java版本

文章目录 题目描述代码 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&…

【ASE】第三课_山丘颜色梯度效果

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习山丘的颜色梯度显示&#xff0c;根据不同的高度显示不同的颜色 最终效果&#xff1a; 思路&#xff1a; 1.先加载模型的纹理贴图和法线贴图 2. 获得模型世界顶点Y向量&am…

【渗透测试】-灵当CRM系统-sql注入漏洞复现

文章目录 概要   灵当CRM系统sql注入漏洞&#xff1a;   具体实例&#xff1a;  技术名词解释  小结 概要 近期灵当CRM系统爆出sql注入漏洞&#xff0c;我们来进行nday复现。 灵当CRM系统sql注入漏洞&#xff1a; Python sqlmap.py -u "http://0.0.0.0:0000/c…

当okhttp网络库遇到不规范的http状态码

如题&#xff0c;最近工作遇到的问题&#xff0c;我们的 Android 应用网络请求埋点报表&#xff0c;收集到了奇怪的网络请求异常&#xff1b;通过日志收集与分析&#xff0c;确定到是服务器返回了不规范的状态码所导致。 如上是根据线上的业务场景&#xff0c;本地写个简单的M…

二进制位运算题

本期介绍&#x1f356; 主要介绍&#xff1a;1. 在不创建临时变量的情况下交换两个变量&#xff0c;2. 计算变量在内存中存放2进制位“1”的个数&#xff0c;3. 求两个数的二进制中不同位的个数&#xff0c;4. 分别打印整数的二进制中奇数位和偶数位&#xff0c;5. 判断一个整数…

SentencePiece进行文本分类

SentencePieces 前言 Step1:故事 SentencePiece 是一个无监督的文本分词器和 detokenizer(还原回去的&#xff1f;)主要用于词汇表大小是预定的文本生成系统中它拓展了原始句子的训练&#xff0c;实现子词单元如 BPE 和 unigram language model技术亮点 纯数据驱动&#xff…

Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作

文章目录 1、AB分区镜像制作2、uboot修改3、镜像启动 在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中&#xff0c;我们通过buildroot制作了根文件系统&#xff0c;并通过 SD卡的形式将其挂载到设备并成功进行了启动&#xff0c;但上一章中&#xff0c;我们的…

车载应用的多功能需求与公安、金融等行业的应用特点

随着科技的快速发展&#xff0c;车载应用的功能需求也日益多样化。除了基本的视频监控功能外&#xff0c;现代车载应用还需满足一系列高级功能&#xff0c;如无线网络视频监控、GPS卫星定位、车辆调度、语音报站、行驶信息记录以及多媒体娱乐广告播放等。这些功能在公安、金融等…

2024年数字化转型与管理国际学术会议(DTM 2024)

目录 重要信息 大会简介 大会组委 征稿主题 论文出版 会议议程 参会方式 重要信息 大会官网&#xff1a;www.icemme.org&#xff08;点击了解大会&#xff0c;投稿等详细信息&#xff09; 大会时间&#xff1a;2024年11月22-24日 大会地点&#xff1a;中国-大连 大会…

三维重建的几何评价指标

1.三维重建的几何评价指标 1.1 Chamfer Distance Geometry quality (1) Chamfer Distance&#xff08;CD&#xff09; CD衡量两组点云之间的几何差异&#xff0c;距离越小越好。 CD是一种用于衡量两个点云之间相似度的常用几何评价指标。它计算一个点云中每个点到另一个点云的…

Qt5.15和Qt6.7配置Android开发环境

最近重新安装了Qt5.15.2和Qt6.7.2,使用Qt Creator14.0.1,配置Android开发环境时又碰到了一些问题,记录如下。 1、Qt6.7.2使用AndroidStudio的JDK 因为系统原来安装了AndroidStudio2024,系统自动检测了JDK位置,点击设置SDK,可以自动安装好相应的NDK。 打开Qt Creator14…

JavaEE——多线程的状态及线程安全问题

目录 一、线程的状态 1、NEW 2、 TERMINATED 3、RUNNABLE 4、TIMED_WAITING 5、 BLOCKED 6、WAITING 二、线程安全问题 1、线程不安全的原因 2、一个线程不安全的实例 3、加锁操作 4、产生线程不安全的原因 什么是内存可见性呢&#xff1f; 解决方案&#xff1f; 5、指令重排序…