电子测光表具体功能实现如下:
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一起使用。
正反面照片:
背面功能定义:
正面功能定义:
开发板原理图:
按键:用户可以通过按键调节,实时操作,屏上就可以跟据按键按下的哪个键显示对应的信息。
原理图:
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地址。
受红外线影响很小。
原理图:
振动电机
通过振动,设备可以向用户传递信息或提供触觉反馈,从而增强用户体验。
3、框图
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板:
开发进度:
最终界面:
运行结果:
6、功能演示
https://www.bilibili.com/video/BV15izmYwEzx/