上期:ESP32-S3手持光谱仪DIY:百元级硬件搭建全过程(硬件篇)
上一期我们介绍了设计一款基于ESP32的手持式光谱仪的硬件设计。这一期我们完成软件开发部分。
最开始我以为这事的难点会在光谱传感器本身,毕竟 AS7341 像那种 datasheet 能把人看困的器件。结果真正做下来我发现,传感器反而只是起点。真正麻烦的,是怎么把采集、显示、BLE、配置、保存这些东西串成一个闭环。不是说它们分别能跑就行,而是你得让它们接起来之后,像一个完整产品,而不是一堆模块拼在一起。
1、系统架构图
ESP32-S3 做主控,AS7341 负责采集 8 个可见光通道和 1 个红外通道,ST7789 负责把结果画在屏幕上,BLE 负责把参数和数据往外送,Preferences 负责把配置存下来,另外再挂一个 MAX17048 看电池,再加一个触摸补光灯,差不多就齐了。
2、采集与显示
这里我直接把 AS7341 的各通道结果画成柱状图,而且柱子的颜色跟波长大致对应。415nm、445nm、480nm 一路排过去,可以直观的感受到波长对应的肉眼颜色情况,将数据上报变为可视化的柱状图。
做了自动缩放,能保证设备在不同光照环境下都保持很强的动态感。
voiddrawBars(constuint16_t readings[12]){uint16_t maxValue = 1;for (uint8_t i = 0; i < kChannelCount; ++i) {uint16_t value = readings[kReadingIndices[i]];if (value > maxValue) {maxValue = value;}}tft.fillRect(kSideMargin, kChartTop, kChartWidth, kChartHeight, TFT_BLACK);for (uint8_t i = 0; i < kChannelCount; ++i) {uint16_t value = readings[kReadingIndices[i]];int x = kSideMargin + i * (kBarWidth + kBarGap);int barHeight = map(value, 0, maxValue, 0, kChartHeight - 6);int y = kChartTop + kChartHeight - barHeight;int valueY = y - 10;if (valueY < kChartTop) {valueY = kChartTop;}tft.fillRect(x, y, kBarWidth, barHeight, kBarColors[i]);tft.drawRect(x, y, kBarWidth, barHeight, TFT_DARKGREY);tft.setTextColor(TFT_WHITE, TFT_BLACK);tft.drawCentreString(String(value), x + (kBarWidth / 2), valueY, 1);tft.drawCentreString(kChannelLabels[i], x + (kBarWidth / 2), kScreenHeight - 14, 1);}tft.fillRect(110, 16, 84, 16, TFT_BLACK);tft.setTextColor(TFT_GREEN, TFT_BLACK);tft.drawString("Max:" + String(maxValue), 110, 18, 2);drawBleStatus();drawWiFiStatus();drawMqttStatus();drawPowerStatus();}
3、BLE蓝牙
不同的环境下参数有时候要做出改变,为了更方便的更改设备参数,gain、atime、astep,这些东西你不调,数据就可能发虚,可能过曝,可能暗得像没开机。这里我让ESP32开启BLE功能,可以让手机连接设备并修改参数。
设备把自己广播成 Spectrometer,手机连上之后,直接通过 BLE 去写设备配置和传感器配置。WiFi、MQTT、增益、积分时间、补光策略,都是文本写入,支持部分更新,写完立刻生效,还能进Preferences。
这就很关键了。
因为从用户视角看,它终于不是一块要靠电脑伺候的板子了。它开始像一个能自我管理参数的小设备。
这里把 BLE 拆成了三个服务,数据、设备配置、传感器配置,各管各的。这个结构特别在给未来留门。后面可以接一个 App,甚至接一个上位机,协议都还是顺的。说到底,BLE 在这里不只是通信,它其实是这个设备的控制面板。
4、参数存储
如果改完一次参数,下次开机全忘了,那这个体验还是断的。很多硬件项目都会卡在这里,看着好像已经有交互了,实际上每次上电都像失忆,昨天调好的东西今天重新来一遍,搞得人心态很差。
所以Preferences / NVS在这个项目里虽然不起眼,但地位其实非常高。
我把 WiFi、MQTT 和 AS7341 参数分命名空间保存,BLE 一写入,设备立刻更新内存里的配置,同时马上落盘。下次开机优先读取保存值,没有再回到默认值。这个动作一旦做了,设备的时间维度就出来了。它不再只是「此刻能工作」,而是「记得自己是谁」。
5、补光设置
我给了它最基础的人机操作入口,触摸补光。用户摸一下 IO4,补光灯亮,松开就灭,而且亮度还能通过参数控制。这个交互的好处在于,手指一碰,光就出来了,这种反馈是非常即时的。
而且补光灯这件事,某种程度上也是在帮光谱仪补上使用场景可以在环境光很暗的情况下使用补光灯来提供一定的环境光。
上位机
上位机下一期再讲吧
602