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

在这里插入图片描述

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.hall_sensor() 是一个用于读取 ESP32 内置霍尔效应传感器的原始值的函数。该函数返回一个整数,表示霍尔效应传感器的输出电压,单位为毫伏。该函数不需要任何参数。

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

可以实现 ESP32 无需外部霍尔效应传感器,就可以检测其周围的磁场变化,从而实现磁场感应功能。
可以根据不同的应用场景,将原始值转换为磁通量密度或磁感应强度,并进行磁场控制或显示。
可以与其他模块或功能结合使用,实现多种磁场相关的应用。

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

案例1:磁场显示:利用 ESP32 开发板、OLED 显示屏等组件,利用 MicroPython 的 esp32.hall_sensor() 函数来实现一个磁场显示,可以在 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("Magnetic Field Display", 0 ,0)
oled.show()

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

# 定义一个全局变量,用于存储当前的磁场单位,初始值为特斯拉(T)
unit = "T"

# 定义一个函数,用于读取 ESP32 内置霍尔效应传感器的原始值,并转换为不同的磁场单位
def read_mf():
    global unit
    # 调用 esp32.hall_sensor() 函数,获取原始值(单位为毫伏)
    raw = esp32.hall_sensor()
    # 根据当前的磁场单位,将原始值转换为对应的磁通量密度或磁感应强度(单位为特斯拉、高斯或奥斯特)
    if unit == "T":
        # 原始值乘以 1.4e-6 得到特斯拉(单位为 T)
        mf = raw * 1.4e-6
    elif unit == "G":
        # 原始值乘以 1.4e-2 得到高斯(单位为 G)
        mf = raw * 1.4e-2
    elif unit == "O":
        # 原始值乘以 1.75e-5 得到奥斯特(单位为 O)
        mf = raw * 1.75e-5
    else:
        return None
    # 返回转换后的磁场值和单位字符串
    return "{:.2f} {}".format(mf, unit)

# 定义一个函数,用于在 OLED 上显示 ESP32 周围的磁场强度,并根据用户的选择来切换不同的磁场单位
def show_mf():
    # 调用 read_mf 函数,获取磁场值和单位字符串
    mf_str = read_mf()
    # 在 OLED 上显示磁场字符串
    oled.fill(0)
    oled.text("Magnetic Field Display", 0 ,0)
    oled.text(mf_str, 32 ,16)
    oled.show()

# 定义一个函数,用于切换磁场单位,并重新显示磁场
def change_unit():
    global unit
    # 根据当前的磁场单位,切换到下一个磁场单位(T -> G -> O -> T)
    if unit == "T":
        unit = "G"
    elif unit == "G":
        unit = "O"
    elif unit == "O":
        unit = "T"
    else:
        return
    # 调用 show_mf 函数,重新显示磁场
    show_mf()

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

案例2:磁场控制:利用 ESP32 开发板、电磁铁、LED 灯等组件,利用 MicroPython 的 esp32.hall_sensor() 函数来实现一个磁场控制,可以根据 ESP32 周围的磁场强度来控制电磁铁的开关,从而实现磁力吸附功能。以下是部分代码示例:

# 导入 esp32 模块
import esp32
# 导入电磁铁模块
from machine import Pin
# 导入 LED 灯模块
from machine import PWM

# 定义霍尔效应传感器引脚号和阈值
HALL_PIN = 36
HALL_THRESHOLD = 500

# 定义电磁铁引脚号和状态
MAGNET_PIN = 4
MAGNET_ON = 1
MAGNET_OFF = 0

# 定义 LED 灯引脚号和频率
LED_PIN = 2
LED_FREQ = 1000

# 创建 ADC 对象并初始化,设置为输入模式,并设置分辨率和衰减
adc = ADC(Pin(HALL_PIN))
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)

# 创建电磁铁对象并初始化,设置为输出模式,并设置初始状态为关闭
magnet = Pin(MAGNET_PIN, Pin.OUT)
magnet.value(MAGNET_OFF)

# 创建 LED 灯对象并初始化,设置为 PWM(脉冲宽度调制)输出模式,并设置频率和占空比
led = PWM(Pin(LED_PIN))
led.freq(LED_FREQ)
led.duty(0)

# 定义一个函数,用于根据 ESP32 周围的磁场强度来控制电磁铁的开关,并显示 LED 灯的状态
def magnet_control():
    # 读取 ADC 的值,并将其映射到 0-1023 的范围
    value = adc.read()
    value = int(value * 1023 / 4095)
    # 如果值小于阈值,则表示周围的磁场强度低于设定值,打开电磁铁,吸附金属物体
    if value < HALL_THRESHOLD:
        magnet.value(MAGNET_ON)
        # 设置 LED 灯的占空比为最大(1023),亮起 LED 灯
        led.duty(1023)
    # 如果值大于等于阈值,则表示周围的磁场强度高于或等于设定值,关闭电磁铁,释放金属物体
    else:
        magnet.value(MAGNET_OFF)
        # 设置 LED 灯的占空比为零(0),熄灭 LED 灯
        led.duty(0)

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

这个程序利用了 ESP32 内置的霍尔效应传感器1,可以检测其周围的磁场变化,并根据设定的阈值来控制电磁铁的开关。同时,利用了 LED 灯来显示电磁铁的状态。

案例3:磁场检测:利用 ESP32 开发板、蜂鸣器等组件,利用 MicroPython 的 esp32.hall_sensor() 函数来实现一个磁场检测,可以根据 ESP32 周围的磁场强度来控制蜂鸣器的音调,从而实现磁场的声音提示。以下是部分代码示例:

# 导入 esp32 模块
import esp32
# 导入蜂鸣器模块
from machine import Pin
from machine import PWM

# 定义蜂鸣器引脚号和频率
BUZZER_PIN = 5
BUZZER_FREQ = 1000

# 创建蜂鸣器对象并初始化,设置为 PWM(脉冲宽度调制)输出模式,并设置频率和占空比
buzzer = PWM(Pin(BUZZER_PIN))
buzzer.freq(BUZZER_FREQ)
buzzer.duty(0)

# 定义一个函数,用于根据 ESP32 周围的磁场强度来控制蜂鸣器的音调
def buzzer_control():
    # 调用 esp32.hall_sensor() 函数,获取原始值(单位为毫伏)
    raw = esp32.hall_sensor()
    # 将原始值映射到 100-2000 的范围,作为蜂鸣器的频率(单位为赫兹)
    freq = int(raw * 1900 / 1023 + 100)
    # 设置蜂鸣器的频率和占空比(50%)
    buzzer.freq(freq)
    buzzer.duty(512)

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

这个程序利用了 ESP32 内置的霍尔效应传感器,可以检测其周围的磁场变化,并根据原始值来控制蜂鸣器的频率。

案例4:检测磁场变化

import esp32

while True:
  print(esp32.hall_sensor()) 
  # 输出磁场读数

不断读取磁场传感器值,可以检测磁场变化。

案例5:门磁传感:

import esp32

THRESHOLD = 10

def check_door_state():
  value = esp32.hall_sensor()
  if value > THRESHOLD:
    print('Door opened!')
  else:
    print('Door closed!')
      
check_door_state()

通过门磁传感器的读数判断门是否打开。

案例6:喇叭控制

import esp32

def beep(duration):
  # 打开喇叭 
  esp32.hall_sensor() # 重置计数器
  while esp32.hall_sensor() < 40 * duration:
    pass
  # 关闭喇叭
    
beep(1) # 蜂鸣1秒  

用磁场计数来实现简单的蜂鸣器控制。这些例子展示了hall sensor在磁场检测、传感器输入等方面的用法。

案例7:监测磁场强度:

import esp32
import time

while True:
    hall_value = esp32.hall_sensor()
    print("Hall Sensor Value:", hall_value)
    time.sleep(1)

在此示例中,我们使用一个无限循环来连续监测霍尔传感器的值。通过调用 esp32.hall_sensor() 函数,我们可以获取当前的霍尔传感器值。将其打印出来,并使用 time.sleep(1) 函数延迟一秒后再次读取传感器值。

案例8:磁场触发操作::

import esp32
import machine

# 配置外部引脚触发
trigger_pin = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_DOWN)

while True:
    if trigger_pin.value() == 1:
        hall_value = esp32.hall_sensor()
        print("Hall Sensor Value:", hall_value)

在这个示例中,我们配置了一个外部引脚(Pin 4)作为触发引脚,并将其连接到一个触发器(如按钮)。在一个无限循环中,我们检查触发引脚的状态。当触发引脚的值为 1(高电平)时,我们调用 esp32.hall_sensor() 函数来获取当前的霍尔传感器值,并将其打印出来。

案例9:磁场触发任务::

import esp32
import machine

# 配置外部引脚触发
trigger_pin = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_DOWN)

while True:
    if trigger_pin.value() == 1:
        hall_value = esp32.hall_sensor()
        if hall_value > 1000:
            print("Magnetic field detected!")
            # 执行其他任务...

在这个示例中,我们配置了一个外部引脚(Pin 4)作为触发引脚,并将其连接到一个触发器(如按钮)。在一个无限循环中,我们检查触发引脚的状态。当触发引脚的值为 1(高电平)时,我们调用 esp32.hall_sensor() 函数来获取当前的霍尔传感器值。如果霍尔传感器的值大于 1000,表示检测到了磁场,我们可以执行其他任务,例如打印出"Magnetic field detected!"的消息或执行其他相关操作。

这些示例展示了如何使用 MicroPython 中的 esp32.hall_sensor() 函数来读取霍尔传感器的值,并根据需要执行相应的任务。请根据您的具体需求和硬件连接进行适当的设置和参数调整。

在这里插入图片描述

猜你喜欢

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