[Let'sDo第三期]电子测光表项目成果汇总贴 --完结散花
开箱贴:https://forum.eepw.com.cn/thread/388279/1
过程贴:https://forum.eepw.com.cn/thread/388467/1
喜大普奔!终于迎来了总结贴,工作周期确实有点长,那也没办法,吹毛求疵,眼高手低,尽量把作业做到自己满意的程度,才能安心下一站,耗费时间较多,但是也是值得的,过程中不单只学习传感器的原理,项目代码的组织管理,还有报告的撰写,各种技能都锻炼了一遍,玩就要玩到极致,到时玩不动了,回来看看也不觉得有啥亏欠。
一、项目总体思路
趁着外出的几天把项目的思路捋了一遍,呈现如下。主要的运作思路在于依赖esp32集成的FreeRTOS (实时操作系统)的任务管理办法思路,将基础硬件封装成类,并建立对应的任务,使得数据采集、舵机自动运转不依赖于主循环而独立运行于后台,为主程序提供服务,在项目中实现了光照强度的连续不间断的采集,舵机自动往返并且可以控制启停,LedMatric的额外的任务负责提供氛围灯效,启动后可以自动演示等离子灯效,这个灯效非常好看,也可以通过蓝牙和微信小程序通信后,更改灯光颜色。 在主循环中,只监测按键是否被按下,按键的功能可模拟拍照和切换曝光模式。UI设计采用了LVGL8.4完成,保持了LVGL的商业风格,运行流畅。 项目提供了多种功能,如曝光参数计算、LED效果、舵机控制等,能够满足较为复杂的应用需求。使得系统具备了更强的适应性和可扩展性,增强了用户体验。
项目完成后对文件系统进行了分类整理,使得项目的架构更加清晰和便于理解。
/* 文件系统管理/
F:.
| main.cpp
| ResourceManager.cpp
| ResourceManager.hpp
|
+---HalBase
| BLEManager.cpp
| BLEManager.h
| BLEManager.md
| Button.cpp
| Button.h
| LedController.cpp
| LedController.h
| LuxHandler.cpp
| LuxHandler.hpp
| lvgl_setup.hpp
| unit_puzzle.hpp
|
+---images
| adafruit_logo.c
| bg_map.c
| DK_logo.c
| EEPW_logo.c
|
\---UI
lvgl_animation.cpp
lvgl_animation.hpp
TestController.cpp
TestController.h
TestView.cpp
TestView.h
补充完整组装照片:
一、光照强度管理
在项目过程贴中,已对拍照的三元素和曝光模式的计算核心函数做较为深入的解析。构建了一个库类(LuxHandler),实现了一个自动控制舵机和曝光参数的系统,通过读取光照强度(LUX值)来自动调整曝光参数(光圈、快门、ISO等),同时控制舵机的角度以响应光照变化或其他任务需求。主要包含三个核心功能模块:舵机控制、光照强度检测与自动曝光计算、任务调度与管理。初始化后就可以自动运行,是本项目最为核心内容,经过了大量测测试和优化。
关键的工作流程是:
启动任务调度,分别处理舵机控制和光照强度读取任务。
根据光照强度调整曝光参数。
控制舵机角度在0到100度之间反向运动。
可通过 toggleServo 启用或禁用舵机控制。
二、LedMatric灯效管理
LedMatric灯效管理是本项目的支线任务,因为联想到市面上现在有些专门营造拍摄灯光氛围的工具,因此,为了增加观赏性,使用 LedController 类实现了多种LED灯效,包括常亮、彩虹、等离子等效果。核心功能是通过控制画布(canvas)的颜色来实现不同的视觉效果,canvas是来自屏幕驱动lovyanGFX里面的组件,除了屏幕驱动的作用,也灯效提供了底层的作图函数,一举两得。类中提供了控制LED开关、颜色、亮度、效果开关等方法。vTaskLedupdate 任务函数周期性地更新LED显示,根据当前的状态决定显示的内容。使用的等离子效果通过计算像素的动态颜色值来实现波动的效果,而彩虹效果则是通过色轮变化来创建色彩渐变。
三、UI设计与交互
通过 LVGL 图形库创建动态更新的 UI 界面,能够根据不同的输入动态调整界面的内容,特别是在显示相机曝光模式、光圈、快门等数据时。使用了 TileView 组件来管理界面的布局,适合显示分块内容,提供灵活的滚动方式。表格 lv_table 用于显示信息,支持动态更新,适合展示类似“光圈、快门、ISO”等数据。ExposureMode 枚举变量控制不同的曝光模式,并且通过颜色变化反映在界面上,使得用户能清晰看到当前的曝光模式。
整个界面的逻辑流程如下:
在 create() 方法中创建并初始化主界面及子组件。
通过 update*() 方法动态更新数据。
通过回调函数定制每个表格项的绘制效果。
使用 load() 方法加载界面并显示。
使用 destroy() 方法销毁界面,释放资源。
四、蓝牙控制任务管理
实现了一个BLE服务器端,允许通过蓝牙方式连接手机上的微信小程序远程控制相机的设置(光圈、快门速度、ISO)以及RGB LED控制。BLE客户端可以连接服务器并通过不同的特性修改相机设置。每当客户端写入新的设置时,服务器会更新并通知客户端。
项目总结及体会:
1. 模块化设计:本项目采用了模块化设计,确保了不同功能模块(如UI、BLE、LED控制等)的独立性。通过抽象类和接口来实现硬件的控制,使得各个模块之间的耦合度低,便于后期的维护和扩展。这种方式使得硬件的操作与具体实现解耦,能够简化硬件平台的切换和移植工作,能够快速定位问题并对模块进行单独优化和替换,项目展现出了较强的可扩展性。
2. FreeRTOS应用:通过FreeRTOS实现任务调度,项目能够高效地管理多个任务。FreeRTOS作为一种实时操作系统,提供了多任务的优先级管理、时间片分配、任务挂起与恢复等功能,有效提高了系统的实时性和响应速度。高实时性保证了系统能够在较短的时间内响应外部事件,避免了因任务延迟导致的系统性能瓶颈,提升了用户体验和系统稳定性。
3. LVGL 用户界面设计: 项目使用了 LVGL (Light and Versatile Graphics Library) 库来创建用户界面。LVGL库具有高灵活性和可定制性,该库的可定制性使得开发者能够根据不同应用需求快速调整UI风格和布局,增强了界面的视觉表现力。
4. 无线通信能力:项目通过 BLE (Bluetooth Low Energy) 实现了与外部设备的无线通信,增强了系统的交互能力和可扩展性。BLE使得项目能够与其他智能设备进行实时交互,通过BLE,系统不仅能够实现控制,还可以进行数据采集、状态反馈等功能,增加了系统的灵活性和适用场景。
完整代码地址:https://gitee.com/genvex/eather_servo_final
项目介绍 B站视频地址【202412152124】 https://www.bilibili.com/video/BV1STBFYQESh/?share_source=copy_web&vd_source=bed775561efaa18e90586ab291600126
再见2024,你好2025!