你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

优雅至极!STM32H5咖啡机,高级GUI与安全功能之双响炮

[复制链接]
STMCU-管管 发布时间:2025-2-12 16:57
感谢粉丝 NATHAN XI 投稿。' d& V5 g/ q+ _. N. [" m' u: T
12.png
STM32H5作为安全型MCU的领军产品,不仅在安全设计上独具特点,同时还具有高性能M33内核!不过在ST相继推出DMA2D和DMA2.5D(ChromART & NeoChrom)后,我曾对于没有其中任何一种科技的H5的实际图形性能持有怀疑态度,但是作为GUI狂魔的我还是借助X-NUCLEO-GFX02Z1显示扩展和公众号赠予的NUCLEO-H563ZI核心板做了一个极其简单的测试并发布为GUI教学。5 Q: G, T1 U' u& H& ~* |/ H+ D
测试显示,STM32H563ZI在TouchGFX软件优化下能流畅驱动analogClock和gauge等关键控件,使得低端GUI能流畅运行,显示关键参数。
9 T6 X  t6 {& a这是否有些似曾相识?是的,STM32G071在运行这种低端GUI上也可以做到效果一致!
) F) m8 J) Z" k1 r6 s/ s
13.png
那么这个时候我和很多朋友就在想,H5的GUI性能有没有上界呢?想到这里,我联系了Riverdi原厂,订购了一块基于NUCLEO 144 的PCAP工业级LCD扩展,希望使用这块高质量扩展屏实现接近于使用DMA2D的图形性能的GUI效果。
5 U, ?0 J1 C4 l5 ~
14.png
先说测试结论:惊喜的是,STM32H563的裸核图形效果与DMA2D加持下的L4R9差别不大!但是依然无法达到带有NeoChrom的STM32H7S78的标准。
  X( ?3 J, _1 M5 z4 [! p当这块480x320的3.5’’屏幕还在从波兰来到上海的路上时,我就已经开始着手准备测试用的GUI了。作为一个咖啡爱好者,我常困窘于咖啡烘焙的设定问题:使用50%左右的火力脱水,160℃后进入梅纳期后一爆,再根据想要的烘焙深度调节发展期以及出豆时间。有时候要么太酸,要么太苦,烘久了又糊了,咖啡豆放久之后还要根据经验重新调整,直到最后成品满意为止(强迫症晚期症状)。基于以往的嵌入式GUI开发基础,我计划设计一套完整的智能咖啡机GUI,实现一些关于咖啡制作的用户体验优化。* W' k  P$ Y. ^9 h5 R, u1 F
那么我的设计目标也就很明确:清晰用户体验主线、控件排布合理、视觉结构清晰即可。. ~/ d; R+ w! D$ X) E0 K! Y
为了明确功能分区,我设计了三个功能:咖啡烘焙、咖啡研磨以及咖啡萃取与调制(这看起来是一个非常庞大的多功能集成式咖啡机!)
! K% i# A+ {$ z4 K* h4 J0 s
15.png
16.png
这里我们使用container构建菜单的listElement,通过后期代码变换实现旋转菜单功能。& c, _+ S3 I% V% `
17.png
18.png
此时菜单还不成样子,需要进入view进行运动算法编写。这一个开发section我已经在B站动态里进行了详细注释,有时间可以看一眼。我这里也做一个解释说明。这段旋转菜单的源代码可以在TouchGFX文档中找到相关示例,但是官方做的还是太简单了,没有做出高级效果。于是我在其基础上加入了上下渐变的Alpha混合以及选中项目突出标记功能,使整个用户体验更高级更自然。# n& Z4 r! S& U9 w/ ?% g

  1. + k- z9 @1 S& ]
  2. void listElement::offset(int16_t x)    D. A9 {* X' t9 T1 `, J2 ]7 J
  3. {  
    0 F( h9 r/ {1 T  d
  4.     label.setX(x);  # l" ?1 g" O( S7 m
  5. }  . E4 I8 U1 A* U% E
  6. void listElement::alphaAdjust(int16_t a)  // 自定义函数,调整alpha3 w; R$ H- U/ T+ C: B2 s  Z
  7. {  2 h: ?2 N; [: v% [7 K+ W
  8.     label.setAlpha(a);  
    : @+ C( W) L' R$ D1 E5 B
  9. }  
    / N% t- v3 a# A1 _1 P* [
  10. void listElement::setY(int16_t y)  
      y% b1 v, t! v$ a
  11. {  & X/ g) Y6 J$ L
  12.     listElementBase::setY(y);  
    + X# A$ p( `/ ?  c% ?( Z
  13.     const int circleRadius = 220;  // 旋转半径
    ( @2 E/ p; Z* i
  14.     y = y + getHeight() / 2 - 320 /2;  // 居中; |5 F* Z5 i8 F% l+ z* a3 K0 {: Z
  15.     int16_t a = 255 - abs( ((getY() + 40) * 255/320) - 127);  // 自动根据y调整alpha
    ) D" Q$ J3 J4 z  Q: ]9 }
  16.     float x_f = circleRadius - sqrtf((float)((circleRadius * circleRadius) - (y * y)));  // 自动根据y调整x坐标
    8 S. X. f/ T0 E* N
  17.     int16_t x = (int16_t)(x_f + 0.5f);  
    % X4 U' Q' S, l2 d  Q
  18.     offset(x);  
    9 C# N- D& i/ S, ^
  19.     alphaAdjust(a);  ' w' Y$ V! g) O( I) Y
  20. }  
    0 {4 N/ }3 w) J$ D- u: }
  21. void listElement::setListElements(int item)  // 链表,切换label内容
    $ n* O* C( F) m
  22. {  8 ]! H5 d1 M& ~8 `" P1 v
  23.     switch (item)  8 m5 P: d7 |4 V" T0 o: W) F
  24.     {  - c0 l0 `+ \  q' G" R) f
  25.     case 0:  + w7 l$ {: j8 f9 O) `1 y. |
  26.         label.setTypedText(TypedText(T_RESOURCEID1));  ; T# x4 h" x, S1 z1 j& U
  27.         break;  
    2 m* J( j; o8 l
  28.     case 1:  
    + K. e6 q! T0 |' }
  29.         label.setTypedText(TypedText(T_RESOURCEID2));  : ]7 ^) h% K: R: U7 J. @
  30.         break;  # O+ G( q: I5 O  k
  31.     case 2:  
    - ]( S* ~0 k2 x9 d
  32.         label.setTypedText(TypedText(T_RESOURCEID3));  " p# l+ ]/ ]( L  O4 _
  33.         break;  
    4 Y) r1 ?' }8 K' {' j. b
  34.     case 3:  3 E8 I( p! P. }; |
  35.         label.setTypedText(TypedText(T_RESOURCEID4));  9 b" o; v% h- D$ ^$ {: P' w$ _# Z
  36.         break;  
    2 c# A1 p& {$ S0 C9 N
  37.     case 4:  
    ! N9 \3 p" Y4 Q. h% q& C6 P
  38.         label.setTypedText(TypedText(T_RESOURCEID5));  
    ! ?+ l  J6 K3 y! d  N
  39.         break;  " D- M6 K0 {' b
  40.     case 5:  
    # n" B' H! w1 K' L+ D5 i' a7 Y
  41.         label.setTypedText(TypedText(T_RESOURCEID6));  9 K, [/ p  t" b5 @7 I
  42.         break;  ' h3 N  m7 x* y2 v) U' j# X* u" s, P
  43.     case 6:  ! q; S+ k" ?$ G7 c3 Q
  44.         label.setTypedText(TypedText(T_RESOURCEID7));  , e+ a6 i$ ]4 O. ?, c' ?
  45.         break;  2 N4 D3 C0 U# U% H; Q
  46.     }  
    5 x# j% K# P( O2 t6 Y4 z8 n9 F. f3 g
  47. }
复制代码
19.png
现在我们run一下simulator,可以看到刚才修改的效果。非常的丝滑,左边的产品介绍栏可以随着右边选中内容变换。
8 }3 C% i5 N7 e0 k
9 [3 {& e! E, `
  D7 F, I+ e& m2 `$ K
屏幕到了,刚好我能新开一个听直播送的NUCLEO-H563ZI了。
; O! r) [/ E. s. l# y
20.png
先generate code,再run target烧录,成功!+ D/ R5 z  t6 L& b) _
21.png
这只是介绍了整个项目的一小部分,完整版见下方视频。
% R& S8 i  F' {. P2 R: j$ N9 Y' w由此可以看到,STM32H563上的GUI虽然依托裸核资源,但是仍能达到较高级GUI的效果(没法做2.5D但是也已经非常够用了)。在高性能内核和FMC的加持下STM32H563可以完成高性能的GUI增强用户体验、简化用户操作,使得5秒内完成咖啡定制变得可能。两路电机控制去控制磨豆电机以及颗粒度调节,若干路DAC和ADC用于控制水泵和锅炉控制,H5系列标志性的I3C也可以用于高速的炉温检测,增强自动反馈调节操作的实时性。I2S结合音频codec可用于发出提示音和警报。主打一个外设全部物尽其用!这也就说明,STM32H563完全有能力胜任一个完整的咖啡机方案。结合H5系列出色的安全性能和以太网,用户可以搭建一个完整的端到云架构,同时伴随有高级的数据安全功能,使得智能咖啡机这类上云小设备也能够得到充分的信息安全保障。STM32H5系列的含金量还在上升!
  V0 M% w7 S! M' T, @8 B1 {" F
22.png
软件开发生态上,我们无需担心!ST为开发者们构建了全面的STM32Cube生态:TouchGFX助力高性能嵌入式GUI开发、MCSDK提供先进的电机控制测试支持,同时使得开发者们能快速上手电机开发,快速构建不同的电机应用!NanoEdge AI平台提供了嵌入式人工智能支持,使得咖啡机能够完成边缘预测性维护工作,及时向用户反馈设备状态。结合STM32Trust,用户能构建基于STM32的安全应用,更好保护设备不受攻击、保护厂商的应用数据不被盗用……这些完善而先进的软件生态大大节约了开发成本和时间,缩短了产品的time to market。
5 A3 F3 U* j" Z/ m& P/ Y1 `而这样构建起来的智能咖啡机必定能削减产品的最终成本,同时使得更多咖啡爱好者能获得低成本且智能化的咖啡制作体验并吸引更多的人入门咖啡制作。相信有STM32的支持,相关设备的未来会更加光明!
6 L) g- C" f. Z' n4 T( _让我们共同期待智能化咖啡制作时代以及小设备信息安全化时代的到来吧!$ S8 F" q/ R$ u' D2 A0 V
8 ]& t/ ^0 \9 j4 J: \/ g  c
) U1 _" M3 Q) x+ r, o% Q% j
如需要assets及相关参考内容,请联系STM32客服(微信号STM32_01)。* B9 |9 Y  G; e

' O- H$ A; F% e

* ^* @* t, K7 a/ b7 e- s6 y' D

; \7 ?! F/ J2 X: Z8 {" Z: [$ X2 C* }2 _" }$ q" E2 k8 [  t, ^

$ A. Q2 c2 x/ }
- u  w, @( R6 O1 ~6 N. \2 N. i* `" q
& J- e& H! o1 z  k8 H
) @1 Y  Z, j/ c  b. t

* ?( D/ n. S% o2 a: W8 a( o' h2 L' D2 X( y# P8 O9 |1 u3 ]  O3 }  O; A
赞 收藏 评论1 发布时间:2025-2-12 16:57

举报

1个回答
电子烂人 回答时间:2025-2-13 09:24:22

牛啊,这个咖啡机的UI帅的很,要是能加上功能就太棒了

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版