我们这次要实现的DIY是一个电子测光笔,那么都有哪些单一功能需要实现呢?我们简单划分一下,光传感器数据的采集、按键功能的采集、屏幕显示。
1、屏幕显示
除了光照强度传感器之外我们还需要通过开发板板载的屏幕进行一个数据的初步显示,本章节我们主要是进行单功能的显示功能,主要就是进行屏幕的一个控制,这里我们需要使用固件中的display功能接下来我们看一下如何实现屏幕的基本控制。
咱们先简单的显示一下这次活动的内容“EEPW&&Digikey Let's do!”,我们想要显示某个东西,首先要开启这部分屏幕并控制显示初始化,然后配置显示内容(包括字体、位置、颜色等内容),接下来我们简单写一下显示程序:
import board import displayio from adafruit_bitmap_font import bitmap_font from adafruit_display_text import label font = bitmap_font.load_font("lib\sanjiruosixingkai_m_16.pcf") color_FireBrick = 0xB22222 # 耐火砖红 # 初始化显示屏参数 display = board.DISPLAY display.brightness = 0.75 # 更改亮度 display.rotation = 0 # 更改方向,0为横屏,90为竖屏 text = label.Label( font=font, # 你需要指定一个字体对象 text="\n EEPW&&DigiKey \n Let's do!", # 显示的文本 x=2, # 文本的起始X坐标 y=2, # 文本的起始Y坐标 color=color_FireBrick, # 文本颜色(白色) ) # str_area = label.Label(cale=1) # str_area.text = "\n EEPW&&DigiKey \nLet's do!" # str_area.x = 2 # str_area.y = 2 # str_area.color = color_FireBrick # 启动屏幕显示 show_group = displayio.Group() show_group.append(text) display.root_group = show_group while True: pass
启动后可以看到效果:
2、光照强度传感器
由于BH1750FVI传感器模块属于外置模块,我们需要将它连接到开发板上,有的人已经注意到了,正面的IIC接口实际上非常的小,这种转接线也不好找,所以我们要在充分了解模块信息的基础上再进行连接和软件测试。
我们看一下模块原理图:
模块中有一个LDO,所以这个模块需要一个5V供电,不过接口通信电平依然是3.3V的,结合着开发板的引脚连接如下图:
实际上上图已经进行了光照强度的展示了,我们了解一下是如何实现的:import time import adafruit_bh1750 i2c = board.I2C() sensor = adafruit_bh1750.BH1750(i2c) while True: print("%.2f Lux" % sensor.lux) time.sleep(1)
如上就是测试的代码,非常的简洁,主要是使用了adafruit_bh1750这个传感器相关的固件文件,启动IIC接口,并且初始化传感器就可以了,后续就自动不断获取了,只要进行相关参数的打印就可以看到了,这个传感器的参数只有lux这一个参数。
3、按键模块
按键模块上一共有两个按键,通过不同的颜色进行区分,依然需要看一下原理图:
每一个按键都是通过了分压进行的,这就保证了5V供电时时候的高电平也是可以有3.3V供电的单片机采集,所以这个模块使用3.3V供电也是可以,而且还有一点,咱们这个开发板还就的使用3.3V供电才行,开发板的VBUS引脚的输出是1.8V,其分压无法判断为高电平。
驱动代码就比较简单了,代码如下:
import time import board import displayio import digitalio from adafruit_bitmap_font import bitmap_font from adafruit_display_text import label import adafruit_bh1750 font = bitmap_font.load_font("lib\sanjiruosixingkai_m_16.pcf") i2c = board.I2C() sensor = adafruit_bh1750.BH1750(i2c) buttonBlue = digitalio.DigitalInOut(board.D6) buttonRed = digitalio.DigitalInOut(board.D9) buttonRed.switch_to_input(pull=digitalio.Pull.UP) buttonBlue.switch_to_input(pull=digitalio.Pull.UP) color_FireBrick = 0xB22222 # 耐火砖红 # 初始化参数 Time_cut = 0 buttonRedTime_cut = 0 buttonRedDown_flag = 0 buttonBlueTime_cut = 0 buttonBlueDown_flag = 0 # 初始化显示屏参数 display = board.DISPLAY display.brightness = 0.75 # 更改亮度 display.rotation = 0 # 更改方向,0为横屏,90为竖屏 text = label.Label( font=font, # 你需要指定一个字体对象 text="\n EEPW&&DigiKey \n Let's do!", # 显示的文本 x=2, # 文本的起始X坐标 y=2, # 文本的起始Y坐标 color=color_FireBrick, # 文本颜色 ) # 启动屏幕显示 # show_group = displayio.Group() # show_group.append(text) # display.root_group = show_group while True: time.sleep(0.01) Time_cut = Time_cut + 1 if Time_cut > 100: print("%.2f Lux" % sensor.lux) Time_cut = 0 if not buttonRed.value: if not buttonRedDown_flag: buttonRedTime_cut = buttonRedTime_cut + 1 if buttonRedTime_cut > 15: print("buttonRed is down") buttonRedDown_flag = 1 if buttonRed.value: buttonRedTime_cut = 0 buttonRedDown_flag = 0 if not buttonBlue.value: if not buttonBlueDown_flag: buttonBlueTime_cut = buttonBlueTime_cut + 1 if buttonBlueTime_cut > 15: print("buttonBlue is down") buttonBlueDown_flag = 1 if buttonBlue.value: buttonBlueTime_cut = 0 buttonBlueDown_flag = 0
融合程序中加入了按键判断,注意一点,在进行按键的配置的时候buttonRed.switch_to_input(pull=digitalio.Pull.UP),这里必须上拉,然后就是对应的引脚和名称要正确。这里我们做了一个简单的防抖设计,每一次按键只会识别一次。
到这里我们除了舵机的控制已经完成了所有必要的功能的简单测试实现,接下来我们会将这些简单的功能加上UI显示,就可以完成我们的电子测光表了。