当前位置:   article > 正文

esp32——RTC实时时钟,ADC(电位器),PWM(无源蜂鸣器),UART串口通信,LCD显示屏_esp32实时时钟

esp32实时时钟

1.RTC实时时钟

数据线接UART口烧录程序

'''
实验名称:RTC实时时钟
版本:v1.0
日期:2022.4
作者:01Studio
说明:使用Thonny连接开发板会自动更新RTC时间
'''

# 导入相关模块
from machine import Pin, SoftI2C, RTC,Timer
from ssd1306 import SSD1306_I2C

# 定义星期和时间(时分秒)显示字符列表0-6
week = ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']
time_list = ['', '', '']

# 初始化所有相关对象
i2c = SoftI2C(sda=Pin(42), scl=Pin(40)) #OLED屏I2C初始化
#sda传数据,scl传时钟
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)
#创建一个SSD1306_I2C对象,相关参数为宽128,高64,通过i2c总线通信,OLED的I2C显示地址为0*3c
rtc = RTC()
#创建一个RTC对象,用于跟踪和实时修改时间

# 首次上电配置时间,按顺序分别是:年,月,日,星期,时,分,秒,次秒级;这里做了
# 一个简单的判断,检查到当前年份不对就修改当前时间,开发者可以根据自己实际情况来
# 修改。
if rtc.datetime()[0] != 2022:
    rtc.datetime((2022, 4, 1, 4, 0, 0, 0, 0))
#使用 rtc.datetime() 方法来获取 RTC 实例的当前日期和时间。该方法返回一个元组,其中第一个元素表示年份。
#接下来,代码使用条件语句检查获取到的年份是否不等于 2022。如果不等于 2022,则表示当前日期不是 2022 年。
#在这种情况下,代码调用 rtc.datetime() 方法并传入一个新的日期和时间(2022 年 4 月 1 日 4 时 0 分 0
#秒)(也就是2022,4,1,4,0,0),以将 RTC 时间设置为指定的日期和时间。

def RTC_Run(tim):

    datetime = rtc.datetime()  # 获取当前时间
'''
获取或设置 RTC 的日期和时间。
在没有参数的情况下,此方法返回一个包含当前日期和时间的 8 元组。使用 1 个参数(是一个 8 元组),它设置日期和时间。
元组具有以下格式:
(年、月、日、工作日、小时、分钟、秒、亚秒)
该subseconds字段的含义取决于硬件。
'''
    oled.fill(0)  # 清屏显示黑色背景
    oled.text('01Studio', 0, 0)    # 首行显示01Studio
    oled.text('RTC Clock', 0, 15)  # 次行显示实验名称

    # 显示日期,字符串可以直接用“+”来连接
    oled.text(str(datetime[0]) + '-' + str(datetime[1]) + '-' + str(datetime[2]) + ' ' + week[datetime[3]], 0, 40)

    # 显示时间需要判断时、分、秒的值否小于10,如果小于10,则在显示前面补“0”以达
    # 到较佳的显示效果
    for i in range(4, 7):
        if datetime[i] < 10:
            time_list[i - 4] = "0"
        else:
            time_list[i - 4] = ""

    # 显示时间
    oled.text(time_list[0] + str(datetime[4]) + ':' + time_list[1] + str(datetime[5]) + ':' + time_list[2] + str(datetime[6]), 0, 55)
    oled.show()

#开启RTOS定时器
tim = Timer(0)
tim.init(period=300, mode=Timer.PERIODIC, callback=RTC_Run) #周期300ms
#每三百ms执行一次回调函数RTC_Run


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

1.关于(硬件)I2C和(软件)SoftI2C的区别和联系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxeqRVp9-1688398403609)(D:\笔记\assets\image-20230703143837320.png)]

能够清晰地看到上面框图所圈起来的就是我们常常所说的I2C引脚接口,这里的接口指的就是硬件I2C接口,也就是我们常常在软件中仅用I2C表示即可。

特点:

I2C(硬件I2C)是由相应的I2C驱动电路,其使用的I2C管脚也是专用的。
SoftI2C(软件I2C)一般是由电路中常见的GPIO管脚所组成,使用软件来控制管脚状态用以模仿I2C(硬件I2C)进行通信
I2C(硬件I2C)效率远高于SoftI2C。SOftI2C其接口比较灵活,不受管脚限制。

2.什么是硬件I2C

硬件 I2C(Inter-Integrated Circuit)是一种用于设备之间通信的串行通信协议。它是一种同步的、主从式的通信协议,用于在电路板上的不同组件之间进行数据交换。

硬件 I2C 依赖于硬件接口电路,通常由微控制器、微处理器或其他集成电路上的专用硬件模块实现。这些硬件模块负责时序、字节传输和冲突检测等细节,简化了软件控制器的开发和实现。

硬件 I2C 有两个主要的通信线路:

  1. SDA(Serial Data Line):用于传输数据。
  2. SCL(Serial Clock Line):用于同步数据传输的时钟信号。

在硬件 I2C 中,有一个主设备(Master)和一个或多个从设备(Slave)。主设备负责发起和控制通信的操作,而从设备则被动地响应主设备的请求。

硬件 I2C 在许多嵌入式系统和电子设备中广泛应用,用于连接各种外围设备,例如传感器、芯片、存储器和其他集成电路。它提供了一种可靠的、高效的通信方式,使设备之间能够以可预测和协调的方式进行数据交换。

拓展:硬件I2C控制传感器

以下是大致的步骤:

  1. 连接硬件:首先,将传感器连接到主控制器(如微控制器或微处理器)的硬件 I2C 接口。连接通常需要将传感器的 SDA 引脚连接至主控制器的 SDA 引脚,将传感器的 SCL 引脚连接至主控制器的 SCL 引脚。还需要共享相同的地线(GND)。

  2. 设置主从模式:在主控制器上配置硬件 I2C 为主模式。这意味着主控制器将控制传感器的读取和写入操作。

  3. 寻址传感器:每个连接到 I2C 总线的设备都有唯一的地址。通过将传感器的地址发送到 I2C 总线上,主控制器可以选择与之通信的特定传感器。

  4. 发送指令:主控制器可以通过写入 I2C 总线发送指令给传感器。这些指令可以控制传感器的不同功能,例如启动测量、设置参数或读取传感器数据。

  5. 读取数据:一些传感器可以通过 I2C 总线将数据发送回主控制器。主控制器可以读取传感器发送的数据,并进行后续处理或显示。

需要注意的是,具体控制传感器的操作和指令取决于所使用的具体传感器和主控制器。每个传感器都有自己的控制寄存器和通信协议,因此你需要参考传感器和主控制器的文档以了解详细的操作步骤和指令格式。

此外,还可以使用相应的硬件 I2C 库或驱动程序来简化控制传感器的过程。这些库通常提供了一组函数和方法,使程序员能够直接与传感器进行交互,而无需手动处理底层的 I2C 通信细节。

3.什么是软件I2C

软件 I2C(Software I2C)是通过软件实现的一种模拟 I2C 总线的通信协议。它允许在没有硬件 I2C 接口或需要额外的 I2C 总线时,通过软件编码来模拟和控制 I2C 总线的功能。

软件 I2C 的实现通常涉及以下几个步骤:

  1. 确定引脚:选择可用的 GPIO 引脚作为软件 I2C 的 SDA(数据线)和 SCL(时钟线)。需要将这些引脚配置为合适的输入/输出模式,并通过软件来控制它们的状态。
  2. 控制时序:编写代码来模拟 I2C 通信的时序。这包括发送起始位、发送地址、发送和接收数据等。通过精确控制引脚状态的变化,实现模拟时序。
  3. 读写数据:使用软件 I2C,你可以编写代码来发送和接收数据。这可能涉及到生成和解析数据位、生成和验证校验位等操作。
  4. 考虑时钟速度和稳定性:软件 I2C 的性能和稳定性受到计算机的处理能力和系统负载的影响。在设计软件 I2C 实现时,需要考虑适当的时钟速度和适时的延时,以确保正确的通信和数据可靠性。

需要注意的是,软件 I2C 通常相对于硬件 I2C 具有更高的延迟和限制。它主要用于模拟和测试目的,例如在没有硬件支持的环境中进行原型设计、开发和调试。在实际的生产环境中,使用硬件 I2C 更为常见和可靠。

软件 I2C 实现的具体细节和代码取决于使用的平台和编程语言。通常,开发人员可以利用开源的软件库或者根据具体的需要自行编写代码来实现软件 I2C 的功能。提供的软件库通常会提供相应的接口和函数,用于初始化、读写数据以及控制总线的时序等操作。

也就是说,软件I2C可以看作是硬件I2C的一个补充

软件 I2C 和虚拟 I2C 这两个术语有时会被混淆,因为它们都涉及通过软件实现模拟 I2C 总线的通信。然而,它们之间存在一些区别:

  1. 定义和上下文:“软件 I2C” 更常用于嵌入式系统中,它指的是通过软件实现的一种模拟 I2C 总线通信协议。而"虚拟 I2C" 更常用于计算机系统中,用于模拟 I2C 总线的功能。
  2. 应用领域:软件 I2C 主要应用于嵌入式系统中,特别是在缺少硬件支持的情况下。它通常用于控制传感器、外设或其他器件。虚拟 I2C 主要应用于计算机系统中,用于开发、调试和测试目的,通过计算机的通用输入/输出(GPIO)引脚模拟 I2C 总线的通信。
  3. 环境和平台:软件 I2C 主要在嵌入式系统中实现,通常在裸机环境或操作系统上执行。它可能需要直接控制特定的硬件寄存器和引脚。虚拟 I2C 主要建立在计算机系统的操作系统和相关的软件环境上,通过操作通用的GPIO库来模拟和控制GPIO状态。
  4. 性能和可靠性:由于软件 I2C 直接用软件代码模拟 I2C 总线通信,因此它的性能和稳定性可能会受到硬件限制、时钟频率和系统负载的影响。而虚拟 I2C 在计算机系统中运行,性能受到计算机硬件和操作系统的限制,一般比较灵活和可靠。

总之,软件 I2C 主要用于嵌入式系统中,实现时需要直接操作硬件寄存器和引脚;虚拟 I2C 主要用于计算机系统中,通过模拟 GPIO 引脚实现,主要用于开发和调试应用。两者针对的应用场景和实现方式有所不同。

也就说,两者有区别,但是区别不大,在某些情况下可以认为是同一概念

4.什么是RTC

RTC(Real time communication)实时通信,是实时音视频的一个简称,我们常说的RTC技术一般指的是WebRTC技术,已经被 W3C 和 IETF 发布为正式标准。由于几乎所有主流浏览器都支持 WebRTC 标准 API ,因此也让浏览器之间无插件化的音视频互通成为可能, 大大降低了音视频开发的门槛,开发者只需要调用 WebRTC API 即可快速构建出音视频应用。 更广义的RTC技术,不单单局限于音视频,包括IM、图片、白板、文件共享等富媒体在内的实时交互也属于RTC技术范畴。

RTC用于实时通信,可以降低音视频开发门槛,也提高音视频互通效率

在esp32中是实时时钟类,用于跟踪日期和时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xFCG0ma2-1688398403612)(D:\笔记\assets\image-20230703151235132.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hXwrOOZq-1688398403613)(D:\笔记\assets\image-20230703151315866.png)]

5.ssd1306

SSD1306是一款带控制器的用于OLED点阵图形显示系统的单片CMOS OLED/PLED驱动器。它由128个SEG(列输出)和64个COM(行输出)组成。该芯片专为共阴极OLED面板设计。

用于驱动OLED点阵图形显示系统

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m3hznsj4-1688398403613)(D:\笔记\assets\image-20230703151658423.png)]

在esp32中ssd1306_I2C用于控制OLED显示的位置,分辨率等

2.ADC(电位器)

'''
实验名称:ADC-电压测量
版本:v1.0
日期:2022.4
作者:01Studio
说明:通过对ADC数据采集,转化成电压在显示屏上显示。ADC精度12位(0~4095),测量电压0-3.3V。
'''

#导入相关模块
from machine import Pin,SoftI2C,ADC,Timer
from ssd1306 import SSD1306_I2C

#初始化相关模块
i2c = SoftI2C(sda=Pin(42), scl=Pin(40))  #I2C初始化
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)

adc = ADC(Pin(7)) #引脚7跟pyBase的电位器相连接
adc.atten(ADC.ATTN_11DB) #开启衰减器,测量量程增大到3.3V

def ADC_Test(tim):

    oled.fill(0)  # 清屏显示黑色背景
    oled.text('01Studio', 0, 0)  # 首行显示01Studio
    oled.text('ADC', 0, 15)      # 次行显示实验名称

    #获取ADC数值
    oled.text(str(adc.read()),0,40)
    #读取0-65535范围内的原始模拟值
    oled.text('(4095)',60,40)
    #计算电压值,获得的数据0-4095相当于0-3.3V,('%.2f'%)表示保留2位小数
    oled.text(str('%.2f'%(adc.read()/4095*3.3)),0,55)
    oled.text('V',40,55)

    oled.show()

#开启定时器
tim = Timer(1)
tim.init(period=300, mode=Timer.PERIODIC, callback=ADC_Test) #周期300ms

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

1.什么是ADC

ADC,即模数转换器。

世界在本质上一直是模拟的,例如,我们人类感觉和经历的一切,如速度、温度、空气速度、阳光、声音等,在本质上都是模拟的。但是我们在微控制器和微处理器上运行的电子设备不能直接读取/解释这些模拟值,因为它们只在0和1上运行。所以我们需要一种能将这些模拟值转换成0和1的东西,以便我们的微控制器和微处理器能够理解它们。这就是所谓的模数转换器或简称ADC。

ADC只能将模拟电压值转换为数字值。因此,无论我们想要测量哪个参数,都应该先将其转换为电压,这种转换可以在传感器的帮助下完成。例如,为了将温度值转换为电压,我们可以使用热敏电阻,同样,为了将亮度转换为电压,我们可以使用LDR。一旦转换成电压,我们就可以在ADC的帮助下读取。

esp32中的ADC

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FO5TANas-1688398403614)(D:\笔记\assets\image-20230703165953481.png)]

ADC的功能实际上就是将模拟电压值转换为0和1,模拟电压值由传感器得到,也有部分传感器可以直接给出0和1数值,此时就不需要使用ADC进行转换

2.esp32中的ADC类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdI9bolh-1688398403615)(D:\笔记\assets\image-20230703163510726.png)]

拓展:ADC可以与传感器结合,将信号转换为0和1以便于微处理器控制和理解,那么在降雨前后就可以用湿度传感器和ADC实现降雨检测

模数转换过程:

外界信号通过传感器转为模拟电压值,模拟电压值输入到ADC中转化为二进制ADC数据(ADC类中read方法可以以十进制将该二进制ADC数据显示在OLED屏上,例如在此例中电位器获得模拟电压值,最终通过实际2对应关系将其转换为实际电压值)

3.PWM(无源蜂鸣器)

'''
实验名称:PWM
版本:v1.0
日期:2022.4
作者:01Studio
说明:通过不同频率的PWM信号输出,驱动无源蜂鸣器发出不同频率的声音。
'''

from machine import Pin, PWM
import time

Beep = PWM(Pin(15), duty=512) # 在同一语句下创建和配置PWM,占空比50%
'''
esp32中的一个周期的工作时间最大为1023,那么也就是说,duty参数=工作时间,占空比=工作时间/总周期时间,所以duty为512时占空比为50%
'''
#蜂鸣器发出频率200Hz响声
Beep.freq(200)
#freq为频率值
time.sleep(1)

#蜂鸣器发出频率400Hz响声
Beep.freq(400)
time.sleep(1)

#蜂鸣器发出频率600Hz响声
Beep.freq(600)
time.sleep(1)

#蜂鸣器发出频率800Hz响声
Beep.freq(800)
time.sleep(1)

#蜂鸣器发出频率1000Hz响声
Beep.freq(1000)
time.sleep(1)

#停止
Beep.deinit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

1.PWM

  • 什么是PWM

    PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。

  • PWM的频率

    是指在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。

  • PWM的周期

    T=1/f,T是周期,f是频率。

    如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有 50次PWM周期。

  • 占空比

    是一个脉冲周期内,高电平的时间与整个周期时间的比例,单位是% (0%-100%)

    一个周期的长度,如下图所示。

    img

    其中,周期是一个脉冲信号的时间,1s内的周期T次数等于频率f,脉宽时间是指高电平时间。

    上图中,脉宽时间占总周期时间的比例,就是占空比。

    比方说,周期的时间是10ms,脉宽时间是8ms,那么占空比是8/10= 80%,这就是占空比为80%的脉冲信号。

    PWM就是脉冲宽度调制,通过调节占空比就可以调节脉冲宽度。

  • PWM原理

    以STM32单片机为例,其IO口只能输出高电平和低电平。

    假设高电平为5V、低电平则为0V,那么要输出不同的模拟电压就要用到PWM。通过改变IO口输出的方波的占空比,从而获得使用数字信号模拟成的模拟电压信号。

    电压是以一种脉冲序列被加到模拟负载上去的,接通时是高电平1,断开时是低电平0。接通时直流供电输出,断开时直流供电断开。通过对接通和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值5V的模拟电压。

    比方说,占空比为50%那就是高电平时间一半,低电平时间一半。在一定的频率下,就可以得到模拟的2.5V输出电压。那么75%的占空比,得到的电压就是3.75V,如下图所示。

    img

也就是说,在一定的频率下,通过不同的占空比即可得到不同大小的输出模拟电压,PWM就是通过这种原理实现数字模拟信号转换的。

总结:PWM的工作原理就是通过调节占空比来得到模拟输出电压,从而改变某些工作状态,例如,通过改变占空比可以改变电压,从而改变电机转速

拓展:(红外)传感器传递信号模拟电压值,ADC读取后传递给微处理器(有障碍物),微处理器通过相关指令改变PWM占空比(降低模拟电压,电机转速变慢),从而改变工作状态(减速)。

2.esp32中的PWM

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccdy2rCR-1688398403619)(D:\笔记\assets\image-20230703194914257.png)]

4.UART串口通信

'''
实验名称:串口通信
版本:v1.0
日期:2022.4
作者:01Studio
说明:通过编程实现串口通信,跟电脑串口助手实现数据收发。
平台:pyWiFi-ESP32-S3
'''

#导入串口模块
from machine import UART

uart=UART(2,115200,rx=9,tx=8) #设置串口号1和波特率
#设置串口号为2,并将波特率设置为115200。同时,指定接收引脚为9,发送引脚为8。
uart.write('Hello 01Studio!')#发送一条数据
#该代码会将字符串数据发送到通过UART初始化的串口。
while True:

    #判断有无收到信息
    if uart.any():

        text=uart.read(128) #接收128个字符
        print(text) #通过REPL打印串口3接收的数据


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

1.什么是串口

什么是UART?

通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议,在嵌入式领域应用的非常广泛。

UART作为异步串行通信协议的一种,工作原理是将传输数据的每个二进制位一位接一位地传输。在UART通信协议中信号线上的状态为高电平时代表‘1’,信号线上的状态为低电平时代表‘0’。比如使用UART通信协议进行一个字节数据的传输时就是在信号线上产生八个高低电平的组合。

  • 串行通信是指利用一条传输线将数据一位位地顺序传送,也可以用两个信号线组成全双工通信,如rs232。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。
  • 异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。通俗说是两个uart设备之间通信的时候不需要时钟线,这时候就需要在两个uart设备上指定相同的传输速率,以及空闲位、起始位、校验位、结束位,也就是遵循相同的协议。
  • 数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。

串行接口简称串口,也称串行通信接口或串行通讯接口(通常称COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

2.USB转TTL

  • 什么是TTL

    TTL 一般是从单片机或者芯片中发出的电平,高电平为 5V(51单片机)或者 3.3V(stm32)

    TTL 接口属于并行方式传输数据的接口,采用这种接口时,不必在液晶显示器的驱动板端和液晶面板端使用专用的接口电路,而是由驱动板主控芯片输出的 TTL 数据信号经电缆线直接传送到液晶面板的输入接口

  • TTL电平

    TTL 电平信号应用广泛,是因为其数据表示采用二进制规定,即:

    逻辑高电平 == 0 == VCC == 3.3V 或 5V

    逻辑低电平 == 0 == 0V == 0V

    数字电路中,由 TTL 电子元器件组成电路的电平是个电压范围,规定:

    输出高电平 >= 2.4V,输出低电平 <= 0.4V

    输入高电平 >= 2.0V,输入低电平 <= 0.8V

    1、VDD:D=device 表示器件的意思, 即器件内部的工作电压;
    2、VCC:C=circuit 表示电路的意思, 即接入电路的电压;
    Vcc和Vdd是器件的电源端。Vcc是双极器件的正,Vdd多半是单极器件的正。下标可以理解为NPN晶体管的集电极C,和PMOS or NMOS场效应管的漏极D。同样你可在电路图中看见Vee和Vss,含义一样。因为主流芯片结构是硅NPN所以Vcc通常是正。如果用PNP结构Vcc就为负了。建议选用芯片时一定要看清电气参数。

    3、VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压;
    VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目。管理软件开发中各个不同版本的源代码和文档,占用空间小并且方便各个版本代码和文档的获取,对开发小组中对源代码的访问进行有效的协调。

    4、GND(Ground)代表地线或0线
    GND就是公共端的意思,也可以说是地,但这个地并不是真正意义上的地。是出于应用而假设的一个地,对于电源来说,它就是一个电源的负极。它与大地是不同的。有时候需要将它与大地连接,有时候也不需要,视具体情况而定。

USB 转 TTL 模块的作用就是把电平转换到双方都能识别进行通信

单片机通信接口的电平逻辑和 PC 机通信接口的电平逻辑不同,PC 机上的通信 接口有 USB 接口,相应电平逻辑遵照 USB 原则;还有 DB9 接口(九针口),相应电平逻辑遵照 RS-232 原则

单片机上的串行通信通过单片机的 RXD、TXD、VCC、GND 四个引脚,相应电平逻辑遵照 TTL 原则

USB 是一种串口(串口是一大类接口,包括但不仅限于 RS232),它拥有复杂的通讯协议,支持热插拔,并可以以非常快的速度传输数据。串口,是指 RS232 串口,这是一种几乎没有协议的传输接口,可以直接收发数据

具体关于 RS-232 协议的内容会在我的另外一篇博客介绍到:STM32 —— 常用串口通信协议

USB 转 TTL 串口模块是一个非常实用的工具,可以测试模块的 UART 串口通信和通过单片机的 UART 接口给单片机等下载程序。
能够在电脑上的串口助手软件非常直观的显示出串口设备返回的数据以及发送相应的控制数据给串口设备。
常见的有 CP2102、PL2303、FT232、CH340 等串口芯片方案的 USB 转串口模块。以下以 CH340 串口模块为例,对其进行自检测试。、
总结:此处UART串口通信实际上就是利用USB转TTL将esp32和电脑连接起来,使其能够直接进行通信,就是在esp32需要返回某些信息时,可以通过串口直接发送到电脑,例如在本实验中我们可以先初始化串口,然后给串口发去一条信息,这样 PC 机的串口助手就会在接收区显示出来,然后进入循环,当检测到有数据可以接收时 候就将数据接收并打印,并通过 REPL 打印显示。

REPL是一个常见的计算机编程术语,它代表着"Read-Evaluate-Print-Loop"(读取-求值-打印-循环)。

REPL通常用于交互式编程环境中,提供了一个交互式的命令行接口,在该接口中可以逐行读取代码、对代码进行求值或执行、然后打印或显示结果。这种循环的设计使得开发人员可以快速地进行代码的测试、调试和探索,而无需编写完整的程序或脚本。

在某些编程语言和开发环境中,REPL也被称为Shell、解释器或控制台。一些常见的编程语言如Python、JavaScript、Ruby等都提供了REPL环境,可以通过命令行或交互式开发工具来使用。

通过REPL环境,开发者可以逐个输入代码行,立即查看结果,并进行迭代式开发和测试。这对于快速尝试新的代码片段、调试问题、验证假设以及进行数据探索非常有用。

需要注意的是,REPL通常用于交互式开发和实验,并不适用于生产环境或长期运行的应用程序,因为其执行速度通常较慢,且不具备优化和持久化的能力。因此,在实际部署代码之前,还需要将代码整理为脚本或应用程序,以提高性能和可维护性。

拓展:可以通过UART串口通信实现利用手机或电脑直接与硬件进行交互控制,比如智能扫地机器人面板上可以显示各种信息,触屏控制

3.esp32中的UART类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVNmszQD-1688398403621)(D:\笔记\assets\image-20230703203757646.png)]

5.LCD显示屏

'''
实验名称:3.2寸LCD液晶显示屏
版本:v1.0
日期:2022.4
作者:01Studio
实验平台:pyWiFi-ESP32-S3
说明:通过编程实现LCD的各种显示功能,包括填充、画点、线、矩形、圆形、显示英文、显示图片等。
'''

#导入相关模块
from tftlcd import LCD32
import time

#定义常用颜色
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
BLACK = (0,0,0)
WHITE = (255,255,255)
'''
根据您提供的代码,您定义了五个元组变量,分别表示不同的RGB颜色值。

RED = (255, 0, 0) 表示红色,红色分量为最大值255,绿色和蓝色分量均为0。
GREEN = (0, 255, 0) 表示绿色,绿色分量为最大值255,红色和蓝色分量均为0。
BLUE = (0, 0, 255) 表示蓝色,蓝色分量为最大值255,红色和绿色分量均为0。
BLACK = (0, 0, 0) 表示黑色,所有的RGB分量均为最小值0。
WHITE = (255, 255, 255) 表示白色,所有的RGB分量均为最大值255。
'''
########################
# 构建3.2寸LCD对象并初始化
########################
d = LCD32(portrait=1) #默认方向竖屏
'''
构建一个3.2寸LCD对象,参数如下:
portrait LCD显示方向:
1 - 竖屏,240*320,开发板默认方向;
2 - 横屏,320*240 ,1基础上顺时针旋转90°;
3 - 竖屏,240*320 ,1基础上顺时针旋转180°;
4 - 横屏,320*240 ,1基础上顺时针旋转270°。
'''

#填充白色
d.fill(WHITE)
#前面已经定义过while为白色变量
#画点
d.drawPixel(5, 5, RED)
'''
x 横坐标;
y 纵坐标;
color RGB颜色数据,如:(255,0,0)表示红色。
'''
#画线段
d.drawLine(5, 10, 200, 10, RED)
 '''
x0 起始横坐标;
y0 起始纵坐标;
x1 结束横坐标;
y1 结束纵坐标;
color RGB颜色数据,如:(255,0,0)表示红色。
'''
#画矩形
d.drawRect(5, 30, 200, 40, RED, border=5)
'''
x 起始横坐标;
y 起始纵坐标;
width 宽度;
height 高度;
color 边框颜色,RGB颜色数据,如:(255,0,0)表示红色。
border 边框宽度,单位为像素,默认=1;
fillcolor 填充颜色,RGB颜色数据,如:(255,0,0)表示红色,默认=None表示不填充。
'''
#画圆
d.drawCircle(100, 120, 30, RED, border=5)
 '''
x 圆心横坐标;
y 圆心纵坐标;
radius 半径;
color 边框颜色,RGB颜色数据,如:(255,0,0)表示红色。
border 边框宽度,单位为像素,默认=1;
fillcolor 填充颜色,RGB颜色数据,如:(255,0,0)表示红色,默认=None表示不填充。
'''
#写字符,4种尺寸
d.printStr('Hello 01Studio', 10, 200, RED, size=1)
d.printStr('Hello 01Studio', 10, 230, GREEN, size=2)
d.printStr('Hello 01Studio', 10, 270, BLUE, size=3)
'''
text 字符,string类型;
x 起始横坐标;
y 起始纵坐标;
color 字体颜色,RGB颜色数据,如:(255,0,0)表示红色。
backcolor 字体背景颜色,RGB颜色数据,如:(255,0,0)表示红色,默认=None。
size 字体尺寸,默认=2表示标准尺寸:
1 - 小号;
2 - 标准;
3 - 中号;
4 - 大号;
'''
time.sleep(5) #等待5秒

#显示图片
d.Picture(0,0,"/picture/1.jpg")
time.sleep(3)
d.Picture(0,0,"/picture/2.jpg")
time.sleep(3)
d.Picture(0,0,"/picture/01studio.jpg")
'''
显示图片,支持图片格式:jpg/bmp。最大尺寸240*320
x 起始横坐标;
y 起始纵坐标;
filename 路径+名称,如:”cat.jpg”
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • LCD和OLED最根本的区别是,OLED是自发光,而LCD需要通过背光板照射才能显示

1.LCD工作原理

LCD即液晶显示器,它是一种采用了液晶控制透光度技术来实现色彩的显示器。

从液晶显示器的结构来看,LCD液晶面板由两块平行玻璃板构成,厚约1mm,其间由包含有液晶材料的5μm均匀间隔隔开。因为液晶材料本身并不发光,所以在显示屏两边都设有作为光源的灯管,而在液晶显示屏背面有一块背光板(或称匀光板)和反光膜,背光板是由荧光物质组成的可以发射光线,其作用主要是提供均匀的背景光源。

背光板发出的光线在穿过第一层偏振过滤层之后进入包含成千上万液晶液滴的液晶层。液晶层中的液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。在玻璃板与液晶材料之间是透明的电极,电极分为行和列,在行与列的交叉点上,通过改变电压而改变液晶的旋光状态,液晶材料的作用类似于一个个小的光阀。在液晶材料周边是控制电路部分和驱动电路部分。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。

扩展:可以将LCD和传感器,ADC,PWM结合起来,不同情况下传递给传感器的信号不同,传感器传递的模拟电压值也不同,那么ADC转化后得到的指令就不同,通过这些不相同的指令可以有根据的改变PWM的占空比,也就是改变某些2期间的工作电压,使其呈现不同工作状态,例如灯的亮度和电机转速。

2.OLED屏幕特点

OLED在工艺上只需用两层薄膜和玻璃或塑料基板,比LCD的工艺更加简单。目前OLED屏成品厚度约在0.5~1.8mm之间,其显示效果比LCD液晶显示屏更明亮、更细腻,理论上也更省电。由于OLED材料具有自发光特性,无需背光模块及彩色滤光片,也不需要一般LCD面板的灌液晶工艺,所以制作上比采用液晶体发光的LCD少三道工序,量产后成本将明显降低。

有机发光显示技术由非常薄的有机材料涂层和玻璃基板构成。当有电荷通过时这些有机材料就会发光。OLED发光的颜色取决于有机发光层的材料,故厂商可由改变发光层的材料而得到所需之颜色。有源阵列有机发光显示屏具有内置的电子电路系统因此每个像素都由一个对应的电路独立驱动。OLED面板具备有构造简单、自发光不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广等优点。

3.LCD32类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F0gDSuF1-1688398403621)(D:\笔记\assets\image-20230703210414588.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3r20iTx-1688398403622)(D:\笔记\assets\image-20230703210507427.png)]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/196223
推荐阅读
相关标签
  

闽ICP备14008679号