这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » [Let'sDo第3期]DIY电子测光表+成果贴

共1条 1/1 1 跳转至

[Let'sDo第3期]DIY电子测光表+成果贴

菜鸟
2024-12-03 17:47:15     打赏

电子测光表具体功能实现如下:


1. 简介

电子测光表是不可或缺的辅助工具,对我们来说可以利用其功能做出非常可靠的产品,可以给我们带来很大的帮助与便捷,光传感器是通过精确测量光线的强度和亮度,把相关的信息反馈给MCU,再进行其它的功能操作。

下面将详细阐述电子测光表的软件功能设计,包括界面设计、测光原理实现、以及可能的扩展功能。


2. 功能设计

开机就进行界面显示状态,显示有采集的值,实时参数,屏幕最顶端是显示www.eepw.com,显示红色框体与绿色字体。

页面刚进入时,滚动显示“Hello EEPW  Hello DigiKey,显示实时的光强度值”。

正中间字滚动效果,其滚动显示可以采用平滑的滚动动画,增加用户界面的友好性和吸引力。


主要元素:


Adafruit ESP32-S3 Reverse TFT Feather

主要特性

处理器:搭载Xtensa® 32位LX7双核处理器,主频高达240MHz,内置512KB SRAM(TCM)。

GPIO管脚:具有45个可编程GPIO管脚。

通信接口:配备丰富的通信接口,集成2.4GHz Wi-Fi和Bluetooth 5(LE),并配备原生USB,可用作键盘/鼠标、MIDI设备、磁盘驱动器等。

内存:带有4MB闪存和2MB PSRAM。

显示屏:采用彩色1.14英寸IPS TFT显示屏,分辨率为240x135像素,使用ST7789芯片组,高清且可从任何角度观看。

电源选项:支持USB C型或锂聚合物电池供电,通过USB-C供电时可为内置电池充电。

电池监控:具有LiPoly电池监控器(LC709203芯片),可主动监控电池的电压和充电状态,并通过I2C报告电池电量百分比。

按钮:包含重置和DFU(BOOT0)按钮,可用于进入ROM引导加载程序。

USB端口:内置原生USB串行端口,不需要单独的电缆,可选串行调试输出引脚,用于检查硬件串行调试控制台。

STEMMA QT连接器:用于I2C设备,具有可切换电源,可进入低功耗模式。

板载NeoPixel:具有引脚控制电源,可实现低功耗,用于多种状态显示。

低功耗:在深度睡眠模式下,可从Lipoly连接获得80~100uA的电流消耗。

兼容性:可与Arduino或CircuitPython一起使用。


正反面照片:

image.png


背面功能定义:

adafruit_products_back_updated-100.jpg

正面功能定义:

adafruit_products_PrettyPins_Adafruit_ESP32-S3_Reverse_TFT_Feather_Display-Side_Pinout.jpg

开发板原理图:

adafruit_products_schem.png

按键:用户可以通过按键调节,实时操作,屏上就可以跟据按键按下的哪个键显示对应的信息。

image.png

原理图:

image.png


BH1750光传感器

工作原理:BH1750的内部由光敏二极管、运算放大器、ADC采集、晶振等组成。光敏二极管通过光生伏特效应将输入光信号转换成电信号,经运算放大电路放大后,由ADC采集电压,然后通过逻辑电路转换成16位二进制数存储在内部的寄存器中(光照越强,光电流越大,电压就越大)。

技术规格:

供电电压:+3~5V

接口:I2C

量程和精度:1~65535 lx

尺寸:0.85x0.63x0.13英寸(21x16x3.3毫米)

光亮度数据参考(单位:lx):晚上0.0010.02;月夜0.020.3;多云室内550;多云室外50500;晴天室内1001000;夏天中午光照下可达较高值;阅读书籍时的照明度5060。

特点:

支持I2CBUS接口,对应广泛的输入光范围。

通过降低功率功能,实现低电流化。

通过50Hz/60Hz除光噪音功能实现稳定的测定。

支持1.8V逻辑输入接口,无需其他外部件。

光源依赖性弱,有两种可选的I2C slave地址。

受红外线影响很小。


image.png



原理图:

image.png

振动电机

通过振动,设备可以向用户传递信息或提供触觉反馈,从而增强用户体验。


3、框图

image.png

4、代码


# 控制电机的引脚
MOTO = digitalio.DigitalInOut(board.A5)
MOTO.direction = digitalio.Direction.OUTPUT
MOTO.value = False

# 控制LED的引脚
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT

# 按钮1的引脚,启用上拉电阻
button = digitalio.DigitalInOut(board.A2)
button.switch_to_input(pull=digitalio.Pull.UP)

# 按钮2的引脚,启用下拉电阻
button2 = digitalio.DigitalInOut(board.A3)
button2.switch_to_input(pull=digitalio.Pull.DOWN)

# 初始化I2C接口,连接光照传感器
i2c = board.I2C()  # 使用板载的SCL和SDA
sensor = adafruit_bh1750.BH1750(i2c)

# 设置边界、字体大小、背景颜色、前景颜色等
BORDER = 40
FONTSCALE = 3
BACKGROUND_COLOR = 0xFFFFFF  # 白色背景
FOREGROUND_COLOR = 0xFF0000  # 红色矩形框
TEXT_COLOR = 0x00FF00  # 绿色文字
TEXTA_COLOR = 0x000000  # 黑色文字(中间文本)

# 显示对象
display = board.DISPLAY

# 创建显示上下文
splash = displayio.Group()
display.root_group = splash

# 函数:创建背景
def create_background():
    color_bitmap = displayio.Bitmap(display.width, display.height, 1)
    color_palette = displayio.Palette(1)
    color_palette[0] = BACKGROUND_COLOR
    bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
    return bg_sprite

# 函数:创建红色矩形
def create_red_rectangle():
.
.
.
.

# 函数:创建绿色文字(头部)
def create_green_text():
.
.
.
.


# 函数:创建中间显示区域的文本
def create_middle_text():
.
.
.

# 函数:创建中间文本下方的中文文本
def create_chinese_text():
    text = "EEPW&DigiKey!"  # 中文文本
    text_area = label.Label(terminalio.FONT, text=text, color=TEXTA_COLOR)
    text_width = text_area.bounding_box[2] * FONTSCALE
    text_height = text_area.bounding_box[3] * FONTSCALE
.
.
.

# 初始化背景、矩形、绿色文本、中间文本和中文文本
bg_sprite = create_background()
.
.
.

# 将初始的背景、红色矩形、绿色文本、中间文本和中文文本添加到splash中
splash.append(bg_sprite)
splash.append(red_rect)
.

# 存储对中间文本和中文文本区域的引用,以便后续更新
middle_text_area = middle_text_group[0]
..

last_text = ""  # 变量,存储最后一次显示的文本

# 开始滚动文本的起始位置
scroll_x_position = display.width  # 从右侧开始

while True:
    # 显示BH1750光照传感器的值
    text = "BH1750: %.2f lux" % sensor.lux
    print(text)

    # 检测按钮按下并更新文本
    if not button.value:  # 按钮1被按下
        text = "Hello EEPW!"
        led.value = True  # 按钮1按下时点亮LED
        print(text)
    elif not button2.value:  # 按钮2被按下
        text = "Hello DigiKey!"
        led.value = True  # 按钮2按下时点亮LED
        print(text)
    else:
        led.value = False  # 没有按钮按下时关闭LED

    # 仅在文本发生变化时更新显示
    if last_text != text:
        last_text = text
        middle_text_area.text = last_text

    # 更新中间文本的滚动位置
    scroll_x_position -= 3  # 向左移动文本,移动3个像素

    # 如果文本滚动出屏幕,则重置为右侧起始位置
    if scroll_x_position < -middle_text_area.bounding_box[2] *.....
        scroll_x_position = display.width  # 重置为起始位置

    # 更新中间文本的x坐标
    middle_text_group.x = scroll_x_po.....

    # 小延时,用于按钮的去抖动
    time.sleep(0.05)


5、实物

自制PCB板:

87a6796ad474d698a18433ca311e87a.jpg


开发进度:

image.png

最终界面:

image.png

运行结果:

Video_2024-12-03_185428 00_00_00-00_00_30.gif


6、功能演示

https://www.bilibili.com/video/BV15izmYwEzx/



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]