04-基础例程4

news2024/11/17 10:06:25

基础例程4

1、RGB彩灯

  • 实验介绍

​ WS2812B是一款智能控制的LED光源,控制电路和RGB芯片集成在一个5050组件的封装中。

​ 可以将多个RGB灯珠级联,如下图所示:

在这里插入图片描述

​ 3个最基本的颜色为红、绿、蓝(RGB),均是0-255。

​ 使用ESP32控制RGB彩灯循环点亮,且按照红、橙、黄、绿、青、蓝、紫的颜色循环变化。

  • 硬件设计

在这里插入图片描述

使用ESP32的16引脚进行控制

  • 软件设计
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:RGB彩灯实验
 * 
 * 接线说明:RGB彩灯模块-->ESP32 IO
 *         WS-->(16)
 * 
 * 实验现象:程序下载成功后,RGB彩灯循环点亮且循环变化颜色
 * 
 * 注意事项:需要在软件中选择"项目"-->"加载库"-->"管理库"-->输入"Adafruit_NeoPixel"安装即可。
 * 
 */

#include "public.h"
#include <Adafruit_NeoPixel.h>

// 设置灯珠数量
#define NUMPIXELS        5

// 设置输出数据引脚
#define PIN_NEOPIXEL    16

// 初始化灯珠控制实例
//在GPIO上创建了一个Adafruit_NeoPixel实例,包含了5个灯珠
Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

// 当前灯珠指向
int16_t idx = 0;


// 启动设置
void setup() {
  // 调试串口速率设置
  Serial.begin(115200);

  // 灯珠控制开始
  pixels.begin();

  // 设置亮度为255
  pixels.setBrightness(255);

  // 设置灯珠颜色,全部关闭
  pixels.fill(0x000000);

  delay(100);

  // 设置灯珠颜色
  pixels.fill(0xFF0000);

  delay(100);

  pixels.clear();
}

//(0,0,0)——(255,255,255),c1、c2、c3分别代表三个位
uint16_t c1 = 0;
uint16_t c2 = 0;
uint16_t c3 = 0;     
uint16_t sign_bit =0;
uint16_t sign = 1;
/*
初始:(0,0,0)->(255,0,0)->(255,255,0)->(0,255,0)->(0,255,255)->(0,0,255)->(255,0,255)->(255,0,0)->(255,255,0)
白----------->红---橙--->黄---------->绿--------->青---------->蓝---紫--->品红-------->红---橙--->黄
后续:(0,255,0)->(0,255,255)->(0,0,255)->(255,0,255)->(255,0,0)->(255,255,0)->
    绿--------->青---------->蓝---紫--->品红-------->红---橙--->黄
*/
// 循环主体程序
void loop() {
    if(sign_bit == 0)
    {
      //这个if语句在循环体内只运行一次,该if语句及下方if语句可以用switch代替
        if(sign)
        {
          c1++;
          if(c1>=255)
            sign=0;
        }
        else
        {
          c2++;
          if(c2>=255)
          {
            sign=1;
            sign_bit = 1;
          }
        }
    }
    if(sign_bit == 1)
    {
        if(sign)
        {
          c1--;
          if(c1<=0)
            sign=0;
        }
        else
        {
          c3++;
          if(c3>=255)
          {
            sign=1;
            sign_bit = 2;
          }
        }
    }
    if(sign_bit == 2)
    {
        if(sign)
        {
          c2--;
          if(c2<=0)
            sign=0;
        }
        else
        {
          c1++;
          if(c1>=255)
          {
            sign=1;
            sign_bit = 3;
          }
        }
    }
    if(sign_bit == 3)
    {
        if(sign)
        {
          c3--;
          if(c3<=0)
            sign=0;
        }
        else
        {
          c2++;
          if(c2>=255)
          {
            sign=1;
            sign_bit = 1;
          }
        }
    }
  
    //在这里注释的是一个一个将灯珠点亮并实现渐变
    idx++;
    if(idx > 5)
    {
      idx = 0;
    }
    pixels.setPixelColor(idx, pixels.Color(c1,c2,c3));

    
    /*=======================================
    全部点亮用该函数
    pixels.fill(pixels.Color(c1,c2,c3));
    =======================================*/
  
    delay(10);//延时,改变速度
    // 显示
    pixels.show();
  
}

2、数码管显示

  • 实验介绍

数码管的显示有共阳和共阴两种

在这里插入图片描述

由于多数码管需要的电流比较大,故选择使用TM1637驱动控制。共阳

在这里插入图片描述

GRIDx:位选信号,选择使用哪个数码管

SGIx:段选,选择使用哪个

CLK:时钟的输入

  • 硬件设计

在这里插入图片描述

  • 软件设计

使用的是Grove 4-Digit Display库

#include "TM1637.h"

#define CLK  16 //Set the CLK pin connection to the display
#define DIO  17 //Set the DIO pin connection to the display

TM1637 tm1637(CLK, DIO); //set up the 4-Digit Display.
int numCounter = 0;
bool dian = false;

void setup() {
  // put your setup code here, to run once:
  tm1637.init();
  tm1637.point(1);//小数点开关,1为打开,0为关闭
  tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
}

void loop() {
  // put your main code here, to run repeatedly:
  for (numCounter = 0; numCounter < 9999; numCounter++) //Iterate numCounter
  {
    tm1637.display(0, (numCounter / 1000%10));
    tm1637.display(1, (numCounter / 100%10));
    tm1637.display(2, (numCounter / 10%10));
    tm1637.display(3, (numCounter % 10));
    dian = !dian;
    tm1637.point(dian);
    delay(200);
  }
}

参考

ESP32 & TM1637显示4位数码管_esp32 tm1637_UPUPUPEveryday的博客-CSDN博客

arduino笔记28:使用TM1637四位数码管显示模块_tm1637引脚功能__低头写作业的博客-CSDN博客

3、RTC实时时钟

下载使用ESP32Time库

/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:RTC实时时钟实验
 * 
 * 接线说明:
 * 
 * 实验现象:程序下载成功后,软件串口控制台间隔1S输出RTC实时时钟年月日时分秒星期
 * 
 * 注意事项:需要在软件中选择"项目"-->"加载库"-->"管理库"-->输入"ESP32Time"安装即可。
 * 
 */

#include "public.h"
#include <ESP32Time.h>

ESP32Time rtc(3600);  // offset in seconds GMT+1

void setup(){
  Serial.begin(115200);
  rtc.setTime(30, 24, 15, 17, 9, 2022);//2022年9月17日15点24分30秒
}

void loop(){
  //  Serial.println(rtc.getTime());          //  (String) 15:24:38
  //  Serial.println(rtc.getDate());          //  (String) Sun, Jan 17 2021
  //  Serial.println(rtc.getDate(true));      //  (String) Sunday, January 17 2021
  //  Serial.println(rtc.getDateTime());      //  (String) Sun, Jan 17 2021 15:24:38
  //  Serial.println(rtc.getDateTime(true));  //  (String) Sunday, January 17 2021 15:24:38
  //  Serial.println(rtc.getTimeDate());      //  (String) 15:24:38 Sun, Jan 17 2021
  //  Serial.println(rtc.getTimeDate(true));  //  (String) 15:24:38 Sunday, January 17 2021
  //
  //  Serial.println(rtc.getMicros());        //  (long)    723546
  //  Serial.println(rtc.getMillis());        //  (long)    723
  //  Serial.println(rtc.getEpoch());         //  (long)    1609459200
  //  Serial.println(rtc.getSecond());        //  (int)     38    (0-59)
  //  Serial.println(rtc.getMinute());        //  (int)     24    (0-59)
  //  Serial.println(rtc.getHour());          //  (int)     3     (0-12)
  //  Serial.println(rtc.getHour(true));      //  (int)     15    (0-23)
  //  Serial.println(rtc.getAmPm());          //  (String)  pm
  //  Serial.println(rtc.getAmPm(true));      //  (String)  PM
  //  Serial.println(rtc.getDay());           //  (int)     17    (1-31)
  //  Serial.println(rtc.getDayofWeek());     //  (int)     0     (0-6)
  //  Serial.println(rtc.getDayofYear());     //  (int)     16    (0-365)
  //  Serial.println(rtc.getMonth());         //  (int)     0     (0-11)
  //  Serial.println(rtc.getYear());          //  (int)     2021
  
  //  Serial.println(rtc.getLocalEpoch());         //  (long)    1609459200 epoch without offset

  Serial.println(rtc.getTime("%A, %B %d %Y %H:%M:%S"));   // (String) returns time with specified format 星期-月-日-年 时-分-秒
  // formating options  http://www.cplusplus.com/reference/ctime/strftime/
  delay(1000);
}

4、DS1302时钟

  • 硬件设计

在这里插入图片描述

由图可知,J10端子的CLK、IO、CE引脚为DS1302的控制口,可将这些引脚与ESP32的引脚相连接

RTC时钟在断电后会没有。但是DS1302始终会一直存在

  • 软件设计

需要使用RTCLib by NeiroN库

/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:DS1302实时时钟实验
 * 
 * 接线说明:DS1302时钟模块-->ESP32 IO
           (CE)-->(23)
           (IO)-->(19)
           (CK)-->(18)
 * 
 * 实验现象:程序下载成功后,软件串口控制台间隔1S输出DS1302实时时钟年月日时分秒星期
 * 
 * 注意事项:需要在软件中选择"项目"-->"加载库"-->"管理库"-->输入"RTCLib by NeiroN"安装即可。
 *            API函数使用参考https://github.com/NeiroNx/RTCLib
 * 
 */

#include "public.h"
#include <RTClib.h>

DS1302 rtc(23, 18, 19);

char buf[20];

void setup(){
  Serial.begin(115200);
  rtc.begin();
  if (!rtc.isrunning()) 
  {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }
  rtc.adjust(DateTime(__DATE__, __TIME__));
}

void loop(){
  DateTime now = rtc.now();		//获取电脑本地时间
  Serial.println(now.tostr(buf));
  delay(1000);
}

结果

在这里插入图片描述

5、DS18B20温度传感器

  • 实验介绍

​ 控制DS18B20数字温度传感器,实时读取环境温度。

​ 这是常用的数字温度传感器,输出为数字信号,具有体积小,硬件开销第,抗干扰能力强,精度高,多点组网的特点。

  • 硬件设计

在这里插入图片描述

​ DS18B20模块DS18B20的引脚与J2的对应引脚相连,可以将该引脚与ESP32的GPIO相连接。

  • 软件设计
/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:DS18B20温度传感器实验
 * 
 * 接线说明:DS18B20温度传感器模块-->ESP32 IO
            (DS)-->(13)
 * 
 * 实验现象:程序下载成功后,软件串口控制台间隔1S输出DS18B20温度传感器采集的温度
 * 
 * 注意事项:需要在软件中选择"项目"-->"加载库"-->"添加一个.ZIP库..."-->选择到本实验目录下的两个压缩文件包“OneWire-master.zip”和“Arduino-Temperature-Control-Library-master.zip”安装即可。
 *          该库使用方法可参考:https://blog.csdn.net/Naisu_kun/article/details/88420357
 */

#include "public.h"
#include <DallasTemperature.h>

#define ONE_WIRE_BUS    13 //1-wire数据总线连接
OneWire oneWire(ONE_WIRE_BUS); //声明
DallasTemperature sensors(&oneWire); //声明

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

void loop(){
  Serial.println("发起温度转换");
  sensors.requestTemperatures(); //向总线上所有设备发送温度转换请求,默认情况下该方法会阻塞
  Serial.println("温度转换完成");

  float tempC = sensors.getTempCByIndex(0); //获取索引号0的传感器摄氏温度数据
  if (tempC != DEVICE_DISCONNECTED_C) //如果获取到的温度正常
  {
    Serial.print("当前温度是: ");
    Serial.print(tempC);
    Serial.println(" ℃\n");
  }
  delay(2000);
}
/*
发起温度转换
温度转换完成
当前温度是: 26.31 ℃

发起温度转换
温度转换完成
当前温度是: 26.37 ℃

发起温度转换
温度转换完成
当前温度是: 26.31 ℃
*/

在这里插入图片描述

平面朝内部;弧度朝外部。接下面3个引脚

6、DHT11温湿度传感器

  • 实验介绍

​ DHT11传感器具有小体积,极低的功耗,与DS18B20一样是单总线接口,为4针的单排引脚封装,连接方便。

在这里插入图片描述

​ 也可以使用DHT11模块[使用单线连接]

在这里插入图片描述

+:电源正极(3-5.5V);OUT:数据库;-:电源负极。

DHT11性价比较高,但是精度与响应速度有点低,有高级的DHT22

  • 硬件设计

同上面的实验5-DS18B20温度传感器。将DHT11插入位置。ESP32引脚与J2-DS引脚相连接

  • 软件设计

主函数

/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:DHT11温湿度传感器实验
 * 
 * 接线说明:DHT11温湿度传感器模块-->ESP32 IO
             (VCC)-->(5V)
             (DATA)-->(27)
             (GND)-->(GND)
 * 
 * 实验现象:程序下载成功后,软件串口控制台间隔2S输出DHT11温湿度传感器采集的温度和湿度

 * 
 * 注意事项:
 */

#include "public.h"
#include "dht11.h"

u8 temp;        
u8 humi;
  
void setup(){
  Serial.begin(115200);
  while(DHT11_Init())  //检测是否纯在
  {
    Serial.printf("DHT11 Check Error!\r\n");
    delay(500);    
  }
  Serial.printf("DHT11 Check OK!\r\n");
}

void loop(){
  DHT11_Read_Data(&temp,&humi);
  Serial.printf("温度=%d°C  湿度=%d%%RH\r\n",temp,humi);
  delay(2000);
}

DHT11

#include "dht11.h"

//复位DHT11
void DHT11_Rst()     
{                 
  DHT11_MODE_OUT;   //SET OUTPUT
  DHT11_DQ_LOW;   //拉低DQ
  delay(20);     //拉低至少18ms
  DHT11_DQ_HIGH;   //DQ=1 
  delayMicroseconds(30);       //主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check()      
{   
  u8 retry=0;
  DHT11_MODE_IN;//SET INPUT  
  while (DHT11_READ&&retry<100)//DHT11会拉低40~50us
  {
    retry++;
    delayMicroseconds(1);
  };   
  if(retry>=100)return 1;
  else retry=0;
    while (!DHT11_READ&&retry<100)//DHT11拉低后会再次拉高40~50us
  {
    retry++;
    delayMicroseconds(1);
  };
  if(retry>=100)return 1;     
  return 0;
}

//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void)        
{
  u8 retry=0;
  while(DHT11_READ&&retry<100)//等待变为低电平 12-14us 开始
  {
    retry++;
    delayMicroseconds(1);
  }
  retry=0;
  while(!DHT11_READ&&retry<100)//等待变高电平   26-28us表示0,116-118us表示1
  {
    retry++;
    delayMicroseconds(1);
  }
  delayMicroseconds(40);//等待40us
  if(DHT11_READ)return 1;
  else return 0;       
}

//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)    
{        
  u8 i,dat;
  dat=0;
  for (i=0;i<8;i++) 
  {
      dat<<=1; 
      dat|=DHT11_Read_Bit();
    }               
    return dat;
}

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
  u8 buf[5];
  u8 i;
  DHT11_Rst();
  if(DHT11_Check()==0)
  {
    for(i=0;i<5;i++)//读取40位数据
    {
      buf[i]=DHT11_Read_Byte();
    }
    if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    {
      *humi=buf[0];
      *temp=buf[2];
    }
    
  }else return 1;
  return 0;     
}

//DHT11初始化 
//返回0:初始化成功,1:失败
u8 DHT11_Init(void)
{
  DHT11_Rst();
  return DHT11_Check();
}

//.h
#ifndef _dht11_H
#define _dht11_H

#include "public.h"

//DHT11管脚定义
#define dht11_pin   27

#define DHT11_DQ_LOW    digitalWrite(dht11_pin, LOW)
#define DHT11_DQ_HIGH   digitalWrite(dht11_pin, HIGH)
#define DHT11_READ      digitalRead(dht11_pin)

#define DHT11_MODE_IN   pinMode(dht11_pin, INPUT_PULLUP)
#define DHT11_MODE_OUT  pinMode(dht11_pin, OUTPUT)


//函数声明
void DHT11_IO_OUT(void);
void DHT11_IO_IN(void);
u8 DHT11_Init(void);
void DHT11_Rst(void);
u8 DHT11_Check(void);
u8 DHT11_Read_Bit(void);
u8 DHT11_Read_Byte(void);
u8 DHT11_Read_Data(u8 *temp,u8 *humi);


#endif

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

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

相关文章

Elasticsearch实战(三):Springboot实现Elasticsearch搜索推荐

文章目录 系列文章索引一、什么是搜索推荐二、新增测试数据三、搜索推荐的实现1、es官网2、Java实现搜索推荐3、总结 系列文章索引 Elasticsearch实战&#xff08;一&#xff09;&#xff1a;Springboot实现Elasticsearch统一检索功能 Elasticsearch实战&#xff08;二&#x…

Python asyncio 性能分析

文章目录 1. 工具1.1 cProfile2.1 yappi 2. 可视化2.1 SnakeViz2.2 gprof2dot 1. 工具 1.1 cProfile 一般对分析python性能的工具都会用cprofile。但是这玩意对多线程和asyncio的支持并不友好&#xff0c;如果用它对asyncio分析&#xff0c;会发现CPU都耗费在了poll上面&…

动态维护直径 || 动态维护树上路径 || 涉及LCA点转序列 || 对欧拉环游序用数据结构维护:1192B

https://www.luogu.com.cn/problem/CF1192B 对于直径的求法&#xff0c;常用dp或两次dfs&#xff0c;但如果要动态维护似乎都不太方面&#xff0c;那么可以维护树上路径最大值。 树上路径为&#xff1a; d e p u d e p v − 2 d e p l c a ( u , v ) dep_udep_v-2\times de…

如何实现AI的矢量数据库

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 然而&#xff0c;人工智能模型有点像美食厨师。他们可以创造奇迹&#xff0c;但他们需要优质的成分。人工智能模型在大多数输入上都做得很好&#xff0c;但如果它们以最优化的格式接收输入&#xff0c;它们就会真正…

Python的pymysql模块与MySQL数据库的互动:基础与实例

Python的pymysql模块与MySQL数据库的互动&#xff1a;基础与实例 一、连接数据库二、创建游标三、执行SQL命令四、关闭连接 在Python的世界里&#xff0c;操作MySQL数据库最常用的库就是pymysql。 pymysql是一个灵活且易于使用的库&#xff0c;它允许我们以Python的方式操作MyS…

网络安全研究和创新:探讨网络安全领域的最新研究成果、趋势和创新技术,以及如何参与其中。

第一章&#xff1a;引言 随着数字化时代的到来&#xff0c;网络安全变得比以往任何时候都更加重要。无论是个人、企业还是国家&#xff0c;都面临着日益复杂和隐蔽的网络威胁。为了确保我们的信息和资产的安全&#xff0c;网络安全研究变得至关重要。本文将深入探讨网络安全领…

搭建 Qt6 + Visual Studio 开发环境

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 在 Windows 中&#xff0c;如果想要开发 Qt 应用程序&#xff0c;可以选择多种方式&#xff1a; Qt Creator MinGW 编译器Qt Creator MSVC 编译器Visual Studio&#xff0…

【前车之鉴】: 2023最新教程-将java程序打包到maven私服的正确打开方式,详细流程介绍不怕你掌握不了

文章目录 为什么看这篇整体流程1. 注册账号【首次需要】2. 工单申请【新项目必须】3. 项目配置【新项目必须】4. 授权认证【新项目必须】5. 一键发布 最后也很重要 为什么看这篇 一是当前网络上一些博客有遗漏部分&#xff0c;这里做补充&#xff0c;二是网上思路没错&#xff…

Ansible自动化运维工具(二)

目录 &#xff08;6&#xff09;copy模块 &#xff08;7&#xff09;file模块 ​编辑​编辑&#xff08;8&#xff09;hostname模块 &#xff08;9&#xff09;ping模块 &#xff08;10&#xff09;yum 模块 &#xff08;11&#xff09;service/system模块 ​编辑 ​…

11.TIM定时中断

STM32标准库开发-总目录-传送门 目录 TIM简介 定时器类型 基本定时器 1.基本定时器时基单元 2.时基单元的工作流程 3.主模式触发DAC的功能 通用定时器 1.通用定时器与基本定时器异同 2.内外时钟源选择功能 3. 编码器接口功能 4.主从触发模式功能 5.输出比较功能 6…

Excel:通过Lookup函数提取指定文本关键词

函数公式&#xff1a;LOOKUP(9^9,FIND($G 2 : 2: 2:G 6 , C 2 ) , 6,C2), 6,C2),G 2 : 2: 2:G$6) 公式解释&#xff1a; lookup第一参数为9^9&#xff1a;代表的是一个极大值的数据&#xff0c;查询位置里面最接近这一个值的数据&#xff1b;lookup第二参数用find函数代替&am…

【ES】笔记-集合介绍与API

集合是一种不允许值重复的顺序数据结构。 通过集合我们可以进行并集、交集、差集等数学运算&#xff0c; 还会更深入的理解如何使用 ECMAScript 2015(ES2015)原生的 Set 类。 构建数据集合 集合是由一组无序且唯一(即不能重复)的项组成的。该数据结构使用了与有限集合相同的数…

基于AVR128单片机抢答器proteus仿真设计

一、系统方案 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void timer0_init() //定时器初始化 { TCCR00x07; //普通模式&#xff0c;OC0不输出&#xff0c;1024分频 TCNT0f_count; //初值&#xff0c;定时为10ms TIFR0x01; //清中断标志…

【单片机】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常见通信方式

在单片机开发中&#xff0c;UART、I2C、RS485等普遍在用&#xff0c;这里做一个简单的介绍 UART通用异步收发器 UART口指的是一种物理接口形式(硬件)。 UART是异步&#xff08;指不使用时钟同步&#xff0c;依靠帧长进行判断&#xff09;&#xff0c;全双工&#xff08;收发…

比较器的工作原理及性能指标介绍

一、什么是比较器 比较器的功能是比较两个或更多数据项&#xff0c;以确定它们是否相等&#xff0c;或者确定它们之间的大小关系和排列顺序&#xff0c;这称为比较。可以实现此比较功能的电路或设备称为比较器。比较器是将模拟电压信号与参考电压进行比较的电路。比较器的两个…

DHCP(自动获取IP地址技术)第六课

一 DHCP的概念 DHCP (Dynamic Host Configuration Protocol) 是一种自动分配IP地址和其他网络配置的网络协议。它允许设备在加入网络时自动获取所需的网络配置&#xff0c;如IP地址、子网掩码、默认网关、DNS服务器等。 DHCP通过中央服务器&#xff08;DHCP服务器&#xff09…

嵌套的列表推导式(可以转置行列)学习

代码练习 list1[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15] ] print(list1) result1[[list2[i] for list2 in list1] for i in range(len(list1[0]))] print(result1) result2[[list3[i] for list3 in result1] for i in range(len(result1[0]))] print(result2) zip-test pr…

TFTLCD液晶屏图标的显示

前言 &#xff08;1&#xff09;本系列是基于STM32的项目笔记&#xff0c;内容涵盖了STM32各种外设的使用&#xff0c;由浅入深。 &#xff08;2&#xff09;小编使用的单片机是STM32F105RCT6&#xff0c;项目笔记基于小编的实际项目&#xff0c;但是博客中的内容适用于各种单片…

视频智能分析平台EasyCVR安防视频汇聚平台助力森林公园防火安全的应用方案

一、研发背景 随着经济的发展和人们生活水平的提高&#xff0c;越来越多的人喜欢在周末去周边的森林公园旅游&#xff0c;享受大自然的美景&#xff0c;并进行野炊和烧烤等娱乐活动。然而&#xff0c;近年来由于烟蒂和烧烤碳渣等人为因素&#xff0c;森林公园火灾频繁发生。森…

Acwing796.子矩阵的和

理解二维前缀和&#xff1a; #include <iostream>using namespace std;const int N 1010;int a[N][N], s[N][N];int main() {int n, m, q;cin >> n >> m >> q;for (int i 1; i < n; i)for (int j 1; j < m; j) {scanf("%d", &a…