[作品提交] 【得捷电子Follow me第3期】任务6-3:开灯提醒器

HonestQiao   2023-12-9 21:57 楼主

这次活动,除了Seeed Studio XIAO ESP32C3和扩展板,传感器还买了ATH20温湿度传感器和模拟光线传感器。

image.png  

这篇帖子,分享的就是这个光纤传感器的具体使用。

 

一、硬件连接

在地板上,有专门的模拟传感器的接口A0:

image.png  

 

因此,使用模拟光线传感器自带的数据线连接即可:

image.png  

二、读取光线传感器的测量值

这次的光线传感器,是模拟光线传感器,不能直接读取到测量的数值,实际获取的,是一个模拟值量值,需要经过一定的转换,才能转变为实际的电压值。

参考 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 上传到对应目录:

image.png  

 

再编写完整的代码:

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. 光线足够时:

image.png

 

2. 光线不足时 :同事蜂鸣器会鸣叫,提醒要开灯了

image.png

当然,你也可以跟你的实际需要,调整 threshold 的值。

 

五、总结

Seeed Studio XIAO ESP32C3扩展板真的非常的方便,自带IIC、模拟传感器、UART接口,接入 Seeed Studio 系列的传感器非常的方便。

模拟数据获取,是嵌入式开发中非常常见的一类数据获取,很有掌握的必要。在MicroPython中,获取其原始数据,也是非常的简单方便。

 

本帖最后由 HonestQiao 于 2023-12-9 22:05 编辑

回复评论 (3)

直接控制开灯就可以啊,或者再加个人体检测  

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2023-12-10 08:51
引用: 秦天qintian0303 发表于 2023-12-10 08:51 直接控制开灯就可以啊,或者再加个人体检测  

控制灯自己接个LED就好。

 

人体检测需要一个传感器就成。

点赞  2023-12-10 09:11
引用: HonestQiao 发表于 2023-12-10 09:11 控制灯自己接个LED就好。   人体检测需要一个传感器就成。

嗯,雷达传感器可以,进行动物检测  

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2023-12-10 09:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复