描述
<h2><strong>1、项目功能介绍</strong></h2>
<h3><strong>1.1、设计背景</strong></h3>
<p>这个项目是<a href="https://oshwhub.com/tweeaakc/project_hsmgdfeo" target="_blank">十元微安表</a>的伴生物,起因是某天好兄弟 @aaaieynmri 启发了我:
<img src="https://image.lceda.cn/oshwhub/pullImage/aef7829cfe2b41808989a88bd113f06b.png" alt="image.png"></p>
<hr>
<p>瞬间思路打开,刚好本人手里有一堆电子垃圾:
<img src="https://image.lceda.cn/oshwhub/pullImage/4faccca912744e1dbb6d7736a1a1d9bd.png" alt="image.png"></p>
<hr>
<p>印象中CH592F刚好有LCD驱动和BLE,简直天选:
<img src="https://image.lceda.cn/oshwhub/pullImage/1663e58efb1c486da7da0b354f38d479.png" alt="image.png"></p>
<hr>
<p>结合手头的器件,我迅速做出了第一版硬件:<img src="https://image.lceda.cn/oshwhub/pullImage/daf93ad42dc340f5aa375e3be4f35b65.png" alt="image.png"></p>
<hr>
<p>但在测试时,发现了以下问题:</p>
<ol>
<li>
<p><strong>三种屏幕</strong>的引脚排布<strong>不是居中对齐</strong>的,经过无数次调整,最终测出实际应为:<img src="https://image.lceda.cn/oshwhub/pullImage/3ac6b718de814f49bbd53c0d6319ef24.png" alt="image.png"></p>
</li>
<li>
<p>若使用了偏上触点的屏幕,会导致外壳底部留白过多,下巴显得很大,还不能适配原装外壳。<img src="https://image.lceda.cn/oshwhub/pullImage/6393c192d4bb4de5b072ce1f66a72111.png" alt="image.png"></p>
</li>
<li>
<p>集成三种屏幕导致走线混乱,地平面分割严重,启用 <strong>DCDC</strong> 时 <strong>BLE 广播</strong>无法接收。</p>
</li>
<li>
<p>烧录触点的布置非标准间距,使用不便。</p>
</li>
</ol>
<p><strong>本着不留遗憾的想法,重新画了第二版,以上问题已全部解决,还优化了不少痛点。</strong></p>
<hr>
<h3><strong>1.2、项目介绍</strong></h3>
<p><strong>此设计的BLE部分基于BTHOME:</strong></p>
<p>是一种基于低能耗蓝牙广播的开放标准协议,只需要按照格式填写广播包,Home Assistant 这样的智能家居系统即可直接接收并解析,读出温度、湿度、电量等数值。
<img src="https://image.lceda.cn/oshwhub/pullImage/d4ecc06db9ea46b58c91711e7dc9ecf5.png" alt="image.png"></p>
<hr>
<p><strong>LCD与外壳直接采用供体:</strong></p>
<p>三个状态灯被我用来指示电量(证明不是原版)
<img src="https://image.lceda.cn/oshwhub/pullImage/ec13746674184ac0ae580bbdbe62a270.png" alt="image.png"></p>
<hr>
<p><strong>详细参数:</strong></p>
<ul>
<li>典型平均电流为:7.56uA ~ 7.79uA</li>
<li>极限续航预估:866 ~ 1034 天</li>
<li>保守续航预估:大于 1 年</li>
<li>温度测量范围:-40℃ ~ +125℃</li>
<li>温度测量精度:±0.2℃</li>
<li>湿度测量范围:0%RH ~ 100%RH</li>
<li>湿度测量精度:±1.8%RH</li>
<li>温度显示分辨率:1位小数</li>
<li>湿度显示分辨率:2位小数(BLE),整数(LCD)</li>
</ul>
<p><strong>26.7.22更新:</strong>
经过整机实测,平均电流仅为7.01uA(±0.2uA):
<img src="https://image.lceda.cn/oshwhub/pullImage/9071924cac104177b00d46d698ea1227.png" alt="image.png">
> 测试条件:26.7℃、49%RH、LCD 3V3 1/2、DCDC、HSE_16M。</p>
<h2><strong>2、项目属性</strong></h2>
<p>本项目为原创设计,当前版本为首次公开。
未参与过任何比赛或学校答辩,未获得过相关奖项。</p>
<h2><strong>3、开源协议</strong></h2>
<p>本项目 <strong>100% 开源</strong>,采用 <strong>CC BY-SA 4.0</strong> 协议。</p>
<h3>3.1、开源范围包括</h3>
<ul>
<li>固件源代码</li>
<li>工况能耗计算器</li>
<li>续航成本计算器</li>
<li>段码屏驱动生成脚本</li>
<li>原理图与 PCB 设计文件</li>
<li>外壳 3D 打印文件</li>
</ul>
<h3>3.2、协议要点</h3>
<ul>
<li>署名:衍生项目须注明原作者</li>
<li>相同方式共享:修改后的项目须以相同协议开源</li>
<li>商业使用:无限制</li>
</ul>
<h2><strong>4、硬件部分</strong></h2>
<h3><strong>4.0、温湿度测量</strong></h3>
<p>电子垃圾原本使用的是NTC+湿敏电阻方案,NTC在<strong>典型温区</strong>精度尚可,但<strong>湿敏电阻</strong>可以说<strong>非常糟糕</strong>了。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/fbebbf121f8c47f882752e375c8d388a.png" alt="image.png"></p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/f0d17d53f94740eabbcabd9c531cf2b8.png" alt="image.png"></p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/0ec826364e6f4352b350ed5425df0fa3.png" alt="image.png"></p>
<p>上述两个元件看上去便宜,但还需要付出<strong>额外</strong>的分压电阻、驱动网络、ADC等资源。在测量时MCU耗电也是mA级别的,可以说他们存在的意义就是<strong>低成本给出一个数</strong>。</p>
<hr>
<p>目前更主流的方案是 <strong>数字温湿度传感器</strong>,出厂校准,高集成,低功耗:
<img src="https://image.lceda.cn/oshwhub/pullImage/f556a83725a1436dae6681ef79a139e7.png" alt="image.png"></p>
<ul>
<li>
<p>在这些型号中,最主要的差异在于能否支持<strong>低电压</strong>与<strong>低功耗</strong>。</p>
</li>
<li>
<p>CH592F 的最低工作电压是 <strong>1.7V</strong>,但 2X、3X 系列的<strong>最低电压都大于 2V</strong>。</p>
</li>
<li>
<p>剩下的有 C3、40、41、43、45。</p>
</li>
<li>
<p>C3算是3.5代,他支持最低1.62V,还有430uA的测量功耗,但值得注意的是,他的休眠电流高达0.3uA。</p>
</li>
<li>
<p>所以<strong>SHT40</strong>是最<strong>均衡</strong>的选择,价格也较为合理,为<strong>2元左右</strong>。
<img src="https://image.lceda.cn/oshwhub/pullImage/a0eda67c9c70434bb67c55f8b82b3777.png" alt="image.png"></p>
</li>
</ul>
<h3><strong>4.1、储能电容</strong></h3>
<ul>
<li>作为一个低功耗设备,电源是必须首要考虑的,我在众多开源的<strong>蓝牙温湿度计</strong>上能发现一个特点,那就是<strong>大量</strong>的储能电容,比如:
<img src="https://image.lceda.cn/oshwhub/pullImage/a3bbdab6a44546b0b0e426d07c0485f4.png" alt="image.png"></li>
</ul>
<p>经过学习,此电容阵列可能来自<a href="https://oshwhub.com/azunya/ch592f-cr1220" target="_blank">@Azunya 蓝牙温湿度计</a>,但在原设计中使用的是<strong>CR1220电池</strong>。</p>
<hr>
<p>我们可以进行简略计算,CR1220 的截止电压为 $$2\text{ V}$$,CH592 的最低输入电压为 $$1.7\text{ V}$$。截止电压仍满足要求,即:</p>
<p>$$V<em>{\text{cutoff}} = 2\text{ V} > V</em>{\text{min}} = 1.7\text{ V}$$</p>
<p>看着挺好,但一枚 $$2\text{ V}$$ 的 CR1220 电池在<strong>寿命末期</strong>,其<strong>内阻</strong>可能达到 $$3000\ \Omega$$ 之多,而 <strong>BLE 发射</strong>时电流峰值达 $$10\text{ mA}+$$,持续时间假设为 $$5\text{ ms}$$ 。我们将此参数带入以下<strong>瞬态电压衰减方程</strong>,</p>
<p>$$V(t) = (V<em>{\text{cutoff}} - I</em>{\text{peak}} R) + I_{\text{peak}} R \cdot e^{-\frac{t}{R C}}$$</p>
<p>计算后可得:$$C \ge \frac{5 \times 10^{-3}\text{ s}}{3000\ \Omega \times 0.01005} \approx 165.8\ \mu\text{F}$$</p>
<p>系统至少需要一个<strong>最小有效容量</strong>为 $$165.8\ \mu\text{F}$$ 的储能电容。</p>
<p>此外,由于 MLCC 存在明显的<strong>直流偏置</strong>效应,我们假设衰减 $$50\%$$:</p>
<p>$$C_{\text{effective}} \approx 47\ \mu\text{F} \times 8 \times 50\% = 376\ \mu\text{F} \times 50\% \approx 188\ \mu\text{F}$$</p>
<p>可以看出<strong>其选用</strong>的 $$188\ \mu\text{F}$$ 与<strong>我们计算</strong>的 $$165.8\ \mu\text{F}$$ 属于<strong>同一数量级</strong>。</p>
<hr>
<p>因此也照搬了这个设计,但我马上就发现事情不对。
我的<strong>待机功耗爆炸高</strong>,经过无数次的代码修改,硬件调试,最后发现是<strong>电容在漏电</strong>。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/4abb02d8d3864ef3b7d5b2e76d3f0615.png" alt="image.png"></p>
<p>在电容的<strong>规格书中</strong>可以发现,<strong>绝缘电阻</strong>($$R_i$$)与标称<strong>电容量</strong>($$C_R$$)的<strong>乘积</strong>为 <strong>自放电时间常数</strong> 。</p>
<p>单位换算关系为:$$\Omega \times \text{F} = \text{s}$$。</p>
<p>如果<strong>代入</strong>整套并联电容的标称总容量 $$376\ \mu\text{F}$$,要求<strong>满足</strong>自放电时间常数大于 $$100\text{ s}$$,我们可以<strong>倒推</strong>出最低阻抗 $$R_i$$:</p>
<p>$$R_i \ge \frac{100\text{ s}}{376\ \mu\text{F}} = \frac{100\text{ s}}{376 \times 10^{-6}\text{ F}} \approx 265,957\ \Omega \approx 266\text{ k}\Omega$$</p>
<p>假设此时电池电压为 $$3\text{ V}$$,代入计算<strong>漏电流</strong>:</p>
<p>$$I_{\text{leak}} = \frac{V}{R_i} = \frac{3.0\text{ V}}{265,957\ \Omega} \approx 11.3\ \mu\text{A}$$</p>
<p>可以看到,这一组<strong>标称</strong> $$376\ \mu\text{F}$$ 的电容,在<strong>规格书允许的漏电极限下</strong>能带来<strong>高达</strong> $$11.3\ \mu\text{A}$$ 的静态电流。也许你不清楚这是什么概念,简单来说就是,<strong>漏的比用的还多</strong>。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/7f375052e8de4fa9ab6b62b34448dc67.png" alt="image.png"></p>
<p><strong>至此也带来了第一个悖论,若想续航久需要加入电容,但是加了电容又导致续航缩水,如何找到平衡点?</strong>(问题一)</p>
<hr>
<h3><strong>4.2、DC-DC</strong></h3>
<p>CH592内置DC-DC转换,可降低功耗,并且根据规格书中的内容,其对BLE射频部分作用巨大:
<img src="https://image.lceda.cn/oshwhub/pullImage/dbb8958e4fec41d9a6b31f9bc46d3620.png" alt="image.png"></p>
<ul>
<li>但需要<strong>加钱</strong>买电感电容,并且<strong>射频性能</strong>可能下降。
<img src="https://image.lceda.cn/oshwhub/pullImage/6ffc56385798480d8144e73c73dd3fd4.png" alt="image.png"></li>
</ul>
<p><strong>最关键的是,在待机状态下DCDC是不工作的,而我们设备 99% 的时间都在待机,那多花费 1-2元加入DC-DC是否划算?</strong>(问题二)</p>
<hr>
<h3><strong>4.3、能效</strong></h3>
<h4><strong>4.3.1、LCD功耗 (HSE_16M,DC-DC_ON)</strong></h4>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/fb0f905edd874a398a758204a39f2be9.png" alt="image.png"></p>
<ul>
<li>[1] MCU 的 <strong>LCD 控制器功耗</strong>大约是 4.3-1.1=<strong>3.2uA</strong></li>
<li>[2] <strong>LCD 的功耗</strong>大约是 6.79-4.3=<strong>2.49uA</strong></li>
</ul>
<hr>
<h4><strong>4.3.2、 1V2 供电与主频 (LDO/DCDC,16M/60M)</strong></h4>
<p>条件限制,<strong>非同时间</strong>测试,uA 级测量影响因素极多,<strong>仅供参考</strong>。</p>
<p><strong>待机</strong>的定义为 MCU 与 SHT40 都进入休眠:
<img src="https://image.lceda.cn/oshwhub/pullImage/4d9c6f5ad2d0407fac8d37453bbf3dda.png" alt="image.png">
我使用的 <strong>SHT40</strong> 来自 <strong>Nyfea(徕飞)</strong>,比起原厂来说<strong>休眠电流可能稍高</strong>。
经后续对比相差不大(不如助焊剂1%)。</p>
<hr>
<p><strong>测量不发</strong>的定义为 MCU 获取到温度后不进行广播、但会刷新屏幕:
<img src="https://image.lceda.cn/oshwhub/pullImage/6ef45e0064ab42f48288fda6d2e5189b.png" alt="image.png"></p>
<p>可以看到<strong>高主频</strong>下由于速度更快,相比 <strong>16M</strong> 耗能降低约 <strong>6%</strong> ;<strong>DC-DC</strong> 相比 <strong>LDO</strong> 降低 <strong>20%</strong> 左右。</p>
<hr>
<p><strong>测量需发</strong>相比前者还需要配置 RF 相关寄存器,耗时更长:
<img src="https://image.lceda.cn/oshwhub/pullImage/1b42e437255849e1b164771375719e75.png" alt="image.png">
此事件下 <strong>高主频</strong> 与 <strong>DCDC</strong> 的优势更加明显,分别降低约 <strong>12%</strong> 与 <strong>28%</strong> 耗能。</p>
<hr>
<p><strong>发射</strong>与前者绑定,在当前固件为 <strong>1组10次</strong> ,即 1 次测量需发固定会发射 10 次广播:
<img src="https://image.lceda.cn/oshwhub/pullImage/d4dd0dbe38c74d0eb25305dd0b430567.png" alt="image.png">
在发射时 <strong>DC-DC</strong> 甚至可<strong>降低 40% 耗能</strong>,与规格书相符。高主频降低 <strong>5%</strong> 左右。</p>
<hr>
<p><strong>事件小结:</strong></p>
<ul>
<li><strong>DC-DC</strong> 对于<strong>高 1.2V</strong> 耗能事件优势明显,但在<strong>待机状态无作用</strong>。</li>
<li><strong>高主频</strong> 能有效减少唤醒时间,但当 <strong>PLL</strong> 启用时,又会导致 <strong>8mA的峰值电流。</strong></li>
</ul>
<hr>
<p><strong>在我的测试中,$$\frac{不发}{需发}$$ 大约在 30 左右:</strong></p>
<ul>
<li><img src="https://image.lceda.cn/oshwhub/pullImage/145debc5b0a748169a5688e287928752.png" alt="image.png"></li>
</ul>
<p>若你的环境变动剧烈,可用我提供的<strong>工况计算器</strong>自行计算,假如<strong>把发射频率增大 14 倍</strong>,可以看出 <strong>DCDC</strong> 和 <strong>高主频</strong> 优势体现:</p>
<ul>
<li><img src="https://image.lceda.cn/oshwhub/pullImage/bddf3e2ad87b4796b0183c56e7592e59.png" alt="image.png"></li>
</ul>
<hr>
<p>但在正常工况下,<strong>DCDC</strong> 与 <strong>高主频</strong> 优势很小,还带来了<strong>额外成本</strong>或是<strong>高峰值电流</strong>。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/c13e1a4d1b2b4ebf8e3eb02d589cb7eb.png" alt="image.png"></p>
<p><strong>(此时已经很接近了,但想要回答那两个问题还需要再进一步。</strong></p>
<hr>
<h3><strong>4.4、成本、续航计算器</strong></h3>
<p>至此我们有了所有数据,可以请出我们的<strong>续航计算器</strong>了。</p>
<h4><strong>4.4.1、HSE_16M_DCDC 成本、续航计算</strong></h4>
<p>查看峰值电流情况,我将其定义为2.9mA 8mS:
<img src="https://image.lceda.cn/oshwhub/pullImage/e86a82560f1145c98997791a1de63e75.png" alt="image.png"></p>
<p>将我们测试的数据填入计算器中:
<img src="https://image.lceda.cn/oshwhub/pullImage/871f4722a37d49ee83aa2119e0f31b6e.png" alt="image.png"></p>
<p>会自动计算出关键的<strong>性价比点</strong>、以及<strong>最大续航点</strong>:</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/72409faa9161458dbb8b610403ec87f8.png" alt="image.png"></p>
<ul>
<li>
<p>可以看出,在这个配置下,<strong>最佳性价比</strong>和<strong>最长续航</strong>是<strong>同一个</strong>,且<strong>完全不加电容</strong>。</p>
</li>
<li>
<p>只有当<strong>低峰值电流</strong>、<strong>低待机电流</strong>,两者<strong>同时存在时</strong>才会出现这种情况。</p>
</li>
<li>
<p>最终其预计续航 <strong>992天</strong> ,折算 <strong>1278天/元</strong>。</p>
</li>
</ul>
<p><strong>此时我们解决了问题一,即:通过计算得出,在此时一颗电容都不加才是最优解。</strong></p>
<hr>
<h4><strong>4.4.2、PLL_60M_DCDC 成本、续航计算</strong></h4>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/12d8b960b1da4373b4937bcc8bd73556.png" alt="image.png"></p>
<ul>
<li>在这个频率下,会出现一段稳定的8mA电流,时长在1.5mS左右。</li>
</ul>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/a1548ca046cf48a98d3324ac9e9a22d2.png" alt="image.png"></p>
<ul>
<li>我们将其填入计算器得出以下结果:</li>
</ul>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/1ab211250d2f4163891230dbcecaa9d0.png" alt="image.png"></p>
<ul>
<li>
<p><strong>性价比档位</strong>完全<strong>没有</strong>优势,无论是<strong>续航</strong>还是<strong>折价</strong>都<strong>不如 16M 主频+ DCDC</strong>。</p>
</li>
<li>
<p>但是<strong>续航档位</strong>确实提供了<strong>理论最长的1034天续航</strong>,但其电池+电容+电感折算达 <strong>612天/元</strong>。</p>
</li>
</ul>
<hr>
<h4><strong>4.4.3、HSE_16M_LDO 成本、续航计算</strong></h4>
<p>由于LDO缺少软启动特性,在唤醒时会爆出一个极短的大电流,因此LDO方案至少得有一个10uF才行。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/05dca06e3aaf4284b785e948d6003088.png" alt="image.png"></p>
<ul>
<li>而BLE发送时是类似三角波,我将其定义为7mA 2mS,输入计算器。</li>
</ul>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/e1a56c02bc5745b4b20119a10d38e301.png" alt="image.png">
<img src="https://image.lceda.cn/oshwhub/pullImage/c513a383d9ef4788ab8b237954feb6c3.png" alt="image.png"></p>
<ul>
<li>
<p>此方案的<strong>性价比档</strong>是目前<strong>最高的性价比</strong>,<strong>1505天/元,续航866天</strong>。</p>
</li>
<li>
<p>其<strong>截止电压</strong>大约在<strong>2.6V附近</strong>,看上去是电池没用完有点<strong>浪费</strong>,但这里先剧透一下,CH592 的 <strong>LCD 驱动没有升压,低电压屏幕对比度骤降</strong>,所以2.6V刚刚好。</p>
</li>
</ul>
<p><strong>此时我们能回答第二个问题了,若你的环境温湿度变化少,LDO的方案显然更优:更好的经济性、更少的元件、更高的射频性能。
但如果环境变化复杂,或需要高上报率,可以说DCDC是关键的。</strong></p>
<h4><strong>4.4.4、HSE_60M_LDO 成本、续航计算</strong></h4>
<p>此方案在发射时存在高达 <strong>9mA 且将近 2mS 的大电流</strong>,<strong>不推荐使用</strong>。
<img src="https://image.lceda.cn/oshwhub/pullImage/242d8a02aa604081964b685cb61ea5a2.png" alt="image.png"></p>
<hr>
<h3><strong>4.5、LCD段码屏</strong></h3>
<p>常见的屏幕主要有以下四类:
<img src="https://image.lceda.cn/oshwhub/pullImage/6e4822cc6762429cb7b7ef6695cc8b5b.png" alt="image.png"></p>
<p><strong>段码屏的功耗、成本优势都极其巨大,但其特性先天不适合零售,以至于完整的温湿度计成品甚至比单屏价格低。</strong></p>
<p>你在市面上薅到的这种屏幕的温湿度计,一般都是 4COM 屏,并且最外侧的 4 个引脚就是 COM 脚。<br>
<img src="https://image.lceda.cn/oshwhub/pullImage/f53d914dee6447efb7db5003e7e2e7fb.png" alt="image.png"></p>
<p><strong>你问我 COM 是什么?</strong>
<strong>这就引出了液晶屏驱动里核心概念:</strong></p>
<h4><strong>4.5.1、 占空比(Duty):</strong></h4>
<p><strong>屏幕物理上有几个 COM 引脚,软件配置里就选择多少占空比。</strong>
如果屏幕有 <strong>$$4\text{ COM}$$</strong> 引脚,软件就选择 <strong>$$1/4\text{ Duty}$$</strong>。</p>
<ul>
<li>COM 和 SEG 总是成对出现。</li>
<li><strong>COM 是公共电极,SEG 是段电极</strong>。</li>
<li>简单来说,和 <strong>LED 数码管</strong>的<strong>矩阵扫描</strong>一个意思,<strong>COM</strong> 负责行扫描,<strong>SEG</strong> 负责控制具体哪一笔画亮起。</li>
</ul>
<h4><strong>4.5.2. 偏置比 (Bias)</strong></h4>
<p>LCD 为了防止液晶材料电解极化必须使用交流驱动,Bias 就是指<strong>把驱动电平分为多少个电压档位</strong>,其实非常<strong>类似 ADC 采样的矩阵按键</strong>:</p>
<ul>
<li>如果是 <strong>1/2 Bias</strong>,2 就是分母,总电平包含 $$0/2\ V<em>{\text{CC}}$$、$$1/2\ V</em>{\text{CC}}$$、$$2/2\ V_{\text{CC}}$$ 三档。</li>
<li>如果是 <strong>1/3 Bias</strong>,3 就是分母,总电平包含 $$0/3\ V<em>{\text{CC}}$$、$$1/3\ V</em>{\text{CC}}$$、$$2/3\ V<em>{\text{CC}}$$、$$3/3\ V</em>{\text{CC}}$$ 四档。</li>
</ul>
<h4><strong>4.5.3. 液晶驱动电压 (VCC)</strong></h4>
<p>这里的 VCC 就是 LCD 生产制造时,液晶材料发生物理偏转所需要的标称阈值电压。一般分为 <strong>$$2.5\text{ V}$$</strong> 或 <strong>$$3.3\text{ V}$$</strong> 两个电压档。</p>
<h4><strong>4.5.4. 刷新率 (Scan CLK)</strong></h4>
<p>和数码管相同,段码屏也是循环扫描刷新的,不过他是交流,所以高频损耗更严重。</p>
<ul>
<li>如果刷新率设置得<strong>太低</strong>(比如低于 $$128\text{ Hz}$$),屏幕就会出现肉眼可见的闪烁。</li>
<li>如果刷新率设置得<strong>太高</strong>(比如高于 $$512\text{ Hz}$$),驱动效率变低,不仅对比度变浅,还增加功耗,一般推荐直接使用 <strong>$$256\text{ Hz}$$</strong>。</li>
</ul>
<hr>
<p>如果不理解上面这些,在实际调试时,只需要记住以下四条:</p>
<ul>
<li>
<p><strong>占空比(Duty):</strong>: 无脑选 <strong>$$1/4\text{ Duty}$$</strong>。</p>
</li>
<li>
<p><strong>偏置比 (Bias)</strong>:如果选 <strong>$$1/3$$</strong> 时笔段字迹看不清,就切到 <strong>$$1/2$$</strong>;如果选 <strong>$$1/2$$</strong> 出现重影,就调回 <strong>$$1/3$$</strong>。</p>
</li>
<li>
<p><strong>驱动电压 (VCC)</strong>:电压选 <strong>$$2.5\text{ V}$$</strong> 看不清字就切到 <strong>$$3.3\text{ V}$$</strong> ;电压选 <strong>$$3.3\text{ V}$$</strong> 发现出现重影,就切回 <strong>$$2.5\text{ V}$$</strong>。</p>
</li>
<li>
<p><strong>刷新率 (Scan CLK)</strong>:低了会闪,高了会淡,保持在 <strong>$$256\text{ Hz}$$</strong> 即可。</p>
</li>
<li>
<p>如果你见到这个设置界面还是感觉陌生,就再返回复习一下。
<img src="https://image.lceda.cn/oshwhub/pullImage/2a442b0a4a8e4eb38f44f3575e6c028c.png" alt="image.png"></p>
</li>
</ul>
<hr>
<h3><strong>4.6、原理图</strong></h3>
<p>此设备元件可以说只有个位数,也没什么能讲的,稍微说一下引脚配置:</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/7751d307a83e4796bfb207dac7b8d993.png" alt="image.png"></p>
<ul>
<li>
<p>黑框中的CHSEGX代表MCU视角下的SEG号。(用驱动生成脚本不需要关心</p>
</li>
<li>
<p>蓝色的SEG代表以LCD视角的SEG号。(也不需要关心</p>
</li>
<li>
<p>外面的图是电容配置参考文案,但我推荐直接看丝印。</p>
</li>
<li>
<p>依旧用满了引脚,SWD被复用了,请准备WCH-LinkE。(后期更新:没有的话影响也不大,就是需要手动断电源,默认预留5秒时间)。</p>
</li>
</ul>
<h3><strong>4.7、Layout</strong></h3>
<p><strong>这一次我直接画了三块板:</strong>
<img src="https://image.lceda.cn/oshwhub/pullImage/4864207c9e384b4fa7aaca45fc3b3df2.png" alt="image.png"></p>
<ul>
<li>
<p>现在可以完美使用原外壳了,不需要调整,不需要打印。右下角写了对应屏幕规格(不一定通用</p>
</li>
<li>
<p>现在开启DC-DC对信号影响轻微,不影响使用。</p>
</li>
<li>
<p>屏幕靠右,可以让天线距离外壳更远一些,减少信号衰减。</p>
</li>
<li>
<p>丝印中的D代表DC-DC启用时,L代表LDO启用时。0R直接用一坨锡即可。</p>
</li>
<li>
<p>天线馈线线宽0.379mm,铜距0.102mm,几乎踩在2层板极限0.1mm边缘,但我真尽力了orz</p>
</li>
<li>
<p>对了最重要的:<strong>板厚1.0!板厚1.0!板厚1.0!板厚1.0!板厚1.0!板厚1.0!</strong></p>
</li>
</ul>
<p><strong>底面:</strong>
<img src="https://image.lceda.cn/oshwhub/pullImage/90415f57c6a04950a5ee86c36a3e75c8.png" alt="image.png"></p>
<ul>
<li>
<p>电容区用来布置储能电容,支持1210 ~ 0603。</p>
</li>
<li>
<p>右上角为VCC、GND、CLK、DIO,间距2.54,可使用烧录针。(或许排针也行)</p>
</li>
<li>
<p>然后是RX、TX,需要注意的是我忘记引出BOOT了,若需要ISP下载可自行引出。</p>
</li>
<li>
<p>后期更新:完全不需要引出BOOT,只需要打开“免按键下载即可”<img src="https://image.lceda.cn/oshwhub/pullImage/c5d5a7c3bff34ff5a65c4b89845484ac.png" alt="image.png">
需要注意的是,<strong>必须把下载配置脚修改为PB11</strong>,默认的PB22会导致SEG6失去控制。(我也不知道什么原理,SWD没这问题,并且PB11是SEG1也不受影响,不过既然能跑就不研究了)。</p>
<h2>5、软件部分</h2>
</li>
</ul>
<h3>5.1、段码屏驱动生成</h3>
<p>无论什么屏幕,第一步都是要先找到<strong>驱动</strong>,段码屏也是一样,我们需要知道某个段<strong>对应的是多少 COM 多少 SEG。</strong></p>
<p><strong>传统方法</strong>就是一张纸一根笔,修改代码<strong>点亮、编译、记录</strong>,<strong>重复几十次</strong>,然后再<strong>逐个对应修改代码</strong>。</p>
<p>为了解决这个问题,我编写了一个<strong>段码屏驱动生成脚本</strong>:</p>
<ol>
<li>
<p>刷入专用固件,此固件默认以 <strong>0.5S</strong> 作为固定间隔。其首先<strong>全部段码会闪烁3次</strong>,随后<strong>轮询所有段码</strong>。</p>
</li>
<li>
<p>但在<strong>最初</strong>,你可以先将<strong>18行-49行</strong>删除,让其<strong>保持全亮</strong>,以便检查安装与显示问题。<img src="https://image.lceda.cn/oshwhub/pullImage/a06a2ea0738c4efd838f7c065fe55f88.png" alt="image.png"></p>
</li>
<li>
<p>观察你的屏幕,检查是否有<strong>闪烁</strong>、<strong>不亮</strong>、<strong>重影</strong>等特征</p>
</li>
<li>
<p>按照<strong>前文讲解</strong>调整设置,直到问题解决,记录一下你的屏幕参数。<img src="https://image.lceda.cn/oshwhub/pullImage/b8b4defd5b5048e6a34f0d2dc0aab4e1.png" alt="image.png"></p>
</li>
<li>
<p><strong>恢复原本的代码</strong>,<strong>录制</strong>屏幕从全屏闪烁、依次循环、再全屏闪烁的完整流程。</p>
</li>
<li>
<p>打开脚本,加载刚录制的视频<img src="https://image.lceda.cn/oshwhub/pullImage/800ba0ac544a4199a091ccc293660785.png" alt="image.png"></p>
</li>
<li>
<p>拖动时间轴,定位到<strong>最后</strong>一次屏幕<strong>全亮的第一帧</strong>。(半透明到不透明的那一刻)<img src="https://image.lceda.cn/oshwhub/pullImage/6a3d2aad028f4f7b8d718a1fc7da118f.png" alt="image.png"></p>
</li>
<li>
<p>确认无误点击锁定,帧率会<strong>自动识别</strong>,时间片维持默认即可。<img src="https://image.lceda.cn/oshwhub/pullImage/7c215bafb1d543198c1251582af1de69.png" alt="image.png"></p>
</li>
<li>
<p>若不确定点亮的段码对应位置,可调整此<strong>滑块</strong>添加<strong>首帧叠底</strong>(视频拍稳)<img src="https://image.lceda.cn/oshwhub/pullImage/1e4a41c0e864466d98b1a1d94bfd9048.png" alt="image.png"></p>
</li>
<li>
<p>在右侧的界面<strong>选择已点亮</strong>的<strong>对应段码</strong>,随后下一步,可通过<strong>右键</strong>或<strong>空格</strong>。<img src="https://image.lceda.cn/oshwhub/pullImage/b94104127b9545ea936b0e819da20620.png" alt="image.png"></p>
</li>
<li>
<p><strong>已被选择</strong>过的段码将被<strong>特殊标记</strong>,依次选择、绑定、下一步直到结束。<img src="https://image.lceda.cn/oshwhub/pullImage/5e29cf392b0a4ef9aad9de5c274562d3.png" alt="image.png"></p>
</li>
<li>
<p>若<strong>同时多段点亮</strong>要<strong>多选</strong>;<strong>什么都没亮</strong>就直接<strong>下一步</strong>。<img src="https://image.lceda.cn/oshwhub/pullImage/0420856fccf04c1c957073877c4da989.png" alt="image.png"></p>
</li>
<li>
<p>当你<strong>完成绑定时</strong>,屏幕应该是<strong>全灭</strong>的,<strong>反而</strong>如果是<strong>全亮</strong>的,大概率你没有<strong>对齐起始帧</strong>。如果没问题就点击保存。<img src="https://image.lceda.cn/oshwhub/pullImage/f1d92b5ea680405bbf1012514405890d.png" alt="image.png"></p>
</li>
<li>
<p>打开第二个脚本,将生成的JSON导入<img src="https://image.lceda.cn/oshwhub/pullImage/2d9042bbbd724f07953af58d17a6a3a3.png" alt="image.png"></p>
</li>
<li>
<p>选择自己屏幕的规格 <img src="https://image.lceda.cn/oshwhub/pullImage/248428236fe74e46ba189d115ed434af.png" alt="image.png"></p>
</li>
<li>
<p>前文提到过,592F的LCD驱动没有<strong>升压</strong>,当<strong>电池电压下降</strong>后屏幕会<strong>变暗</strong>,我们可以切<strong>电压</strong>或<strong>Bias</strong>起到升压的效果。<strong>但如果你是 3V3 1/2的屏就无解了</strong>,当电压跌落到 <strong>2.7V 以下</strong>就很难看清。<img src="https://image.lceda.cn/oshwhub/pullImage/1004440ff1f4456495d53c675c638ef8.png" alt="image.png"></p>
</li>
<li>
<p>你可以选择导出.C与.H,然后对原工程文件<strong>进行替换</strong><img src="https://image.lceda.cn/oshwhub/pullImage/f2c009854a9f48e2810b04f5cb13ab83.png" alt="image.png"></p>
</li>
<li>
<p>若需要修改功能,如F/C,或状态灯用法,这里是驱动接口<img src="https://image.lceda.cn/oshwhub/pullImage/22af7713f7d449749abc47abbbbb3eba.png" alt="image.png">
详细可以去看.H,我不是故意弄这么糊,只是我不知道为什么图片稍微大一点就会:<img src="https://image.lceda.cn/oshwhub/pullImage/6351f83e76b4473c81d7187b31fab135.png" alt="image.png"></p>
</li>
</ol>
<p>最后,如果你的屏幕是16Pin以下,比如我的1号屏幕就是14Pin,你大概率会遇到这种情况:</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/c673f730be0241749031c26d33e90017.png" alt="image.png"></p>
<p>左侧无法显示0、4、7,右侧无法显示7。
但是别担心,一旦脚本检测到某字符无法正常显示,会自动用相邻的进行替换,如:</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/425d76cec6fc4370902122ac696d0079.png" alt="image.png"></p>
<h3>5.2、主频修改</h3>
<p>若你需要修改主频适应自身工况,按照以下步骤。</p>
<ol>
<li>修改broadcaster_main.c<img src="https://image.lceda.cn/oshwhub/pullImage/f0ccc334089842cc8fe8f78480bcee28.png" alt="image.png"></li>
<li>修改CH59x_common.h<img src="https://image.lceda.cn/oshwhub/pullImage/be9b44744e3c4dd3ba108b24ff47a967.png" alt="image.png"></li>
</ol>
<h3><strong>5.3、CONFIG.h</strong></h3>
<p>在这里你可以修改多项配置,可能会用到的有:</p>
<pre><code class="language-c">【DCDC】
DCDC_ENABLE - 是否使能DCDC
【TEMPERATION】
TEM_SAMPLE - 是否打开根据温度变化校准的功能,单次校准耗时小于10ms
【RTC】
CLK_OSC32K - RTC时钟选择( 0 外部,默认1:内部,2:内部 )
【DATA】
BLE_TX_POWER - 发射功率,默认:LL_TX_POWEER_0_DBM (0dBm) </code></pre>
<p>其中值得一提的是,TEM_SAMPLE 会调用 MCU 内部的温感通过 ADC 测量温度,当变化超过7°时会触发一次校准。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/5416a2a9c5464e57b06cce3430040fe5.png" alt="image.png">
但其误差大得离谱,最关键的是还费电,而且我们不是有现成的高精度温度计吗?所以我直接将其校准逻辑集成进了测量阶段。
<img src="https://image.lceda.cn/oshwhub/pullImage/fd4f98d3caaf46b78714c8c65c437ad8.png" alt="image.png">
毕竟我们无时无刻都在测温度,当偏移超过7度顺手做一次校准。</p>
<h3><strong>5.4、drv_i2c_soft.c</strong></h3>
<p>在最初版本,是拥有外部IIC上拉电阻的,但发现用内部上拉已经足够,现在的版本已经移除了。</p>
<ul>
<li>
<p>如果是<strong>原厂的SHT40</strong>,甚至<strong>超过400K</strong>还可以通讯,<strong>上升沿</strong>甚至达不到3V就下落了,当然<strong>保守起见</strong>还是<strong>降到了300K</strong>:
<img src="https://image.lceda.cn/oshwhub/pullImage/9f52478b030c4e80a4cf1ac56d35ed42.png" alt="image.png"></p>
</li>
<li>
<p>可惜在<strong>副厂的SHT40</strong>上却<strong>完全无法工作</strong>,我只能改成<strong>更标准</strong>一些:
<img src="https://image.lceda.cn/oshwhub/pullImage/657788e2694a4728abbf8f7fee5eac14.png" alt="image.png"></p>
</li>
</ul>
<h3><strong>5.5、drv_sht40.c</strong></h3>
<p>默认使用最高精度模式,在测量时MCU是休眠的,有需求可修改这一行调整。
<img src="https://image.lceda.cn/oshwhub/pullImage/ab721022871143c9adf20b7f9d63b6a2.png" alt="image.png"></p>
<ul>
<li>
<p>使用原厂SHT40测量时耗电大约在335uA:
<img src="https://image.lceda.cn/oshwhub/pullImage/814d1c40646b409796c1600a3d5c6c9e.png" alt="image.png"></p>
</li>
<li>
<p>我使用的副厂其测量电流约为465.43uA:
<img src="https://image.lceda.cn/oshwhub/pullImage/2ca9635f1ddf4ab981ba92ba96716000.png" alt="image.png"></p>
</li>
<li>
<p>别忘了同时修改等待时间:
<img src="https://image.lceda.cn/oshwhub/pullImage/015ab420ada9479187a696f15819ef8e.png" alt="image.png"></p>
</li>
</ul>
<p><strong>需要注意的是,此固件借鉴了如今主流模式,当变化幅度大于阈值会上报,若改为低精度模式有可能由于测量抖动,导致频繁触发上报,造成大量电能消耗。</strong></p>
<h3><strong>5.6、broadcaster_main.c</strong></h3>
<ul>
<li>
<p>这个文件中除了修改主频,还可以修改晶振补偿电容:<img src="https://image.lceda.cn/oshwhub/pullImage/99c5049f8d7f4265924da28e6fe0a23a.png" alt="image.png"></p>
</li>
<li>
<p>还有一个规则,这两段代码互斥但必须保留一个(规则怪谈)<img src="https://image.lceda.cn/oshwhub/pullImage/71ee93b469784be38126921c921c7806.png" alt="image.png"></p>
</li>
</ul>
<p>我也是测试了很久才找到问题:</p>
<ol>
<li>若同时启用会增加约20uA电流(波动较大)。</li>
<li>若全不用会增加约400uA电流(波动巨大)。</li>
</ol>
<p>只能说调低功耗设备还是有点子心累的....</p>
<hr>
<h3><strong>5.7、broadcaster.c</strong></h3>
<h4><strong>5.7.1 广播方式</strong></h4>
<p>开源的蓝牙温湿度计,多数都选择了广播是广播,测量是测量,即无时无刻都在大间隔进行广播发送。我认为这样会有两个问题:</p>
<ol>
<li>
<p>在我测试一次广播包在隔着一个屋子的情况下被接收到的概率小于30%。由于HA记录都是以网关接收时间到为准,如果配置成了比如10分钟甚至20分钟测量一次温度,那么记录就是不实时的。</p>
</li>
<li>
<p>耗电,即使你的温度完全没有变化,依然间隔几秒就要进行一次广播。 你可以加大广播间隔缓解这个问题,但这样做又会放大第一条问题。</p>
</li>
</ol>
<p><strong>所以我直接参考了目前同类产品:</strong></p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/e71c4557e5f241fbb5a47ad61846b1a0.png" alt="image.png"></p>
<p>以下是默认配置,如果不符合使用环境可自行修改(我真放不上图片,我怀疑有OCR识别敏感词):</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/4b4e83968ef14fdcb75d4693dcfcaa3b.png" alt="image.png"></p>
<h4><strong>5.7.2 性能优化</strong></h4>
<p>此设备工作在 <strong>16M</strong> 时<strong>对电池更友好</strong>,但在如此低频下就要<strong>尽量避免繁重任务</strong>了。</p>
<ul>
<li>最有效的肯定是对 float 开刀,我们没有硬件浮点,且不需要太高精度,我们直接将RAW x100 用INT来存:
<img src="https://image.lceda.cn/oshwhub/pullImage/630e41f43cfe478ab8b8796ba7726671.png" alt="image.png"></li>
</ul>
<p>这项改动让 “测量不发事件” 电耗直接下降了 13.5%,非常管用。</p>
<h4><strong>5.7.3 显示自定义</strong></h4>
<p>屏幕驱动前文已经提到了,屏幕上还有一些元素可以利用,左下角的三个状态灯被我用来指示电量:</p>
<pre><code>disp.temperature_x100 = res.temp_x100; // 温度直接传入x100 格式
disp.humidity_x100 = res.humi_x100; // 湿度同样直接传入x100 格式
disp.is_fahrenheit = 0; // 0代表摄氏度模式,1为华氏度模式
DRV_LCD_Adapt_Voltage (cached_vbat_mv); // 传入电池电压,实现屏幕档位自适应
if (bat_pct < 40) { // 用原本左下角的三个舒适灯指示电量
disp.dry_on = 0;
disp.com_on = 0;
disp.wet_on = 1;}
else if (bat_pct > 70) {...}
else {...}
disp.percent_on = 1; // 百分号
disp.base_on = 1; // 基底</code></pre>
<p>你可以利用数字之外的元素做一些特殊的指示,如距离上次广播时间,或是其他的一些定制用法。</p>
<hr>
<h2><strong>6、BOM清单</strong></h2>
<p>因为这次元件不多,所以我特意搜了一下实时价格,除了供体别的都是原价:
<img src="https://image.lceda.cn/oshwhub/pullImage/a6dd81d9f83b4cc9aab9f1669b55905c.png" alt="image.png">
没想到100nF竟然干到1毛多一颗,这样的话DCDC差价只有0.12了,在计算器中我按照1.2计算的,这样的话也许DCDC性价比会反杀LDO。</p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/cf1ee8b266e146c4a366f3ff9d83d0ef.png" alt="image.png">
的确,16M DCDC的方案直接干到了2055天/元,看来新板子没白画,DCDC 启动!</p>
<p>计算器中的所有折价仅包含DCDC、储能电容,不包含整体,请额外计算。
(好吧,我算了一下,约为378天/元,按照8元成本、10年寿命计算。至于我花了多少最好别问)</p>
<h3><strong>6.1、尾声</strong></h3>
<p>至此技术上也就没什么了,这东西说白了也就是段码屏有点烦,还有低功耗也是玄学,但这两点感觉已经用了超过80%篇幅来讲了。</p>
<p>还有问题直接评论区见,感谢各位。</p>
<h2><strong>7、大赛LOGO验证</strong></h2>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/1d199d454e394d44bc4806cb2031ab71.png" alt="image.png"></p>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/250d4b5ea5204e1da5562e65e9ca866f.png" alt="image.png"></p>
<h2><strong>8、演示您的项目并录制成视频上传</strong></h2>
<p><img src="https://image.lceda.cn/oshwhub/pullImage/771029a29c064a8594e033d7a8d0a6be.png" alt="image.png"></p>
评论(3)