大家好,我是郑工,尘世间一个迷途小工程师。
这两天家里有些事情,耽误了些时间,我们继续下一个任务,监控温度和照度。
首先是温度,我们先看看原理图
可以看到原理还是比较简单的,就是一个热敏电阻,下拉一个10k电阻做分压,用ADC接口去读取这个口的电压就可以。
不过查资料之后,CircuitPython有个库adafruit_thermistor可以直接适配这种情况的温度读取。代码如下:
import adafruit_thermistor
# 模拟输入的管脚
pin = board.TEMPERATURE
# 热敏电阻的常温阻值
resistor = 10000
# 普通电阻的阻值
resistance = 10000
# 热敏电阻的阻值温度
nominal_temp = 25
# 热敏电阻的B系数
b_coefficient = 3950
# 还有最后一个参数,参数名为high_side,表示热敏电阻是否连接在上端,默认为True,可以不填
thermistor = adafruit_thermistor.Thermistor(
pin, resistor, resistance, nominal_temp, b_coefficient)
后续只需要读取thermistor.temperature就可以获取的摄氏温度的值。
然后到照度值,我们先看看原理图
原理也就是一个光电三极管下接一个10k电阻,当光照到光电三极管,会产生光电流,等效电阻减小,电压升高。初始化代码如下:
import analogio
# Adc的值为0-65535(16bit)
light = analogio.AnalogIn(board.LIGHT)
后续只需要查询light.value就可以获取adc的值,范围0-65535
后续代码根据获取的数值显示舒适程度,使用neopixel灯珠显示,初始化代码如下:
import neopixel
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=.05, auto_write=False)
pixels.fill((0, 0, 0))
pixels.show()
后面的功能逻辑就是温度高为红色,温度低为蓝色,中间温度在这两个颜色之间切换
照度呢就是照度越低,灯珠数量越多,代表越舒服,越适合睡觉。
也是一个有些乱的逻辑,没有仔细深究。大家有什么想法可以跟我说说,我去改一下。以下是具体代码
index = 0
while True:
# light value remapped to pixel position
peak = simpleio.map_range(light.value, 500, 10000, 0, 10)
# def map_range(
# x: float,
# in_min: float,
# in_max: float,
# out_min: float,
# out_max: float) -> float:
light_num = 10 - peak
print('\n\n')
print(f'time: {index}')
index = index + 1
print(f'light val:{light.value}')
print(f'light num:{int(light_num)}')
color = simpleio.map_range(thermistor.temperature, 10, 35, 0, 255)
temp_color = (int(color) , 0, 255 - int(color))
print(f'temperature:{int(thermistor.temperature)}')
print(f'temp num:{color}')
for i in range(10):
if i <= light_num:
pixels[i] = temp_color
else:
pixels[i] = (0, 0, 0)
pixels.show()
time.sleep(1)
使用了simpleio的map_range函数,这个函数会根据输入的数据,做出等级划分。