MicroPython+ESP32 C3+ST7735S LCD屏 WIFI联网显示实时时间

案例地址:https://gitee.com/whltaoin_admin/MP_ESP32_ST7735S-

展示效果

ESP32+LCD屏 WIFI联网并显示实时时间

image.png
image.png

TFT LCD模块参数介绍

image.png
image.png

  1. 名称:1.8 128*160 RGB_TFT
  2. 驱动芯片:ST7735S

ESP32 C3 参数介绍(经典款)

  1. 外观及引脚分布

image.png

接线

LCD屏接口功能ESP32 C3 对应连接引脚
GND电源(接地)GND
VCC电源(正极3.3V)3.3V
SCLSPI时钟线(与单片机SPI_CLK对接)IO02
SDASPI数据线(与单片机SPI_MOSI对接)IO03
RES复位IO10
DC数据/命令IO06
CSSPI片选IO07
BL背光控制开发,默认可不接IO08

项目初始化

一、项目结构

image.png

boot.py:用于连接WIFI,打印初始化信息等。
font.bmf: 文字库
st7735.py: ST7735驱动
test.py: 测试效果文件
ufont.py: 字体文件

二、st7735.py

"""
使用方法(以合宙ESP32C3为例):from machine import SPI, Pinfrom st7735 import ST7735spi = SPI(1, 30000000, sck=Pin(2), mosi=Pin(3))ST7735(spi, rst=10, dc=6, cs=7, bl=11, width=160, height=80, rotate=1)  # 直插横屏显示ST7735(spi, rst=10, dc=6, cs=7, bl=11, width=160, height=80, rotate=0)  # 直插竖屏显示
"""
import gc
import time
import mathimport machine
import framebuf
from micropython import constSWRESET = const(0x01)
SLPOUT = const(0x11)
NORON = const(0x13)INVOFF = const(0x20)
DISPON = const(0x29)
CASET = const(0x2A)
RASET = const(0x2B)
RAMWR = const(0x2C)MADCTL = const(0x36)
COLMOD = const(0x3A)FRMCTR1 = const(0xB1)
FRMCTR2 = const(0xB2)
FRMCTR3 = const(0xB3)INVCTR = const(0xB4)PWCTR1 = const(0xC0)
PWCTR2 = const(0xC1)
PWCTR3 = const(0xC2)
PWCTR4 = const(0xC3)
PWCTR5 = const(0xC4)
VMCTR1 = const(0xC5)GMCTRP1 = const(0xE0)
GMCTRN1 = const(0xE1)ROTATIONS = [0x00,0x60]  # 只给了两个旋转方向def color(r, g, b):i = (((b & 0xF8) << 8) | ((g & 0xFC) << 3) | (r >> 3)).to_bytes(2, "little")return (i[0] << 8) + i[1]RED = color(255, 0, 0)
GREEN = color(0, 255, 0)
BLUE = color(0, 0, 255)
WHITE = color(255, 255, 255)
BLACK = color(0, 0, 0)class ST7735(framebuf.FrameBuffer):def __init__(self, spi, rst, dc, cs, bl=None, width=None, height=None, offset=None, rotate=1, rgb=True):""":param spi::param rst::param dc::param cs: 使能:param bl: 背光:param width: 宽度:param height: 高度:param offset: 偏移 (x, y): (23, -1)|(-1, 23):param rotate: 旋转 0 横屏 1 竖屏:param rgb: RGB 色彩模式"""# 根据方向自动设置偏移self.rotate = rotateself.offset = offsetself.rgb = rgbif offset is None and rotate == 1:self.offset = (-1, 23)elif offset is None and rotate == 0:self.offset = (23, -1)self.width = widthself.height = heightself.spi = spiself.rst = machine.Pin(rst, machine.Pin.OUT, machine.Pin.PULL_DOWN)self.dc = machine.Pin(dc, machine.Pin.OUT, machine.Pin.PULL_DOWN)self.cs = machine.Pin(cs, machine.Pin.OUT, machine.Pin.PULL_DOWN)if bl is not None:self.bl = machine.PWM(machine.Pin(bl))gc.collect()self.buffer = bytearray(self.height * self.width * 2)super().__init__(self.buffer, self.width, self.height, framebuf.RGB565)self.init()self.set_windows()self.clear()def set_windows(self, x_start=None, y_start=None, x_end=None, y_end=None):"""设置窗口:return:"""x_start = (x_start + self.offset[0] + 1) if x_start is not None else (self.offset[0] + 1)x_end = x_end + self.rotate + self.offset[0] if x_end is not None else self.width + self.rotate + \self.offset[0]y_start = y_start + self.offset[1] + 1 if y_start is not None else self.offset[1] + 1y_end = y_end + self.rotate + self.offset[1] if y_end is not None else self.height + self.rotate + \self.offset[1]self.write_cmd(CASET)self.write_data(bytearray([0x00, x_start, 0x00, x_end]))self.write_cmd(RASET)self.write_data(bytearray([0x00, y_start, 0x00, y_end]))self.write_cmd(RAMWR)def init(self):self.reset()self.write_cmd(SWRESET)time.sleep_us(150)self.write_cmd(SLPOUT)time.sleep_us(300)self.write_cmd(FRMCTR1)self.write_data(bytearray([0x01, 0x2C, 0x2D]))self.write_cmd(FRMCTR2)self.write_data(bytearray([0x01, 0x2C, 0x2D]))self.write_cmd(FRMCTR3)self.write_data(bytearray([0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D]))time.sleep_us(10)self.write_cmd(INVCTR)self.write_data(bytearray([0x07]))self.write_cmd(PWCTR1)self.write_data(bytearray([0xA2, 0x02, 0x84]))self.write_cmd(PWCTR2)self.write_data(bytearray([0xC5]))self.write_cmd(PWCTR3)self.write_data(bytearray([0x0A, 0x00]))self.write_cmd(PWCTR4)self.write_data(bytearray([0x8A, 0x2A]))self.write_cmd(PWCTR5)self.write_data(bytearray([0x8A, 0xEE]))self.write_cmd(VMCTR1)self.write_data(bytearray([0x0E]))self.write_cmd(INVOFF)self.write_cmd(MADCTL)self.write_data(bytearray([ROTATIONS[self.rotate] | 0x00 if self.rgb else 0x08]))self.write_cmd(COLMOD)self.write_data(bytearray([0x05]))self.write_cmd(GMCTRP1)self.write_data(bytearray([0x02, 0x1c, 0x07, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29, 0x25, 0x2b, 0x39, 0x00, 0x01, 0x03, 0x10]))self.write_cmd(GMCTRN1)self.write_data(bytearray([0x03, 0x1d, 0x07, 0x06, 0x2e, 0x2c, 0x29, 0x2d, 0x2e, 0x2e, 0x37, 0x3f, 0x00, 0x00, 0x02, 0x10]))self.write_cmd(NORON)time.sleep_us(10)self.write_cmd(DISPON)time.sleep_us(100)self.cs(1)def reset(self):"""设备重置:return:"""self.rst(1)time.sleep(0.2)self.rst(0)time.sleep(0.2)self.rst(1)time.sleep(0.2)def write_cmd(self, cmd):self.dc(0)self.cs(0)self.spi.write(bytearray([cmd]))self.cs(1)def write_data(self, buf):self.dc(1)self.cs(0)self.spi.write(buf)self.cs(1)def back_light(self, value):"""背光调节:param value: 背光���级 0 ~ 256:return:"""self.bl.freq(1000)if value >= 0xff:value = 0xffdata = value * 0xffff >> 8self.bl.duty_u16(data)def clear(self):"""清屏:return:"""self.fill(0)self.show()def show(self):"""显示:return:"""self.set_windows()  # 如果没有这行就会偏移self.write_data(self.buffer)def circle(self, center, radius, c=color(255, 255, 255), section=100):"""画圆:param c: 颜色:param center: 中心(x, y):param radius: 半径:param section: 分段:return:"""arr = []for m in range(section + 1):x = round(radius * math.cos((2 * math.pi / section) * m - math.pi) + center[0])y = round(radius * math.sin((2 * math.pi / section) * m - math.pi) + center[1])arr.append([x, y])for i in range(len(arr) - 1):self.line(*arr[i], *arr[i + 1], c)def image(self, file_name):with open(file_name, "rb") as bmp:for b in range(0, 80 * 160 * 2, 1024):self.buffer[b:b + 1024] = bmp.read(1024)self.show()

三、ufont.py

__version__ = 3import time
import structimport framebufDEBUG = Falsedef timeit(f, *args, **kwargs):try:myname = str(f).split(' ')[1]except:myname = "UNKONW"def new_func(*args, **kwargs):if DEBUG:try:t = time.ticks_us()result = f(*args, **kwargs)delta = time.ticks_diff(time.ticks_us(), t)print('Function {} Time = {:6.3f}ms'.format(myname, delta / 1000))except AttributeError:t = time.perf_counter_ns()result = f(*args, **kwargs)delta = time.perf_counter_ns() - tprint('Function {} Time = {:6.3f}ms'.format(myname, delta / 1000000))return resultelse:return f(*args, **kwargs)return new_funcclass BMFont:@staticmethoddef _list_to_byte(arr):b = 0for a in arr:b = (b << 1) + areturn bytes([b])@timeitdef _bit_list_to_byte_data(self, bit_list):"""将点阵转换为字节数据Args:bit_list:Returns:"""byte_data = b''for _col in bit_list:for i in range(0, len(_col), 8):byte_data += self._list_to_byte(_col[i:i + 8])return byte_data@timeitdef __init__(self, font_file):self.font_file = font_fileself.font = open(font_file, "rb", buffering=0xff)self.bmf_info = self.font.read(16)if self.bmf_info[0:2] != b"BM":raise TypeError("字体文件格式不正确: " + font_file)self.version = self.bmf_info[2]if self.version != 3:raise TypeError("字体文件版本不正确: " + str(self.version))self.map_mode = self.bmf_info[3]  # 映射方式self.start_bitmap = struct.unpack(">I", b'\x00' + self.bmf_info[4:7])[0]  # 位图开始字节self.font_size = self.bmf_info[7]  # 字体大小self.bitmap_size = self.bmf_info[8]  # 点阵所占字节@timeitdef _to_bit_list(self, byte_data, font_size, *, _height=None, _width=None):"""将字节数据转��为点阵数据Args:byte_data: 字节数据font_size: 字号大小_height: 字体原高度_width: 字体原宽度Returns:"""_height = _height or self.font_size_width = _width or self.bitmap_size // self.font_size * 8new_bitarray = [[0 for j in range(font_size)] for i in range(font_size)]for _col in range(len(new_bitarray)):for _row in range(len(new_bitarray[_col])):_index = int(_col / (font_size / _height)) * _width + int(_row / (font_size / _width))new_bitarray[_col][_row] = byte_data[_index // 8] >> (7 - _index % 8) & 1return new_bitarray@timeitdef _color_render(self, bit_list, color):"""将二值点阵图像转换为 RGB565 彩色字节图像Args:bit_list:color:Returns:"""color_array = b""for _col in range(len(bit_list)):for _row in range(len(bit_list)):color_array += struct.pack("<H", color) if bit_list[_col][_row] else b'\x00\x00'return color_array@timeitdef _get_index(self, word):"""获取索引Args:word: 字符Returns:"""word_code = ord(word)start = 0x10end = self.start_bitmapwhile start <= end:mid = ((start + end) // 4) * 2self.font.seek(mid, 0)target_code = struct.unpack(">H", self.font.read(2))[0]if word_code == target_code:return (mid - 16) >> 1elif word_code < target_code:end = mid - 2else:start = mid + 2return -1@timeitdef get_bitmap(self, word):"""获取点阵图Args:word: 字符Returns:bytes 字符点阵"""index = self._get_index(word)if index == -1:return b'\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x0f\xcf\xf3\xcf\xf3\xff\xf3\xff\xcf\xff?\xff?\xff\xff\xff' \b'?\xff?\xff\xff\xff\xff'self.font.seek(self.start_bitmap + index * self.bitmap_size, 0)return self.font.read(self.bitmap_size)@timeitdef text(self, display, string, x, y, color=1, *, font_size=None, reverse=False, clear=False, show=False,half_char=True, auto_wrap=False, **kwargs):"""通过显示屏显示文字使用此函数显示文字,必须先确认显示对象是否继承与 framebuf.FrameBuffer。如果显示对象没有 clear 方法,需要自行调用 fill 清屏Args:display: 显示实例string: 字符串x: 字体左上角 x 轴y: 字体左上角 y 轴color: 颜色font_size: 字号reverse: 是否反转背景clear: 是否清��之前显示的内容show: 是否立刻显示half_char: 是否半字节显示 ASCII 字符auto_wrap: 自动换行**kwargs:Returns:None"""font_size = font_size or self.font_sizeinitial_x = x# 清屏try:display.clear() if clear else 0except AttributeError:print("请自行调用 display.fill(*) 清屏")for char in range(len(string)):# 是否自动换行if auto_wrap:if auto_wrap and ((x + font_size // 2 >= 128 and ord(string[char]) < 128 and half_char) or(x + font_size >= 128 and (not half_char or ord(string[char]) > 128))):y += font_sizex = initial_x# 回车if string[char] == '\n':y += font_sizex = initial_xcontinue# Tabelif string[char] == '\t':x = ((x // font_size) + 1) * font_size + initial_x % font_sizecontinue# 其它的控制字符不显示elif ord(string[char]) < 16:continue# 超过范围的字符不会显示*if x > 160 or y > 80:continuebyte_data = list(self.get_bitmap(string[char]))# 反���if reverse:for _pixel in range(len(byte_data)):byte_data[_pixel] = ~byte_data[_pixel] & 0xff# 缩放和色彩*if color > 1 or font_size != self.font_size:bit_data = self._to_bit_list(byte_data, font_size)if color > 1:display.blit(framebuf.FrameBuffer(bytearray(self._color_render(bit_data, color)), font_size, font_size,framebuf.RGB565), x, y)else:display.blit(framebuf.FrameBuffer(bytearray(self._bit_list_to_byte_data(bit_data)), font_size, font_size,framebuf.MONO_HLSB), x, y)else:display.blit(framebuf.FrameBuffer(bytearray(byte_data), font_size, font_size, framebuf.MONO_HLSB), x, y)# 英文字符半格显示if ord(string[char]) < 128 and half_char:x += font_size // 2else:x += font_sizedisplay.show() if show else 0def char(self, char, color=1, font_size=None, reverse=False):""" 获取字体字��数据在没有继承 framebuf.FrameBuffer 的显示驱动,或者内存不足以将一整个屏幕载入缓存帧时可以直接获取单字的字节数据,局部更新Args:char: 单个字符color: 颜色font_size: 字体大小reverse: 反转Returns:bytearray"""font_size = font_size or self.font_sizebyte_data = list(self.get_bitmap(char))# 反转if reverse:for _pixel in range(len(byte_data)):byte_data[_pixel] = ~byte_data[_pixel] & 0xffif color > 1 or font_size != self.font_size:bit_data = self._to_bit_list(byte_data, font_size)if color > 1:return self._color_render(bit_data, color)else:return self._bit_list_to_byte_data(bit_data)else:return bytearray(byte_data)

四、字库font.bmf

下载地址:https://gitee.com/whltaoin_admin/MP_ESP32_ST7735S-

WIFI连接初始化屏幕

# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()
# print("varin")from machine import Pin,SPI
from st7735 import ST7735,color
from ufont import BMFont
import time
import random
import network
import ntptimefont = BMFont("font.bmf")
#  WIFI名称和连接密码
ssid="aaa"
password="12345678"spi = SPI(1,baudrate = 60_000_000,polarity = 0,sck = Pin(2),mosi = Pin(3),miso = None)
tft = ST7735(spi,rst = 10,dc = 6,cs = 7,bl = 8, width = 160, height = 127, offset=(-1,0)  ,rotate = 1, rgb = True)
def network_connect():font.text(tft,"WIFI网络连接中~" ,0,0,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   sta = network.WLAN(network.STA_IF)sta.active(True)# 判断WIF是否连接,如无连接通过循环等待WIFI连接后再执行后续代码if not sta.isconnected():sta.connect(ssid,password)while not sta.isconnected():passprint(sta.ifconfig())ntptime.settime()print()font.text(tft,"WIFI网络连接成功~" ,0,0,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   font.text(tft,"WIFI名称为:"+ssid ,0,20,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   font.text(tft,"IP地址:"+sta.ifconfig()[0] ,0,40,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   while True:# 实时更新屏幕时间,t=time.localtime()timeStr=   '当前时间是:{}:{}:{}'.format( t[3], t[4], t[5])font.text(tft,timeStr ,0,60,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   font.text(tft,"今天又是加油的一天呀" ,0,80,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   if __name__ == "__main__":network_connect()
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()
# print("varin")from machine import Pin,SPI
from st7735 import ST7735,color
from ufont import BMFont
import time
import random
import network
import ntptime
from machine import RTC
import timertc = RTC()font = BMFont("font.bmf")
#  WIFI名称和连接密码
ssid="aaa"
password="12345678"spi = SPI(1,baudrate = 60_000_000,polarity = 0,sck = Pin(2),mosi = Pin(3),miso = None)
tft = ST7735(spi,rst = 10,dc = 6,cs = 7,bl = 8, width = 160, height = 127, offset=(-1,0)  ,rotate = 1, rgb = True)
def network_connect():font.text(tft,"WIFI网络连接中~" ,0,0,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   sta = network.WLAN(network.STA_IF)sta.active(True)# 判断WIF是否连接,如无连接通过循环等待WIFI连接后再执行后续代码if not sta.isconnected():sta.connect(ssid,password)while not sta.isconnected():passprint(sta.ifconfig())ntptime.settime()print()font.text(tft,"WIFI网络连接成功~" ,0,0,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   font.text(tft,"WIFI名称为:"+ssid ,0,20,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   font.text(tft,"IP地址:"+sta.ifconfig()[0] ,0,40,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   while True:# 实时更新屏幕时间t= rtc.datetime()timeStr=   '当前时间是:{}:{}:{}'.format( t[4]+8, t[5], t[6])font.text(tft,timeStr ,0,60,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   font.text(tft,"今天又是加油的一天呀" ,0,80,color(random.randint(1,256),random.randint(1,256),random.randint(1,256)),font_size = 16,reverse = False,clear = False,show = True,half_char = True,auto_wrap = False)   time.sleep(1)if __name__ == "__main__":network_connect()

注意

本案例初始化模块代码是参照以下作者,若侵权,请联系本作者。
https://blog.csdn.net/zhusongziye/article/details/135757477

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

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

相关文章

Linux系统ubuntu20.04 无人机PX4 开发环境搭建(失败率很低)

Linux系统ubuntu20.04 无人机PX4 开发环境搭建 PX4固件下载开发环境搭建MAVROS安装安装地面站QGC PX4固件下载 PX4的源码处于GitHub&#xff0c;因为众所周知的原因git clone经常失败&#xff0c;此处从Gitee获取PX4源码和依赖模块。 git clone https://gitee.com/voima/PX4-…

基 CanMV 的 C 开发环境搭建(Linux,Ubuntu篇)

不论是使用 CanMV 提供的基于 C 语言和 FreeRTOS 的应用开发方式开发应用程序或是编译 CanMV 固件&#xff0c;都需要搭建基于 CanMV 的 C 开发环境&#xff0c;用于编译 CanMV 源码。 1. 开发环境搭建说明 CanMV 提供了基于 C 语言和 FreeRTOS 的应用开发…

傅里叶级数在不连续点会怎么样???

文章目录 一、前言背景二、用狄利克雷核表达傅里叶级数三、狄利克雷核与狄拉克函数四、傅里叶级数在不连续点的表示五、吉伯斯现象的解释六、总结参考资料 一、前言背景 笔者最近在撸《信号与系统》&#xff0c;写下此博客用作记录和分享学习笔记。由于是笔者为电子爱好者&…

ENVI实战—一文搞定非监督分类

实验1&#xff1a;使用isodata法分类 目的&#xff1a;学会使用isodata法开展非监督分类 过程&#xff1a; ①导入影像&#xff1a;打开ENVI&#xff0c;按照“文件→打开为→光学传感器→ESA→Sentinel-2”的顺序&#xff0c;打开实验1下载的哨兵2号数据。 图1 ②区域裁剪…

一文简述AI自动化漏洞修复实践

2024年&#xff0c;人工智能&#xff08;AI&#xff09;技术正以其前所未有的速度和影响力&#xff0c;革新着网络安全领域。AI在自动化漏洞修复方面的应用&#xff0c;标志着我们迈入了一个全新的网络安全时代。近日&#xff0c;在中国电信组织的一场技术交流会上&#xff0c;…

鸿蒙开发通信与连接:【@ohos.rpc (RPC通信)】

RPC通信 本模块提供进程间通信能力&#xff0c;包括设备内的进程间通信&#xff08;IPC&#xff09;和设备间的进程间通信&#xff08;RPC&#xff09;&#xff0c;前者基于Binder驱动&#xff0c;后者基于软总线驱动。 说明&#xff1a; 本模块首批接口从API version 7开始支…

番外篇 | 基于改进YOLOv5的安全帽佩戴检测 | 重参数化结构RepVGG + 空间对象注意力机制RCS-OSA模块

前言:Hello大家好,我是小哥谈。RCS-YOLO是一种目标检测算法,它是基于YOLOv3算法的改进版本。通过查看RCS-YOLO的整体架构可知,其中包括RCS-OSA模块。RCS-OSA模块在模型中用于堆叠RCS模块,以确保特征的复用并加强不同层之间的信息流动。本文针对安全帽佩戴的检测就是基于RC…

Vue 的 axios二次封装

&#xff08;以下的接口地址链接换成自己的写&#xff01;&#xff01;&#xff01;&#xff09; 首先在项目中src的目录下创建一个api的文件夹&#xff0c;在api的文件下在穿件两个文件用于二次封装 别忘了先安装axios&#xff1a;&#xff08;在根目录下安装axios&#xff0…

Linux内核开发-替换内核

0.前言 上一章&#xff08;点击返回上一章&#xff09;提到如何编译内核源码&#xff0c;本章主要介绍如何将编好的内核替换已有的内核。 1. 替换内核 第1步&#xff1a;查看当前内核版本 cat /proc/version第2步&#xff1a; 查看机器上的内核信息 grep menuentry /boot/…

Mware Fusion Pro 13 mac版:一键掌控虚拟世界

VMware Fusion Pro 13是一款功能卓越的虚拟化软件&#xff0c;专为Mac操作系统量身打造。这款软件为用户提供了一个一站式的虚拟化解决方案&#xff0c;能够满足各种多样化的需求。 VMware Fusion Pro 13 Mac获取 VMware Fusion Pro 13的强大之处在于其采用了最 先进的虚拟化…

食品安全无小事:EasyCVR+AI技术助力食品加工厂管理透明化,构建食品安全防线

一、背景需求 近期有新闻记者曝光某省禽类屠宰加工厂脏乱差问题严重&#xff0c;工人脚踩鹅肠鸭肠混杂洗地水、烟头随手扔进鸭肠筐、污水捞出死鸭再上生产线…卫生情况十分堪忧。食品卫生安全频频出现负面新闻&#xff0c;如何实现源头治理&#xff1f;如何将各类食品安全风险隐…

C++ Primer Plus第五版+习题重点笔记(p250-300)

第七章 类&#xff08;下&#xff09; clear需要访问Screen的私有成员;而要想令这种访问合法&#xff0c;Screen需要把 window mgr 指定成它的友元 如果一个类指定了友元类&#xff0c;则友元类的成员函数可以访问此类包括非公有成员在内的所有成员 每个类负责控制自己的友元…

电子书(chm)-加载JS--CS上线

免责声明: 本文仅做技术交流与学习... 目录 cs--web投递 html(js)代码 html生成chm工具--EasyCHM 1-选择powershell 模式 生成 2-选择bitsadmin模式生成 chm反编译成html cs--web投递 cs配置监听器--->攻击---->web投递---> 端口选择没占用的, URL路径到时候会在…

《昇思25天学习打卡营第1天 | 认识MindScope AI框架和昇思大模型平台》

活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 昇思MindSpore学习笔记&#xff1a;探索AI的无限可能 嗨&#xff0c;AI爱好者们&#xff01;今天&#xff0c;我要带你们深入了解一个强大的全场景深度学习框架——昇思MindSpore。 准备好了吗…

AWR1843BOOST上的TM4C1294NCPDT是干啥用的?

摘要&#xff1a;AWR1843BOOST上面有2个体积较大的芯片&#xff0c;一片是雷达&#xff0c;另一片是什么呢&#xff1f; 答案&#xff1a;它就是XDS110仿真器。 有了它&#xff0c;就不用再买一个仿真器了。 从AWR1843BOOST的原理图中可以看到整个 BOOST板子上只有2个比较大的…

C++switch陈述

C 使用关键字 switch、case、default对一个常数执行不同的分流&#xff0c;这构成多重选择的结构&#xff0c;形式如下 简单来说&#xff0c;switch后头接一小括弧&#xff0c;小括弧内为一常数运算式&#xff0c;计算出常数值若与其后case的位标(label) 相符&#xff0c;就会执…

Prometheus入门

Prometheus入门 Setup Reference:https://prometheus.io/docs/introduction/overview/ exporters:你可以部署在你想要获取metrics的应用旁&#xff0c;接收Prometheus请求&#xff0c;从应用程序中收集数据并转换为正确的格式&#xff0c;最后返回给Prometheus;Service Dis…

创建百度百科词条要多少钱?看这篇

“百度百科词条人人可编辑&#xff0c;词条创建和修改均为免费&#xff0c;不存在官方及代理商付费代编。” 是的&#xff0c;百度百科免费开放&#xff0c;任何人都可以自己做&#xff0c;但是作为一个给上百家企业和个人创建百度百科词条的专业人士来说&#xff0c;给大家一…

模型预测控制MPC详解(附带案例实现)

模型预测控制MPC详解&#xff08;附带案例实现&#xff09; 文章目录 模型预测控制MPC详解&#xff08;附带案例实现&#xff09;1. 最优控制问题2. 什么是MPC3. 二次规划Quadratic Programming4. MPC为什么可以转换成QP问题&#xff08;推导过程&#xff09;5. MPC总结5.1 MPC…

基于51单片机的篮球计分器设计

一.硬件方案 本设计用由AT89C51编程控制LED七段数码管作显示的球赛计时计分系统。该系统具有赛程定时设置、赛程时间暂停、及时刷新甲乙双方的成绩等功能。 电路主要由STC89C52单片机最小系统数码管显示模块数码管驱动模块蜂鸣器模块按键模块&#xff1b; 二.设计功能 &…