170浏览
查看: 170|回复: 1

[K10项目分享] 基于micropython的K10室内气象站

[复制链接]
本帖最后由 PY学习笔记 于 2024-12-8 17:57 编辑

在上一篇,结合LVGL实现一个三轴传感器小应用,这一篇接着实现K10室内气象站。
1.行空板K10介绍
行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。
主要特点
集成摄像头&内置算法,可进行离线图像检测
集成麦克风&内置算法,可进行离线语音识别
集成扬声器&内置算法,可进行离线语音合成
2.8寸彩色屏幕,数据展示更清晰
集成度高,利于教学
接口丰富,兼容软件多,扩展性好
2.LVGL介绍
LVGL(轻量级和多功能图形库)是一个免费的开源图形库,提供创建具有易于使用的图形元素、美观的视觉效果和低内存占用的嵌入式 GUI 所需的一切。
3.测试代码

依旧使用LVGL参考代码如下:

  1. from unihiker_k10 import screen, temp_humi,light
  2. import time, gc
  3. import lvgl as lv
  4. import fs_driver, math
  5. fs_drv = lv.fs_drv_t()
  6. fs_driver.fs_register(fs_drv, 'S')
  7. screen.init(dir=2)
  8. scrn = lv.screen_active()
  9. scrn.set_style_bg_color(lv.color_hex(0x000000), 0)
  10. # temp
  11. class MyWidget():
  12.     def __init__(self, scr):
  13.         # 1. 创建进度条对象
  14.         self.bar = lv.bar(scr)
  15.         
  16.         # 创建样式对象
  17.         style_indic = lv.style_t()
  18.         style_indic.init()
  19.         style_indic.set_bg_opa(lv.OPA.COVER)
  20.         style_indic.set_bg_color(lv.palette_main(lv.PALETTE.RED))
  21.         style_indic.set_bg_grad_color(lv.palette_main(lv.PALETTE.BLUE))
  22.         style_indic.set_bg_grad_dir(lv.GRAD_DIR.VER)
  23.         # 给进度条设置样式
  24.         self.bar.add_style(style_indic, lv.PART.INDICATOR)
  25.         self.bar.set_size(20, 200)
  26.         self.bar.set_range(0, 100)  # 修正范围,0-100 是进度条的有效范围
  27.         self.bar.align(lv.ALIGN.CENTER, -60, 0)
  28.         
  29.         # 创建标签对象
  30.         self.label1 = lv.label(scr)
  31.         self.label1.align_to(self.bar, lv.ALIGN.OUT_BOTTOM_MID, 0, 5)
  32.         
  33.         # 启动动画
  34.         a = lv.anim_t()
  35.         a.init()
  36.         a.set_time(500)
  37.         a.set_values(0, int(temp_humi.read_temp()))  # 设置初始值
  38.         a.set_custom_exec_cb(self.set_temp)  # 设置动画执行回调
  39.         lv.anim_t.start(a)
  40.         
  41.         # 创建定时器,定时更新温度
  42.         lv.timer_create(self.timer_cb, 1000, None)
  43.     def set_temp(self, a, val):
  44.         self.bar.set_value(val, lv.ANIM.ON)
  45.     def timer_cb(self, timer):
  46.         temp = int(temp_humi.read_temp())
  47.         self.label1.set_text("temp:\n"+str(temp_humi.read_temp()))  # 更新标签文本
  48.         self.bar.set_value(temp, lv.ANIM.OFF)  # 立即更新进度条值,不使用动画
  49. # humi
  50. class MyWidget1():
  51.     def __init__(self, scr):
  52.         # 1. 创建进度条对象
  53.         self.bar = lv.bar(scr)
  54.         
  55.         # 创建样式对象
  56.         style_indic = lv.style_t()
  57.         style_indic.init()
  58.         style_indic.set_bg_opa(lv.OPA.COVER)
  59.         style_indic.set_bg_color(lv.palette_main(lv.PALETTE.RED))
  60.         style_indic.set_bg_grad_color(lv.palette_main(lv.PALETTE.BLUE))
  61.         style_indic.set_bg_grad_dir(lv.GRAD_DIR.VER)
  62.         # 给进度条设置样式
  63.         self.bar.add_style(style_indic, lv.PART.INDICATOR)
  64.         self.bar.set_size(20, 200)
  65.         self.bar.set_range(0, 100)  # 修正范围,0-100 是进度条的有效范围
  66.         self.bar.align(lv.ALIGN.CENTER, 0, 0)
  67.         
  68.         # 创建标签对象
  69.         self.label1 = lv.label(scr)
  70.         self.label1.align_to(self.bar, lv.ALIGN.OUT_BOTTOM_MID, 0, 5)
  71.         
  72.         # 启动动画
  73.         a = lv.anim_t()
  74.         a.init()
  75.         a.set_time(500)
  76.         a.set_values(0, int(temp_humi.read_humi()))  # 设置初始值
  77.         a.set_custom_exec_cb(self.set_temp)  # 设置动画执行回调
  78.         lv.anim_t.start(a)
  79.         
  80.         # 创建定时器,定时更新温度
  81.         lv.timer_create(self.timer_cb, 1000, None)
  82.     def set_temp(self, a, val):
  83.         self.bar.set_value(val, lv.ANIM.ON)
  84.     def timer_cb(self, timer):
  85.         temp = int(temp_humi.read_humi())
  86.         self.label1.set_text("humi:\n"+str(temp_humi.read_humi()))  # 更新标签文本
  87.         self.bar.set_value(temp, lv.ANIM.OFF)  # 立即更新进度条值,不使用动画
  88. #light
  89. class MyWidget2():
  90.     def __init__(self, scr):
  91.         # 1. 创建进度条对象
  92.         self.bar = lv.bar(scr)
  93.         
  94.         # 创建样式对象
  95.         style_indic = lv.style_t()
  96.         style_indic.init()
  97.         style_indic.set_bg_opa(lv.OPA.COVER)
  98.         style_indic.set_bg_color(lv.palette_main(lv.PALETTE.RED))
  99.         style_indic.set_bg_grad_color(lv.palette_main(lv.PALETTE.BLUE))
  100.         style_indic.set_bg_grad_dir(lv.GRAD_DIR.VER)
  101.         # 给进度条设置样式
  102.         self.bar.add_style(style_indic, lv.PART.INDICATOR)
  103.         self.bar.set_size(20, 200)
  104.         self.bar.set_range(0, 120)  # 修正范围,0-100 是进度条的有效范围
  105.         self.bar.align(lv.ALIGN.CENTER, 60, 0)
  106.         
  107.         # 创建标签对象
  108.         self.label1 = lv.label(scr)
  109.         self.label1.align_to(self.bar, lv.ALIGN.OUT_BOTTOM_MID, 0, 5)
  110.         
  111.         # 启动动画
  112.         a = lv.anim_t()
  113.         a.init()
  114.         a.set_time(500)
  115.         a.set_values(0, int(light.read()/1000))  # 设置初始值
  116.         a.set_custom_exec_cb(self.set_temp)  # 设置动画执行回调
  117.         lv.anim_t.start(a)
  118.         
  119.         # 创建定时器,定时更新温度
  120.         lv.timer_create(self.timer_cb, 1000, None)
  121.     def set_temp(self, a, val):
  122.         self.bar.set_value(val, lv.ANIM.ON)
  123.     def timer_cb(self, timer):
  124.         temp = int(light.read()/1000)
  125.         self.label1.set_text("light:\n"+str(light.read())+"lx")  # 更新标签文本
  126.         self.bar.set_value(temp, lv.ANIM.OFF)  # 立即更新进度条值,不使用动画
  127. MyWidget(scrn)
  128. MyWidget1(scrn)
  129. MyWidget2(scrn)
复制代码
一样的如果感兴趣在后台私信我,我来讲解。这里不过多讲解了。
4.效果

先不拍了,大家自行测试去感受LVGL的魅力

easy猿  初级技师

发表于 2024-12-8 21:06:25

666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail