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

只需要课程大纲或进度表+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 0void 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 36Adafruit_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 displayconst 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 Fuint8_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 moduleWire.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 measurementsif ((millis() - timerDHT) > TIMEDHT) {// Update the timertimerDHT = 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 modestatic bool flasher = false;  // Seconds passing flasherbeginDS1307();getTemperature();P.displayAnimate();if (P.getZoneStatus(0)){switch (display){case 0: // Temperature deg CelsiusP.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 FahrenheitP.setTextEffect(0, PA_SCROLL_UP, PA_SCROLL_DOWN);display++;dtostrf(fahrenheit, 3, 1, szMesg);strcat(szMesg, "&");break;case 2: // HumidityP.setTextEffect(0, PA_SCROLL_DOWN, PA_SCROLL_LEFT);display++;dtostrf(humidity, 3, 0, szMesg);strcat(szMesg, "%UR");break;case 3: // ClockP.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 weekP.setFont(0, nullptr);P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);display++;dow2str(wday, szMesg, MAX_MESG);break;default: // CalendarP.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.rhkb.cn/news/434287.html

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

相关文章

【ChromeDriver安装】爬虫必备

以下是安装和配置 chromedriver 的步骤&#xff1a; 1. 确认 Chrome 浏览器版本 打开 Chrome 浏览器&#xff0c;点击右上角的菜单按钮&#xff08;三个点&#xff09;&#xff0c;选择“帮助” > “关于 Google Chrome”。 2. 下载 Chromedriver 根据你的 Chrome 版本&…

起重机防摇摆技术如何达标-武汉正向科技

武汉正向科技防摇摆控制器 主要技术参数 1、防摇摆精度&#xff1a; 0.4 2、行车到达目标位置偏差位置偏差&#xff1a; 25mm 3、通讯方式&#xff1a;PROFINET / PROFIBUS / RS232 / RS422 / RS485&#xff1b; 4、消除载荷的摇摆达 96% 以上&#xff1b; 5、技术先进…

MySQL: 数据类型介绍

文章目录 数据类型数值类型字符串类型日期类型 数据类型 数值类型 分为整型和浮点型: BIT类似于数据结构中的位图,BIT可以认为是一组二进制bit位. BIT(10)表示这个类型里就存最多10个bit位. 虽然TINYINT和SMALLINT更节省空间,但是还是更推荐使用INT或者BIGINT. 如果存储空间…

QT day01

自定义实现登录界面&#xff1a; #include "widget.h" #include "ui_widget.h" #include<QPushButton> #include<QLineEdit> #include<QLabel>Widget::Widget(QWidget *parent) //定义有参构造函数: QWidget(parent), ui(new Ui::Widge…

HTTP 1.0 2.0 3.0详解

HTTP HTTP全称超文本传输协议&#xff0c;是一种属于应用层的通信协议。它允许将超文本标记语言文档&#xff08;HTML&#xff09;从Web服务器传输到客户端的浏览器。 HTTP报文结构 请求报文结构 请求方法&#xff1a; GET&#xff1a;一般用来请求已被URI识别的资源&#x…

Spring Boot 整合MyBatis-Plus 实现多层次树结构的异步加载功能

文章目录 1&#xff0c;前言2&#xff0c;什么是多层次树结构&#xff1f;3&#xff0c;异步加载的意义4&#xff0c;技术选型与实现思路5&#xff0c;具体案例5.1&#xff0c;项目结构5.2&#xff0c;项目配置&#xff08;pom.xml&#xff09;5.3&#xff0c;配置文件&#xf…

Python | Leetcode Python题解之第442题数组中重复的数据

题目&#xff1a; 题解&#xff1a; class Solution:def findDuplicates(self, nums: List[int]) -> List[int]:ans []for x in nums:x abs(x)if nums[x - 1] > 0:nums[x - 1] -nums[x - 1]else:ans.append(x)return ans

TypeScript入门 (五)异步编程与前后端交互

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文旨在全面介绍 TypeScript 中的异步编程与网络请求&#xff0c;帮助读者深入理解 TypeScript 中的 asyn…

通信工程学习:什么是MAI多址干扰

MAI:多址干扰 MAI多址干扰(Multiple Access Interference)是无线通信领域,特别是在码分多址(CDMA)系统中,一个关键的干扰现象。以下是对MAI多址干扰的详细解释: 一、定义 多址干扰是指在CDMA系统中,由于多个用户的信号在时域和频域上是混叠的,从而导…

PCB基础

一、简介 PCB&#xff1a;printed circuit board&#xff0c;印刷电路板 主要作用&#xff1a;传输信号、物理支撑、提供电源、散热 二、分类 2.1 按基材分类 陶瓷基板&#xff1a;包括氧化铝、氮化铝、碳化硅基板等&#xff0c;具有优异的导热性&#xff0c;适用于高温和高…

前缀和(包括一维和二维)

前缀和 什么是前缀和&#xff1f;用在哪里&#xff1f;有什么好处&#xff1f; 前缀和是在反复求一个序列中不同区间处的元素之和。 例如有以下一个数组&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 我们要求a[2]~a[4]&#xff08;不包括a[2]&#xff0…

css边框修饰

一、设置线条样式 通过 border-style 属性设置&#xff0c;可选择的一些属性如下&#xff1a; dotted&#xff1a;点线 dashed&#xff1a;虚线 solid&#xff1a;实线 double&#xff1a;双实线 效果如下&#xff1a; 二、设置边框线宽度 ① 通过 border-width 整体设置…

从碎片到整合:EasyCVR平台如何重塑城市感知系统的视频数据生态

随着城市化进程的加速&#xff0c;城市感知系统作为智慧城市的重要组成部分&#xff0c;正逐步成为提升城市管理效率、保障公共安全、优化资源配置的关键手段。EasyCVR视频汇聚融合平台&#xff0c;凭借其强大的数据整合、智能分析与远程监控能力&#xff0c;在城市感知系统中扮…

使用 PowerShell 命令更改 RDP 远程桌面端口(无需修改防火墙设置)

节选自原文&#xff1a;Windows远程桌面一站式指南 | BOBO Blog 原文目录 什么是RDP&#xfffc;开启远程桌面 检查系统版本启用远程桌面连接Windows 在Windows电脑上在MAC电脑上在Android或iOS移动设备上主机名连接 自定义电脑名通过主机名远程桌面使用Hosts文件自定义远程主…

依赖注入之set注入

set注入 set注入&#xff0c;基于set王法实现的&#xff0c;底层通过反射机制调用属性对应的set方法&#xff0c;然后给属性赋值&#xff0c;这种方法要求属性必须对外提供set方法 1. 想让Spring调用对应的set方法&#xff0c;需要配置property标签 2. name属性怎么指定值:s…

云计算Openstack

OpenStack是一个开源的云计算管理平台项目&#xff0c;由美国国家航空航天局&#xff08;NASA&#xff09;和Rackspace公司合作研发并发起&#xff0c;以Apache许可证授权。该项目旨在为公共及私有云的建设与管理提供软件支持&#xff0c;通过一系列相互协作的组件实现云计算服…

python和pyqt-tools安装位置

一.python的安装位置 1.查询安装的python的位置 先查询python&#xff0c;然后输入import sys和sys.path 二.python-tools的安装位置 找到python的文件后按下图路径即可查到tools的文件

利士策分享,攀登职场高峰:成功者的十大特质

利士策分享&#xff0c;攀登职场高峰&#xff1a;成功者的十大特质 在职场这个竞争激烈的舞台上&#xff0c;那些能够迅速崛起、实现职业辉煌的佼佼者&#xff0c;往往凭借一系列独特且鲜明的特质脱颖而出。以下是对这些特质的深入探讨&#xff1a; 第一章&#xff1a;高情商的…

AI芯片WT2605C赋能厨房家电,在线对话操控,引领智能烹饪新体验:尽享高效便捷生活

在智能家居的蓬勃发展中&#xff0c;智能厨电作为连接科技与生活的桥梁&#xff0c;正逐步渗透到每一个现代家庭的厨房中。蒸烤箱作为智能厨电的代表&#xff0c;以其丰富的功能和高效的性能&#xff0c;满足了人们对美食的多样化追求。然而&#xff0c;面对众多复杂的操作功能…

【CSS】字体文本

color 颜色font-size 大小font-family 字体font-style 样式font-weight 加粗text-decoration 下划线text-shadow 阴影text-transform 大小写变换text-indent 缩进text-align 水平对齐 、vertical-align垂直对齐text-overflow 溢出word-wrap 换行word-break 截断white-space 空白…