【雕爷学编程】MicroPython手册之 ESP32 特定端口库 esp32.raw_temperature()

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述

MicroPython的esp是指针对ESP8266和ESP32芯片的MicroPython固件和相关软件库。ESP8266和ESP32是一类广泛应用于物联网和嵌入式系统的低成本、低功耗的Wi-Fi和蓝牙模块。MicroPython的esp为这两种芯片提供了高级的脚本编程环境,使开发者能够使用Python语言进行快速原型设计和开发。

ESP8266:是一款低成本、低功耗的Wi-Fi模块/芯片,由Espressif Systems开发。它内置了TCP/IP协议栈,可以用于连接互联网,并具备较强的处理能力。MicroPython的esp提供了针对ESP8266的固件和相关软件库,使开发者可以使用MicroPython语言进行ESP8266应用的开发。

ESP32:是Espressif Systems推出的一款高度集成的Wi-Fi和蓝牙模块/芯片,与ESP8266相比,它具备更强大的处理能力、更多的外设接口和更多的内存。MicroPython的esp也提供了针对ESP32的固件和相关软件库,使开发者可以使用MicroPython语言进行ESP32应用的开发。

MicroPython的esp固件:是专门针对ESP8266和ESP32芯片的MicroPython固件版本。这些固件经过了针对性的优化,使得它们可以在ESP8266和ESP32上运行,并提供了与硬件交互、网络通信和外设控制等功能的API。

软件库:MicroPython的esp还提供了一系列与ESP8266和ESP32硬件相关的软件库,用于简化和加速开发过程。这些软件库提供了丰富的功能接口,涵盖了Wi-Fi、蓝牙、GPIO(通用输入输出)、I2C、SPI、PWM等常用的硬件和通信协议,使开发者可以方便地访问和控制硬件资源。
在这里插入图片描述
MicroPython 的 esp32.raw_temperature() 是一个用于读取 ESP32 内部温度传感器的原始值的函数。该函数返回一个整数,表示温度传感器的输出电压,单位为毫伏。该函数不需要任何参数。

MicroPython 的 esp32.raw_temperature() 的主要特点有:

可以实现 ESP32 无需外部温度传感器,就可以测量自身的芯片温度,从而监控芯片的工作状态和散热情况。
可以根据不同的应用场景,将原始值转换为开尔文、摄氏或华氏温度,并进行温度控制或显示。
可以与其他模块或功能结合使用,实现多种温度相关的应用。

MicroPython 的 esp32.raw_temperature() 的应用场景有:

案例1:温度显示:利用 ESP32 开发板、OLED 显示屏等组件,利用 MicroPython 的 esp32.raw_temperature() 函数来实现一个温度显示,可以在 OLED 显示屏上显示 ESP32 芯片的温度,并根据用户的选择来切换不同的温度单位。以下是部分代码示例::

# 导入 esp32 模块
import esp32
# 导入 OLED 模块
import ssd1306
# 导入按键模块
from machine import Pin

# 定义 OLED 引脚号和尺寸
OLED_SCL_PIN = 22
OLED_SDA_PIN = 21
OLED_WIDTH = 128
OLED_HEIGHT = 64

# 定义按键引脚号和状态
KEY_PIN = 4
KEY_ON = 0
KEY_OFF = 1

# 创建 OLED 对象并初始化
oled = ssd1306.SSD1306_I2C(OLED_WIDTH, OLED_HEIGHT, machine.I2C(scl=machine.Pin(OLED_SCL_PIN), sda=machine.Pin(OLED_SDA_PIN)))
oled.fill(0)
oled.text("Temperature Display", 0 ,0)
oled.show()

# 创建按键对象并初始化,设置为上拉输入模式,并注册中断回调函数,触发方式为下降沿(按下)
key = Pin(KEY_PIN, Pin.IN, Pin.PULL_UP)
key.irq(lambda pin: change_unit(), trigger=Pin.IRQ_FALLING)

# 定义一个全局变量,用于存储当前的温度单位,初始值为摄氏度(C)
unit = "C"

# 定义一个函数,用于读取 ESP32 内部温度传感器的原始值,并转换为不同的温度单位
def read_temp():
    global unit
    # 调用 esp32.raw_temperature() 函数,获取原始值(单位为毫伏)
    raw = esp32.raw_temperature()
    # 根据当前的温度单位,将原始值转换为对应的温度值(单位为开尔文、摄氏或华氏)
    if unit == "K":
        # 原始值除以 10 得到开尔文温度(单位为 K)
        temp = raw / 10
    elif unit == "C":
        # 原始值除以 10 减去 273.15 得到摄氏温度(单位为 C)
        temp = raw / 10 - 273.15
    elif unit == "F":
        # 原始值除以 10 减去 273.15 再乘以 1.8 加上 32 得到华氏温度(单位为 F)
        temp = (raw / 10 - 273.15) * 1.8 + 32
    else:
        return None
    # 返回转换后的温度值和单位字符串
    return "{:.2f} {}".format(temp, unit)

# 定义一个函数,用于在 OLED 上显示 ESP32 芯片的温度,并根据用户的选择来切换不同的温度单位
def show_temp():
    # 调用 read_temp 函数,获取温度值和单位字符串
    temp_str = read_temp()
    # 在 OLED 上显示温度字符串
    oled.fill(0)
    oled.text("Temperature Display", 0 ,0)
    oled.text(temp_str, 32 ,16)
    oled.show()

# 定义一个函数,用于切换温度单位,并重新显示温度
def change_unit():
    global unit
    # 根据当前的温度单位,切换到下一个温度单位(K -> C -> F -> K)
    if unit == "K":
        unit = "C"
    elif unit == "C":
        unit = "F"
    elif unit == "F":
        unit = "K"
    else:
        return
    # 调用 show_temp 函数,重新显示温度
    show_temp()

# 定义一个循环,用于调用 show_temp 函数,并延迟一秒钟
while True:
    show_temp()
    time.sleep(1)

案例2:温度控制:利用 ESP32 开发板、风扇等组件,利用 MicroPython 的 esp32.raw_temperature() 函数来实现一个温度控制,可以根据 ESP32 芯片的温度来控制风扇的转速,从而实现芯片的散热。以下是部分代码示例::

# 导入 esp32 模块
import esp32
# 导入风扇模块
from machine import PWM

# 定义风扇引脚号和频率
FAN_PIN = 5
FAN_FREQ = 1000

# 创建风扇对象并初始化,设置为 PWM(脉冲宽度调制)输出模式,并设置频率和占空比
fan = PWM(Pin(FAN_PIN))
fan.freq(FAN_FREQ)
fan.duty(0)

# 定义一个函数,用于根据 ESP32 芯片的温度来控制风扇的转速
def fan_control():
    # 调用 esp32.raw_temperature() 函数,获取原始值(单位为毫伏)
    raw = esp32.raw_temperature()
    # 将原始值除以 10 得到开尔文温度(单位为 K)
    temp = raw / 10
    # 根据开尔文温度的大小,设置不同的风扇占空比(越高越快)
    if temp < 300:
        # 如果温度低于 300 K,则设置占空比为零(关闭风扇)
        fan.duty(0)
    elif temp < 310:
        # 如果温度在 300-310 K 之间,则设置占空比为 256(低速)
        fan.duty(256)
    elif temp < 320:
        # 如果温度在 310-320 K 之间,则设置占空比为 512(中速)
        fan.duty(512)
    else:
        # 如果温度高于 320 K,则设置占空比为 1023(高速)
        fan.duty(1023)

# 定义一个循环,用于调用 fan_control 函数,并延迟一秒钟
while True:
    fan_control()
    time.sleep(1)

案例3:温度记录:利用 ESP32 开发板、SD 卡等组件,利用 MicroPython 的 esp32.raw_temperature() 函数来实现一个温度记录,可以定期读取 ESP32 芯片的温度,并将其保存到 SD 卡中的文本文件中,从而实现芯片的温度历史记录。以下是部分代码示例:

# 导入 esp32 模块
import esp32
# 导入 SD 卡模块
import sdcard
# 导入 os 模块
import os

# 定义 SD 卡引脚号和文件名
SD_CS_PIN = 15 # 片选引脚号
SD_SCK_PIN = 14 # 时钟引脚号
SD_MOSI_PIN = 13 # 主机输出从机输入引脚号
SD_MISO_PIN = 12 # 主机输入从机输出引脚号
FILE_NAME = "temp.txt" # 文件名

# 创建 SD 卡对象并初始化,设置为 SPI 模式,并挂载到 /sd 目录下
sd = sdcard.SDCard(machine.SPI(1, sck=machine.Pin(SD_SCK_PIN), mosi=machine.Pin(SD_MOSI_PIN), miso=machine.Pin(SD_MISO_PIN)), machine.Pin(SD_CS_PIN))
os.mount(sd, "/sd")

# 定义一个函数,用于读取 ESP32 内部温度传感器的原始值,并转换为摄氏温度
def read_temp():
    # 调用 esp32.raw_temperature() 函数,获取原始值(单位为毫伏)
    raw = esp32.raw_temperature()
    # 将原始值除以 10 减去 273.15 得到摄氏温度(单位为 C)
    temp = raw / 10 - 273.15
    # 返回摄氏温度值
    return temp

# 定义一个函数,用于将 ESP32 芯片的温度保存到 SD 卡中的文本文件中,并附加时间戳
def save_temp():
    # 调用 read_temp 函数,获取摄氏温度值
    temp = read_temp()
    # 调用 time.localtime 函数,获取当前的时间元组(年,月,日,时,分,秒)
    t = time.localtime()
    # 将时间元组转换为字符串格式(年-月-日 时:分:秒)
    t_str = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(*t)
    # 将温度值和时间字符串拼接成一行数据,并在末尾加上换行符(\n)
    data = "{:.2f} C, {}\n".format(temp, t_str)
    # 打开 SD 卡中的文本文件,以追加模式(a)写入数据,并关闭文件
    f = open("/sd/" + FILE_NAME, "a")
    f.write(data)
    f.close()

# 定义一个循环,用于每隔一分钟调用 save_temp 函数,并进入浅睡眠模式,等待下一次唤醒
while True:
    save_temp()
    machine.sleep(60000) # 睡眠一分钟(60000 毫秒)

案例4:获取温度值

import esp32

temp = esp32.raw_temperature() 
print(temp)

直接打印出温度读数。

案例5:温度监控

import esp32, time

while True:
  temp = esp32.raw_temperature()
  if temp > 30:
    print('Temperature too high!')
  time.sleep(60)

周期性检查温度,并在温度过高时报警。

案例6:温度补:

import esp32

def compensate(raw):
  return raw / 0.01 + 25 

temp = compensate(esp32.raw_temperature())
print(temp)

通过辐射得到的原始温度读数进行转换,得到补偿后的温度。

这些例子展示了如何获取ESP32内置温度传感器的原始温度值,并进行处理。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132917191