ESP32(Micro Python) LVGL 传感器数值显示

本程序用于显示SR04超声波传感器和BMP280气压温度传感器的读数。由于高度数值类型不符合要求,BMP280改为显示气压和温度值。气压值分两部分显示,分别为千帕值-100(避免超出表盘显示范围)和千帕值的两位小数。由于标签不能显示动态数值,不使用数字显示。

f6fd2a4b9b0f480ba51eb418caed58d3.jpeg

 目前本人只了解到仪表盘组件可以进行动态显示,但不能调节显示范围。如果有了解更多可进行动态显示的组件的读者请在评论区中告知。

代码如下

import lvgl as lv

import time

from espidf import VSPI_HOST

from ili9XXX import ili9341

from xpt2046 import xpt2046

import fs_driver

from machine import Pin

import random

from machine import SoftI2C

import bmp280

from hcsr04 import HCSR04

# ------------------------------ 屏幕初始化操作 --start------------------------

# 屏幕宽高

WIDTH = 240

HEIGHT = 320

# 创建显示屏对象

disp = ili9341(miso=19, mosi=23, clk=18, cs=5, dc=26, rst=27, power=14, backlight=-1, backlight_on=0, power_on=0, rot=0x80,

        spihost=VSPI_HOST, mhz=60, factor=16, hybrid=True, width=WIDTH, height=HEIGHT,

        invert=False, double_buffer=True, half_duplex=False, initialize=True)

# 创建触摸屏对象

touch = xpt2046(cs=25, spihost=VSPI_HOST, mosi=-1, miso=-1, clk=-1, cal_y0 = 423, cal_y1=3948)

# ------------------------------ 屏幕初始化操作 --stop------------------------

#定义HCSR04控制对象

hcsr04=HCSR04(trigger_pin=15, echo_pin=2)

#初始化BMP280,定义第二个I2C接口i2c2用于连接BMP280

i2c2 = SoftI2C(sda=Pin(22), scl=Pin(21))

BMP = bmp280.BMP280(i2c2)

# 1. 创建显示screen对象。将需要显示的组件添加到这个screen才能显示

scr = lv.obj() # scr====> screen 屏幕

fs_drv = lv.fs_drv_t()

fs_driver.fs_register(fs_drv, 'S')

scr = lv.scr_act()

scr.clean()

# 2. 封装要显示的组件

class Widget1():

    def __init__(self, scr,s,x,y,r1,r2,v1,v2): #尺寸,x轴偏移量,y轴偏移量,动画起始值,动画结束值,开始处蓝色区域最大值,结尾处红色区域最小值

        # 1. 创建仪表盘对象

        self.meter = lv.meter(scr)

        self.meter.align(lv.ALIGN.CENTER,x,y) # 居中(第1个0表示x的偏移量,第2个0表示相对于y的偏移量)

        self.meter.set_size(s, s) # width: s height: s

        # 2. 创建刻度线对象

        scale = self.meter.add_scale()

        # -------- 子刻度线 --------

        # 51:短线的个数

        # 1:短线宽度(单位像素)

        # 7:短线长度

        # 最后1个参数:颜色

        self.meter.set_scale_ticks(scale, 21, 1, 7, lv.palette_main(lv.PALETTE.GREY))

        # -------- 主刻度线 --------

        # 10: 多少个子刻度线显示1个主刻度线

        # 2: 宽度

        # 10: 长度

        # 下一个参数:颜色

        # 10: 文字与线的距离 10像素

        self.meter.set_scale_major_ticks(scale, 4, 2, 10, lv.color_black(), 5)

        # 3. 添加警示刻度线

        # 在起点添加蓝色弧

        blue_arc = self.meter.add_arc(scale, 1, lv.palette_main(lv.PALETTE.BLUE), 0)

        self.meter.set_indicator_start_value(blue_arc, r1)

        self.meter.set_indicator_end_value(blue_arc, v1)

        # 在刻度开始处使刻度线为蓝色

        blue_arc_scale = self.meter.add_scale_lines(scale, lv.palette_main(lv.PALETTE.BLUE), lv.palette_main(lv.PALETTE.BLUE), False, 0)

        self.meter.set_indicator_start_value(blue_arc_scale, r1)

        self.meter.set_indicator_end_value(blue_arc_scale, v1)

        # 在末端添加红色弧

        red_arc = self.meter.add_arc(scale, 1, lv.palette_main(lv.PALETTE.RED), 0)

        self.meter.set_indicator_start_value(red_arc, v2)

        self.meter.set_indicator_end_value(red_arc, r2)

        # 使刻度线在刻度末端变为红色

        red_arc_scale = self.meter.add_scale_lines(scale, lv.palette_main(lv.PALETTE.RED), lv.palette_main(lv.PALETTE.RED), False, 0)

        self.meter.set_indicator_start_value(red_arc_scale, v2)

        self.meter.set_indicator_end_value(red_arc_scale, r2)

        # 4. 仪表指针

        # 4: 宽度

        # 下一参数:颜色

        # -10:指针与刻度线距离

        self.indic = self.meter.add_needle_line(scale, 2, lv.palette_main(lv.PALETTE.GREY), -5)

        # 5. 创建动画对象

        a = lv.anim_t()

        a.init()

        a.set_var(self.indic)

        temp = self.timer_cb()

        a.set_values(0, temp)

        a.set_time(500)

        # a.set_repeat_delay(100)

        # a.set_playback_time(500)

        # a.set_playback_delay(100)

        # a.set_repeat_count(lv.ANIM_REPEAT_INFINITE)

        a.set_custom_exec_cb(self.set_value)

        lv.anim_t.start(a)

        # 创建一个标签label

        self.label = lv.label(scr)

        self.label.set_text("Distance_cm") # 默认值

        self.label.align_to(self.meter, lv.ALIGN.OUT_BOTTOM_MID, 0, 5) # label的中间与滑块的上外边框中间对齐,然后y向下5像素 x不变

        # 6. 添加定时器

        lv.timer_create(self.timer_cb, 200, None) # 延时

    def set_value(self, anmi_obj, value):

        """动画回调函数"""

        self.meter.set_indicator_value(self.indic, value)

    def timer_cb(self, timer=None):

        """定时器回调函数"""

        ret=round(hcsr04.distance_cm()/1)

        self.meter.set_indicator_value(self.indic, ret)

        return ret

class Widget2():

    def __init__(self, scr,s,x,y,r1,r2,v1,v2): #尺寸,x轴偏移量,y轴偏移量,动画起始值,动画结束值,开始处蓝色区域最大值,结尾处红色区域最小值

        # 1. 创建仪表盘对象

        self.meter = lv.meter(scr)

        self.meter.align(lv.ALIGN.CENTER,x,y) # 居中(第1个0表示x的偏移量,第2个0表示相对于y的偏移量)

        self.meter.set_size(s, s) # width: s height: s

        # 2. 创建刻度线对象

        scale = self.meter.add_scale()

        # -------- 子刻度线 --------

        # 51:短线的个数

        # 1:短线宽度(单位像素)

        # 7:短线长度

        # 最后1个参数:颜色

        self.meter.set_scale_ticks(scale, 21, 1, 7, lv.palette_main(lv.PALETTE.GREY))

        # -------- 主刻度线 --------

        # 10: 多少个子刻度线显示1个主刻度线

        # 2: 宽度

        # 10: 长度

     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这里提供一份基于Arduino的代码,可以将土壤湿度传感器采集到的数据通过ADC0832芯片转换为数字信号,并通过串口输出显示出来。请参考下面的代码: ```c++ #include <SPI.h> #include <SoftwareSerial.h> #define CS_PIN 10 // ADC0832芯片的CS引脚连接到Arduino的数字引脚10 #define CLK_PIN 13 // ADC0832芯片的CLK引脚连接到Arduino的数字引脚13 #define DI_PIN 11 // ADC0832芯片的DI引脚连接到Arduino的数字引脚11 #define DO_PIN 12 // ADC0832芯片的DO引脚连接到Arduino的数字引脚12 int soilMoisture = 0; // 存储土壤湿度传感器采集到的模拟信号 int digitalValue = 0; // 存储ADC0832转换后的数字信号 float voltage = 0; // 存储ADC0832转换后的电压值 SoftwareSerial mySerial(2, 3); // 定义一个软串口对象,将土壤湿度数据通过串口输出 void setup() { pinMode(CS_PIN, OUTPUT); pinMode(CLK_PIN, OUTPUT); pinMode(DI_PIN, OUTPUT); pinMode(DO_PIN, INPUT); Serial.begin(9600); mySerial.begin(9600); } void loop() { digitalWrite(CS_PIN, LOW); // 使能ADC0832芯片 shiftOut(DI_PIN, CLK_PIN, MSBFIRST, 0b10010000); // 发送通道0的指令 digitalValue = shiftIn(DO_PIN, CLK_PIN, MSBFIRST); // 读取8位数字信号 digitalWrite(CS_PIN, HIGH); // 禁用ADC0832芯片 voltage = digitalValue * 5.0 / 255.0; // 将数字信号转换为电压值 soilMoisture = map(digitalValue, 0, 255, 0, 100); // 将数字信号映射到0-100的范围 Serial.print("ADC Value: "); Serial.print(digitalValue); Serial.print(" , Voltage: "); Serial.print(voltage); Serial.print("V , Soil Moisture: "); Serial.print(soilMoisture); Serial.println("%"); mySerial.print(soilMoisture); // 将土壤湿度输出到软串口 mySerial.println("%"); delay(1000); // 每隔1秒采集一次 } ``` 请注意,上面的代码仅提供了基本的采集和输出功能,并没有进行土壤湿度值的校准和调整。如果需要更精确的测量结果,还需要对传感器进行校准和调试。同时,建议使用更为稳定和精确的ADC芯片,如ADS1115等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路易斯720

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值