这次活动,除了Seeed Studio XIAO ESP32C3和扩展板,传感器还买了ATH20温湿度传感器和模拟光线传感器。
这篇帖子,分享的就是这个光纤传感器的具体使用。
一、硬件连接
在地板上,有专门的模拟传感器的接口A0:
因此,使用模拟光线传感器自带的数据线连接即可:
二、读取光线传感器的测量值
这次的光线传感器,是模拟光线传感器,不能直接读取到测量的数值,实际获取的,是一个模拟值量值,需要经过一定的转换,才能转变为实际的电压值。
参考 Seeed Studio 官方的资料,这篇帖子对应的代码,使用如下的方式进行处理:
# 模拟量
sensor_dev = ADC(Pin(2))
sensor_dev.atten(ADC.ATTN_11DB) # 这里配置测量量程为0~3.6V
while True:
sensor_value = 0
for i in range(0,16):
sensor_value = sensor_value + sensor_dev.read()
sensor_value = sensor_value / 16
Vbattf = 2 * sensor_value / 1000.0
在上述代码中,连续使用sensor_dev.read()取16次值,然后去平均值,得到传感器的值,再转换为电压值。
得到了上述数据,就可以进一步利用,例如检测光线强度,是否需要开灯。
threshold = 10
resistance = (float)(1023 - sensor_value) * 10 / sensor_value
if resistance > threshold:
status = "光线弱,需要开灯"
else:
status = "光线足够"
上面这个计算公示是Seeed Studio 官方提供的,实际情况如何,大家可以测试验证。
三、读取数值并显示到屏幕上
前面已经读取到数值了,下一步,就是显示到屏幕上了。结合 【得捷电子Follow me第3期】任务2:驱动扩展板上的OLED屏幕(字符、中文、仪表、诗词) ,先生成中文字体文件:
python micropython-font-to-py/font_to_py.py -x -f -c "光线弱,需要开灯光线足够" OPPOSans-M.ttf 16 test_font_cn_16_light.py
然后将 test_font_cn_16_light.py 上传到对应目录:
再编写完整的代码:
mport utime
from machine import Pin, ADC, PWM
from color_setup import ssd
from color_setup import i2c
from gui.core.nanogui import refresh
from gui.core.writer import CWriter
from gui.widgets.textbox import Textbox
from gui.widgets.label import Label
from gui.core.colors import *
# 字体调用
import gui.fonts.arial10 as arial10
import gui.fonts.test_font_cn_16_light as font_cn_light
# Buzzer settings
buzzer_pin = Pin(5, Pin.OUT)
buzzer = PWM(buzzer_pin)
buzzer.freq(1047)
buzzer.duty(0)
# 清屏
refresh(ssd, True)
# 显示输出
CWriter.set_textpos(ssd, 0, 0)
wri = CWriter(ssd, arial10, verbose=False)
wri.set_clip(True, True, False)
wri2 = CWriter(ssd, font_cn_light, verbose=False)
wri2.set_clip(True, True, False)
# 显示日期
txt = Label(wri, 0, 0, "Environmental information")
pargs = (13, 2, 124, 2) # Row, Col, Width, nlines
pargs2 = (36, 2, 124, 1) # Row, Col, Width, nlines
tb = Textbox(wri, *pargs, clip=False)
tb2 = Textbox(wri2, *pargs2, clip=False)
# 模拟量
sensor_dev = ADC(Pin(2))
sensor_dev.atten(ADC.ATTN_11DB) # 这里配置测量量程为0~3.6V
threshold = 10
# 循环检测
while True:
sensor_value = 0
for i in range(0,16):
sensor_value = sensor_value + sensor_dev.read()
sensor_value = sensor_value / 16
Vbattf = 2 * sensor_value / 1000.0
resistance = (float)(1023 - sensor_value) * 10 / sensor_value
print("\nVbattf: %0.2f V" % Vbattf)
print("sensor_value: %d" % sensor_value)
print("resistance: %0.2f" % resistance)
tb.clear()
tb.append("\n", ntrim = 100)
tb.append(" sensor_value: %d" % sensor_value, ntrim = 100)
tb.append(" resistance: %0.2f" % resistance, ntrim = 100)
tb2.clear()
if resistance > threshold:
status = "光线弱,需要开灯"
buzzer.duty(50)
utime.sleep(0.5)
buzzer.duty(0)
utime.sleep(0.5)
buzzer.duty(50)
utime.sleep(0.5)
buzzer.duty(0)
else:
status = "光线足够"
print(status)
tb2.append(status, ntrim = 100)
refresh(ssd)
utime.sleep(1)
上述代码,就是先读取传感器的数值,然后再显示到屏幕上,并根据转换的结果,显示是否需要开灯,如果需要开灯,还会驱动蜂鸣器发生提醒。
注意,代码中,使用了两个CWriter实例:
# 显示输出
CWriter.set_textpos(ssd, 0, 0)
wri = CWriter(ssd, arial10, verbose=False)
wri.set_clip(True, True, False)
wri2 = CWriter(ssd, font_cn_light, verbose=False)
wri2.set_clip(True, True, False)
一个CWriter实例,只能使用一种字体,所以中英文显示的,要区分开来。
当然,生成中文字体的时候,把对应要显示的英文字符的字形信息一并生成也是可以的。
四、运行测试
运行上述代码后,具体结果如下:
1. 光线足够时:
2. 光线不足时 :同事蜂鸣器会鸣叫,提醒要开灯了
当然,你也可以跟你的实际需要,调整 threshold 的值。
五、总结
Seeed Studio XIAO ESP32C3扩展板真的非常的方便,自带IIC、模拟传感器、UART接口,接入 Seeed Studio 系列的传感器非常的方便。
模拟数据获取,是嵌入式开发中非常常见的一类数据获取,很有掌握的必要。在MicroPython中,获取其原始数据,也是非常的简单方便。
本帖最后由 HonestQiao 于 2023-12-9 22:05 编辑