MicroPython基础知识总汇

2023-11-13

MicroPython的系统结构

MicroPython系统的经典结构由三部分组成,分别是微控制器硬件、MicroPython固件、用户程序

MicroPython支持的其它类型开发板,需要自己编译源代码,产生固件,并将固件下载到微控制器中才能运行MicroPython。(此内容我们后面会讲解到,千万别好高骛远!)

MicroPython连接电脑

STM32微控制器的pyboard系列的开发板,通常都是带有原生USB 功能的开发板,在通过USB连接计算机后,默认情况下会出现两个设备:

  1. 虚拟磁盘(MSD)
  2. 虚拟串口(USB Comm Port)

Windows系统的设备管理器中显示的pyboard设备

虚拟磁盘设备可自动被系统识别出来,就想普通的U盘一样,无论是Windows、Linux、MacOS,都会识别出一个可移动磁盘设备。如图虚拟磁盘和串口显示了Windows系统的设备管理器中发现的uPy microSD Flash USB Device磁盘设备。(如图:虚拟磁盘里面默认的四个文件

pyboard虚拟磁盘

如图虚拟磁盘的卷标是“PYBFLASH”,里面默认有4个文件。这个虚拟磁盘可以像普通的U盘一样使用,能够复制文件,存放程序和数据。我们可以将编写好的 Python 程序直接复制运行,系统复位后默认从 boot.py 加载基本参数,然后从main.py开始运行。(如图:虚拟磁盘里面默认的四个文件

pyboardUSB串口

正常情况下,串口识别出来后系统会多出一个pyboard USB Comm Port设备,具体的串口号与计算机已安装的其他设备有关。(如图:虚拟磁盘和串口)

虚拟磁盘里面pybcdc.inf文件有什么作用?

在Windows10、Linux、MacOS操作系统上(包括32位和64位操作系统),虚拟串口会自动识别,无须安装额外的驱动。但是在Win10以下的系统中,虚拟串口需要安装一个设备驱动文件才能被正确识别和使用。MicroPython的作者使用了一个非常巧妙的方法,将这个驱动文件放在了自带的虚拟磁盘中(文件名是pybcdc.inf),这样不用到网上下载就能直接安装了,非常方便。(如图:虚拟磁盘里面默认的四个文件

注:什么是原生USB功能?

串口是指利用串行方式传输数据的接口,它是一大类接口,USB接口、RS232接口、网线RJ45接口、RS485接口、SATA接口等等都属于串口。各种串口之间的通讯协议、接口电平等并不完全相同,因此有一种串口得到另一种串口时需要转换。一般来说,串口默认是指RS232接口,所谓的USB转串口实际上就是USB转RS232装置。USB接口隶属于串口。而所谓原生,指的是芯片自身提供的接口。

虚拟磁盘和串口:

 

 虚拟磁盘:

 

 

 虚拟磁盘里面默认的四个文件:

调试工具

MicroPython和PC的标准连接是通过USB接口,使用虚拟磁盘和虚拟串口(VCP)方式。其中虚拟串口(在pyboard和STM32上可以同时使用USB虚拟串口和物理串口两种方式)是调试中最常用的方式,无须频繁复制文件避免造成Flash的损耗。

虚拟串口

USB虚拟串口通信是USB设备使用CDC类在主机上虚拟出一个串口来。在主机上使用完全和标准串口一样。CDC类定义的是设备上下文对象的类。(了解一下就行,不必深究

REPL人机交互

在MicroPython上我们使用串口终端软件和MicroPython的REPL进行交互,发送命令。通过串口终端软件,我们可以方便地在 REPL(Read Evaluate Print Loop)中输入代码,运行和调试程序,打印结果。

Putty串口终端软件

怎样打开REPL人机交互界面? 可以使用Putty串口终端软件打开

其它常用的终端软件有:

Windows
● 超级终端(WinXP,可以在Win7/Win10下使用)
● putty
● kitty
● SecureCRT
● MobaXterm
Linux
● putty
● screen
● picocom
● minicom
MacOS
● screen

MicroPython已经移植到了很多硬件平台上,有很多不同的移植版本。但是无论哪种MicroPython的移植版本,对于串口参数的设置都是一样的:

 特别要注意流量控制(Flow Control)参数,很多软件默认使用硬件方式或者Xon/Xoff,在使用MicroPython时需要改为None,否则在有的终端软件中将无法输入数据。

putty串口终端软件:

 注:

● REPL可以和虚拟串口或者标准串口通信,它们的串口参数是一样的。

● 在一些操作系统中,虚拟串口的波特率可以随便设置,效果和设置为115200的相同。因为虚拟串口没有真正的物理串口信号,是通过驱动程序转换USB的数据。

● 极少数的 MicroPython 移植版因为硬件限制使用了不同的波特率,如Ameba RTL8915A开发板使用波特率为38400。

USB串口 = 虚拟串口 + 物理串口

 上面我们有提到的虚拟串口和物理串口,其实就是USB串口,我们后面就直接叫做USB串口。我们不管它是虚拟串口还是物理串口,只要知道它就是一个USB串口,功能是通讯和数据传输,需要设置波特率和串口号就行,具体细分时再考虑虚拟串口和物理串口的区别,省的自己稀里糊涂。

打开REPL人机交互界面

在Putty里面按图(putty串口终端软件)设置好波特率和串口的端口号,然后回车就会进入REPL人机交互界面:(你可以按ctrl + c 或 ctrl + b测试是否连接上pyboard,连接上了就会有一串英文字符出现)

 成功连接:

 

MicroPython v1.11 on 2019-05-29; PYBv1.1 with STM32F405RG
Type "help()" for more information.

 

MicroPython的REPL(read-evaluate-print-loop)

REPL是Read-Evaluate-Print Loop(读取-计算-输出循环)的缩写。很多编程语言都带有REPL(名称可能不完全相同),它像是一个小型的Shell,可以方便地在解释器(内核)和命令之间交互,可以方便输入各种命令,观察运行状态,因此在程序调试的时候能够起到非常大的作用。

Python语言的REPL功能非常强大,MicroPython虽然是一个微型的Python,但是它的REPL功能同样强大,通过REPL交互环境,我们可以访问pyboard,输入程序,测试代码,查找问题,查看帮助,查看磁盘文件……因为MicroPython是面向嵌入式应用的,所以MicroPython的REPL与Python的标准REPL相比,还有一些差异,快捷键不同,还提供了额外的功能和用法,如果熟练掌握这些功能就可以帮助我们更好地使用MicroPython。

快捷键的好处:在 REPL 提供了不少快捷键,使用这些快捷键可以有效减少按键的次数,提高代码输入效率。

REPL的快捷键:

 使用help()函数

在Python中可以使用help()函数查看简单的帮助,在MicroPython中同样支持help()函数。在REPL下直接输入help(),可以显示基本的帮助界面,内容是pyboard基本函数和REPL用法,可以帮助我们了解基本的命令和函数。

>>> help()
Welcome to MicroPython!

For online help please visit http://micropython.org/help/.

Quick overview of commands for the board:
  pyb.info()    -- print some general information
  pyb.delay(n)  -- wait for n milliseconds
  pyb.millis()  -- get number of milliseconds since hard reset
  pyb.Switch()  -- create a switch object
                   Switch methods: (), callback(f)
  pyb.LED(n)    -- create an LED object for LED n (n=1,2,3,4)
                   LED methods: on(), off(), toggle(), intensity(<n>)
  pyb.Pin(pin)  -- get a pin, eg pyb.Pin('X1')
  pyb.Pin(pin, m, [p]) -- get a pin and configure it for IO mode m, pull mode p
                   Pin methods: init(..), value([v]), high(), low()
  pyb.ExtInt(pin, m, p, callback) -- create an external interrupt object
  pyb.ADC(pin)  -- make an analog object from a pin
                   ADC methods: read(), read_timed(buf, freq)
  pyb.DAC(port) -- make a DAC object
                   DAC methods: triangle(freq), write(n), write_timed(buf, freq)
  pyb.RTC()     -- make an RTC object; methods: datetime([val])
  pyb.rng()     -- get a 30-bit hardware random number
  pyb.Servo(n)  -- create Servo object for servo n (n=1,2,3,4)
                   Servo methods: calibration(..), angle([x, [t]]), speed([x, [t]])
  pyb.Accel()   -- create an Accelerometer object
                   Accelerometer methods: x(), y(), z(), tilt(), filtered_xyz()

Pins are numbered X1-X12, X17-X22, Y1-Y12, or by their MCU name
Pin IO modes are: pyb.Pin.IN, pyb.Pin.OUT_PP, pyb.Pin.OUT_OD
Pin pull modes are: pyb.Pin.PULL_NONE, pyb.Pin.PULL_UP, pyb.Pin.PULL_DOWN
Additional serial bus objects: pyb.I2C(n), pyb.SPI(n), pyb.UART(n)

Control commands:
  CTRL-A        -- on a blank line, enter raw REPL mode
  CTRL-B        -- on a blank line, enter normal REPL mode
  CTRL-C        -- interrupt a running program
  CTRL-D        -- on a blank line, do a soft reset of the board
  CTRL-E        -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')
>>>

可以通过 help(模块名或函数名)查看更详细的帮助,如查看 pyb 模块的详细帮助:

>>> help(pyb)
object <module 'pyb'> is of type module
  __name__ -- pyb
  fault_debug -- <function>
  bootloader -- <function>
  hard_reset -- <function>
  info -- <function>
  unique_id -- <function>
  freq -- <function>
  repl_info -- <function>
  wfi -- <function>
  disable_irq -- <function>
  enable_irq -- <function>
  stop -- <function>
  standby -- <function>
  main -- <function>
  repl_uart -- <function>
  usb_mode -- <function>
  hid_mouse -- (1, 2, 4, 8, b'\x05\x01\t\x02\xa1\x01\t\x01\xa1\x00\x05\t\x19\x01)\x03\x15\x00%\x01\x95\x03u\x01\x81\x02\x95\x01u\x05\x81\x01\x05\x01\t0\t1\t8\x15\x81%\x7fu\x08\x95\x03\x81\x06\xc0\t<\x05\xff\t\x01\x15\x00%\x01u\x01\x95\x02\xb1"u\x06\x95\x01\xb1\x01\xc0')
  hid_keyboard -- (1, 1, 8, 8, b'\x05\x01\t\x06\xa1\x01\x05\x07\x19\xe0)\xe7\x15\x00%\x01u\x01\x95\x08\x81\x02\x95\x01u\x08\x81\x01\x95\x05u\x01\x05\x08\x19\x01)\x05\x91\x02\x95\x01u\x03\x91\x01\x95\x06u\x08\x15\x00%e\x05\x07\x19\x00)e\x81\x00\xc0')
  USB_VCP -- <class 'USB_VCP'>
  USB_HID -- <class 'USB_HID'>
  have_cdc -- <function>
  hid -- <function>
  millis -- <function>
  elapsed_millis -- <function>
  micros -- <function>
  elapsed_micros -- <function>
  delay -- <function>
  udelay -- <function>
  sync -- <function>
  mount -- <function>
  dht_readinto -- <function>
  Timer -- <class 'Timer'>
  rng -- <function>
  RTC -- <class 'RTC'>
  Pin -- <class 'Pin'>
  ExtInt -- <class 'ExtInt'>
  pwm -- <function>
  servo -- <function>
  Servo -- <class 'Servo'>
  Switch -- <class 'Switch'>
  Flash -- <class 'Flash'>
  SD -- <SDCard>
  SDCard -- <class 'SDCard'>
  LED -- <class 'LED'>
  I2C -- <class 'I2C'>
  SPI -- <class 'SPI'>
  UART -- <class 'UART'>
  CAN -- <class 'CAN'>
  ADC -- <class 'ADC'>
  ADCAll -- <class 'ADCAll'>
  DAC -- <class 'DAC'>
  Accel -- <class 'Accel'>
  LCD -- <class 'LCD'>

 还可以进一步查看pyb内部模块的帮助:

>>> help(pyb.Pin)
object <class 'Pin'> is of type type
  init -- <function>
  value -- <function>
  off -- <function>
  on -- <function>
  irq -- <function>
  low -- <function>
  high -- <function>
  name -- <function>
  names -- <function>
  af_list -- <function>
  port -- <function>
  pin -- <function>
  gpio -- <function>
  mode -- <function>
  pull -- <function>
  af -- <function>
  mapper -- <classmethod>
  dict -- <classmethod>
  debug -- <classmethod>
  board -- <class 'board'>
  cpu -- <class 'cpu'>
  IN -- 0
  OUT -- 1
  OPEN_DRAIN -- 17
  ALT -- 2
  ALT_OPEN_DRAIN -- 18
  ANALOG -- 3
  PULL_UP -- 1
  PULL_DOWN -- 2
  IRQ_RISING -- 269549568
  IRQ_FALLING -- 270598144
  OUT_PP -- 1
  OUT_OD -- 17
  AF_PP -- 2
  AF_OD -- 18
  PULL_NONE -- 0
  AF1_TIM1 -- 1
  AF1_TIM2 -- 1
  AF2_TIM3 -- 2
  AF2_TIM4 -- 2
  AF2_TIM5 -- 2
  AF3_TIM10 -- 3
  AF3_TIM11 -- 3
  AF3_TIM8 -- 3
  AF3_TIM9 -- 3
  AF4_I2C1 -- 4
  AF4_I2C2 -- 4
  AF5_SPI1 -- 5
  AF5_SPI2 -- 5
  AF7_USART1 -- 7
  AF7_USART2 -- 7
  AF7_USART3 -- 7
  AF8_UART4 -- 8
  AF8_USART6 -- 8
  AF9_CAN1 -- 9
  AF9_CAN2 -- 9
  AF9_TIM12 -- 9
  AF9_TIM13 -- 9
  AF9_TIM14 -- 9

  甚至可以一级一级深入查看,如:

>>> help(pyb.Pin.board)
object <class 'board'> is of type type
  X1 -- Pin(Pin.cpu.A0, mode=Pin.OUT)
  X2 -- Pin(Pin.cpu.A1, mode=Pin.OUT)
  X3 -- Pin(Pin.cpu.A2, mode=Pin.IN)
  X4 -- Pin(Pin.cpu.A3, mode=Pin.IN)
  X5 -- Pin(Pin.cpu.A4, mode=Pin.IN)
  X6 -- Pin(Pin.cpu.A5, mode=Pin.IN)
  X7 -- Pin(Pin.cpu.A6, mode=Pin.IN)
  X8 -- Pin(Pin.cpu.A7, mode=Pin.IN)
  X9 -- Pin(Pin.cpu.B6, mode=Pin.OUT)
  X10 -- Pin(Pin.cpu.B7, mode=Pin.IN)
  X11 -- Pin(Pin.cpu.C4, mode=Pin.IN)
  X12 -- Pin(Pin.cpu.C5, mode=Pin.IN)
  X17 -- Pin(Pin.cpu.B3, mode=Pin.IN, pull=Pin.PULL_UP)
  X18 -- Pin(Pin.cpu.C13, mode=Pin.IN)
  X19 -- Pin(Pin.cpu.C0, mode=Pin.IN)
  X20 -- Pin(Pin.cpu.C1, mode=Pin.IN)
  X21 -- Pin(Pin.cpu.C2, mode=Pin.IN)
  X22 -- Pin(Pin.cpu.C3, mode=Pin.IN)
  Y1 -- Pin(Pin.cpu.C6, mode=Pin.OUT)
  Y2 -- Pin(Pin.cpu.C7, mode=Pin.OUT)
  Y3 -- Pin(Pin.cpu.B8, mode=Pin.IN)
  Y4 -- Pin(Pin.cpu.B9, mode=Pin.IN)
  Y5 -- Pin(Pin.cpu.B12, mode=Pin.IN)
  Y6 -- Pin(Pin.cpu.B13, mode=Pin.IN)
  Y7 -- Pin(Pin.cpu.B14, mode=Pin.IN)
  Y8 -- Pin(Pin.cpu.B15, mode=Pin.IN)
  Y9 -- Pin(Pin.cpu.B10, mode=Pin.IN)
  Y10 -- Pin(Pin.cpu.B11, mode=Pin.IN)
  Y11 -- Pin(Pin.cpu.B0, mode=Pin.IN)
  Y12 -- Pin(Pin.cpu.B1, mode=Pin.IN)
  SW -- Pin(Pin.cpu.B3, mode=Pin.IN, pull=Pin.PULL_UP)
  LED_RED -- Pin(Pin.cpu.A13, mode=Pin.OUT)
  LED_GREEN -- Pin(Pin.cpu.A14, mode=Pin.OUT)
  LED_YELLOW -- Pin(Pin.cpu.A15, mode=Pin.OUT)
  LED_BLUE -- Pin(Pin.cpu.B4, mode=Pin.OUT)
  MMA_INT -- Pin(Pin.cpu.B2, mode=Pin.IN)
  MMA_AVDD -- Pin(Pin.cpu.B5, mode=Pin.OUT)
  SD_D0 -- Pin(Pin.cpu.C8, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_D1 -- Pin(Pin.cpu.C9, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_D2 -- Pin(Pin.cpu.C10, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_D3 -- Pin(Pin.cpu.C11, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_CMD -- Pin(Pin.cpu.D2, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD_CK -- Pin(Pin.cpu.C12, mode=Pin.ALT, pull=Pin.PULL_UP, af=12)
  SD -- Pin(Pin.cpu.A8, mode=Pin.IN, pull=Pin.PULL_UP)
  SD_SW -- Pin(Pin.cpu.A8, mode=Pin.IN, pull=Pin.PULL_UP)
  USB_VBUS -- Pin(Pin.cpu.A9, mode=Pin.IN)
  USB_ID -- Pin(Pin.cpu.A10, mode=Pin.ALT_OPEN_DRAIN, pull=Pin.PULL_UP, af=10)
  USB_DM -- Pin(Pin.cpu.A11, mode=Pin.ALT, af=10)
  USB_DP -- Pin(Pin.cpu.A12, mode=Pin.ALT, af=10)
>>>

 如果能够灵活使用help()函数,就可以查看大部分函数的基本用法和很多常量定义,甚至不需要看手册就能知道用法。

查看模块包含的变量和函数--dir()

有时候,我们需要了解一个模块内部有哪些变量和函数,在Python中是通过dir()函数查看,在MicroPython中同样也支持dir()。使用dir(),可以快速查看系统当前已经导入了哪些模块和变量

>>> import pyb
>>> import math
>>> import os
>>> dir()
['os', 'start1', 'run', 'x1', '__name__', 'Pin', 'flag', 'Timer', 'x2', 'Echo', 'start', 'y1', 'left', 'back', 'y2', 'num', 'math', 'stop', 'Trig', 'stop1', 'pyb', 'go', 'right', 'machine']
>>>

 善用help()和dir()函数,可以在调试和输入代码时,帮助我们查看内部的变量和函数名称,了解模块的功能和用法。

 硬件平台之Pyboard

通常情况下,pyboard指的是MicroPython官方设计的开发板,如PYB V1.0 (也可写为PVB V10)、PYBV1.1(也可写为PVB V11)、PYBV3、PYBV4、PYB Lite 等。这些开发板的硬件和外形结构类似,功能差别也很小,主要差别在于是否带有加速度传感器、LED的数量、PCB的布局等。

但是因为 MicroPython 已经移植到了很多其他 STM32 开发板上(如STM32F4系列Nucleo开发板、STM32F4系列Discovery开发板),并且在这些STM32的开发板运行MicroPython时,基本功能和用法都类似,所以我们也可以把这些开发板称为pyboard。

 

那如何查看板子的型号:在REPL里面按ctrl + b(如果按不出来就先按ctrl + c 停止当前板子程序运行,特别是程序里面存在while循环时)就会显示你板子的型号引脚芯片的型号。

>>>
MicroPython v1.11 on 2019-05-29; PYBv1.0 with STM32F405RG
Type "help()" for more information.
>>>

 我这个板子的型号是PYBv1.0,芯片是STM32F405RG。

 官方的 pyboard(PYBv1x 系列)使用了 64 脚 LQFP64 封装的高性能STM32F405RGT6微控制器,它的主要特点有:

● 1MB Flash和196KB SRAM
● 168MHz主频
● RTC实时时钟
● 51个通用GPIO
● 17个定时器
● 多路PWM输出
● 16路ADC输入
● 2路DAC输出
● 3个I2C接口
● 4个UART接口
● 3个SPI接口
● 一个USB2.0全速接口
● 2个CAN接口
● SDIO接口
● 硬件随机数发生器
● 唯一ID号
● 1.8~3.6V工作电压
pyboard的主要功能:
● 一个复位按键
● 一个用户按键
● 4个不同颜色的LED(其中两个带有亮度调节功能)
● MMA7660C三轴加速度传感器
● microSD插座

除了 MicroPython 软件是开源的,pyboard 的硬件同样也是开源的。在github相关资料:https://github.com/RT-Thread-packages/micropython

原理图:https://micropython.org/resources/PYBv11.pdf

PYB V10使用了PA13、PA14、PA15、PB4四个GPIO控制LED,每个LED的颜色都不同。其中PA15也是TIM2_CH1,PB4是TM3_CH1,所以这两个GPIO支持PMW功能,可以通过调整PWM输出占空比改变LED的亮度。另外两个LED不支持亮度调节功能。

 MCU

   LED(1-4)

   三轴加速器

   SD存储卡

   Power电源分配

  引出的I/0口端子

 

用户按键SW2使用PB3,通过内部上拉电阻连接到VCC,按下SW2时PB3输入低电平。不过因为PB3上没有电容去抖(可以自己增加一个0.1μF的电容),所以在按键时容易出现抖动问题。

加速度传感器MMA7660连接到MCU的I2C1上,传感器的中断输出连接PB2,传感器的模拟电源通过 PB5 提供(这是因为传感器的功耗很低,需要的电流很小)。这样就可以通过PB5控制传感器是否工作了。

microSD连接到MCU的SDIO接口上,因此PYB V10访问SD卡的速度并不慢,比通过SPI方式快很多,而PA8用于检测SD卡是否插入。

系统主时钟由 8MHz 的外部无源振荡器提供,也可以使用其他频率的时钟(4-26MHz),但是频率必须是整数倍,这样才能支持USB功能。而32kHz晶体为系统提供RTC时钟信号。

PYB V10的四周是用于扩展的接口,使用了2.54mm的标准间距,可以焊接排针或者排母。官方开发板上使用的是排母,可以连接液晶、蜂鸣器、触摸按键等专用扩展板。不过焊接排针更适合使用杜邦线连接到各种传感器。

 


 

编译器:uPyCraft IDE (Windows)

 下一章节Pyboard基本功能快速浏览

转载于:https://www.cnblogs.com/iBoundary/p/11493941.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MicroPython基础知识总汇 的相关文章

随机推荐

  • 区块链技术概述

    什么是区块链 最通俗易懂的解释 哔哩哔哩 bilibili 区块链是随着比特币等数字加密货币的日益普及而逐渐兴起的一种全新的去中心化基础架构与分布式计算范式 区块链技术具有去中心化 时序数据 集体维护 可编程和安全可信等特点 特别适合构建可
  • 梅克尔树Merkle trees是什么?(以太坊)

    http www btckan com news topic 14827 梅克尔树 Merkle trees 是区块链的基本组成部分 虽说从理论上来讲 没有梅克尔树的区块链当然也是可能的 你只需创建直接包含每一笔交易的巨大区块头 block
  • 研究查阅资料所用到的网站备份

    1 liberary genesis http libgen is 免费下载各种论文 英文原版书 2 semantic scholar https www semanticscholar org 可查询英文论文的影响因子 引用信息 可根据一
  • ES6标准

    ECMAScript 6 0 以下简称 ES6 是 JavaScript 语言的下一代标准 前端es6是模块化开发 es6模块化规范就是浏览器端与服务器端通用的模块化开发规范 其中定义了每一个JavaScript文件都是一个独立的模块 导入
  • mysql 中null和default null,char和varchar,int和integer区别

    default null 和null 区别 default null 指的是 默认值为null int和integer 区别 int和integer 没有区别 char和varchar 区别 char和varchar都是用来存储字符串的 但
  • elementUI-dropdown点击非按钮区域,弹出下拉框

    如下代码 设计到的知识点 dropdown下拉框 点击按钮弹出 点击图片也要弹出 涉及到 js触发按钮点击事件 function load document getElementById target click 一行5个li 随之屏幕的宽
  • redis整体删除,整个hash删除,批量删除,单个删除,正则删除

    对于redis的hash数据结构的删除 pool redis ConnectionPool host 127 0 0 1 port 6381 db 0 decode responses True r redis Redis connecti
  • stm32通过I2C实现温湿度(AHT20)采集

    文章目录 一 环境配置 二 I2C总线通信协议 1 I2C介绍 2 I2C物理层 3 I2C协议层 4 软件IIC和硬件IIC 三 实现AHT20采集程序 1 硬件连接 2 代码实现 四 效果展示 五 总结 六 参考资料 一 环境配置 软件
  • 【LeetCode刷题】 27 移除元素 -java

    题目 给你一个数组 nums 和一个值 val 你需要 原地 移除所有数值等于 val 的元素 并返回移除后数组的新长度 不要使用额外的数组空间 你必须仅使用 O 1 额外空间并 原地 修改输入数组 元素的顺序可以改变 你不需要考虑数组中超
  • Axure插件axure-chrome-extension安装

    chrome浏览器打开axure生成的HTML静态文件页面预览打开如下图显示 这是因为chrome浏览器没有安装Axure插件axure chrome extension导致的 方式一 先下载Axure谷歌浏览器插件 然后在浏览器中添加扩展
  • 使用charles map remote host

    应用场景 a 某个后端Dev在他本地分支有一些代码改动 Bug fix 在未部署的情况下 通过remote map可以提前测试验证其个人分支 b APP进入prod测试阶段 有一些H5页面Prod环境一经部署会直接影响线上用户 因此H5 前
  • 锤子手机系统位置服务器,两种锤子系统安装方法【图文详解】

    很多用安卓手机的人都知道 锤子 系统界面和其他 苹果 和安卓系统的界面是不一样的 锤子 系统界面应用在安卓手机上显示的是重新画的应用图标 整体上还是很好看的 完全比的上苹果系统界面 大家如果看烦了安卓原桌面不防去刷个锤子系统来玩玩 下面我告
  • [python学习笔记] - Pandas的SettingwithCopy分析

    警告信息 当我尝试修改dataframe或者对其赋值时 出现了警告信息 A value is trying to be set on a copy of a slice from a DataFrame Try using loc row
  • grafana导入prometheus

    grafana 简介 grafana是用于可视化大型测量数据的开源程序 他提供了强大和优雅的方式去创建 共享 浏览数据 dashboard中显示了你不同metric数据源中的数据 Grafana是一个开源的 拥有丰富dashboard和图表
  • 3D变形几何体匹配

    文章目录 Halcon 3D匹配之变形几何体匹配 算子说明 1 变形几何体匹配过程中 需要指定参考点 作为变形体匹配参考 2 将示例的形变特征添加到可变性几何体上 3 将刚性几何体转变为可变性几何体 曲面 4 在3D场景中找到一个可变性几何
  • 《C++ primer》练习3.20:输出vector相邻元素的和&输出vector头尾对象的和

    最近看 C primer 有这样一个题目 输出vector相邻元素的和 读入一组整数并把它们存入一个vector对象 将每对相邻整数的和输出出来 这里要注意输入的奇数个和偶数个的数的区别 偶数个整数的话刚好数全部用完 奇数个整数最后一个数空
  • CCNA课程之 交换机划分VLAN

    拓扑 需求 1 设置SW1和SW2的设备名分别为SW1和SW2 2 按拓扑图所示配置PC1 4的IP地址 3 交换机按图示配置各终端所属的相应vlan 并且进行合理的配置使得同vlan间PC可以相互访问 不同vlan间PC不可以相互访问 不
  • 【华为OD统一考试B卷

    在线OJ 本题通过率100 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1
  • 【HTML】前端必须要知道的html中的meta标签,有哪些属性?

    概览 meta标签一般放在整个html页面的head部分 是在head区域中的一个辅助性标签 不包含任何内容 用于提供有关页面的元信息 比如针对搜索引擎和更新频度的描述和关键词 meta标签的属性定义了与文档相关联的名称 值对 在MDN中对
  • MicroPython基础知识总汇

    MicroPython的系统结构 MicroPython系统的经典结构由三部分组成 分别是微控制器硬件 MicroPython固件 用户程序 MicroPython支持的其它类型开发板 需要自己编译源代码 产生固件 并将固件下载到微控制器中