冬天北方车辆车窗会在夜晚结冰,导致第二天早上需要相当长的时间化冰,否则将严重影响视线无法驾驶。车窗起雾的原因主要是车内外温差较大,导致车内湿气在车窗上凝结,随后被车外的低温冻住结冰。我计划的解决方案是,当熄火并锁车后,检测车内外温度差,若温度差大于设定值,则开启通风功能快速平衡车内外温度;当温差小于阈值后关闭通风节省电量。
这里面就涉及到了两个温度传感器的数值读取。为了尽可能体验开发板功能,在这里我选取了两个不同的传感器。我们分来讲他们的驱动方法。
首先是BMP280,这本是一颗气压传感器,但是传感器内部有温度传感器,用来做补偿计算使用。温度传感器的读数可以直接读取,因此可以用作我们当前的应用。
我们先要在python中安装必要的驱动库:
pip3 install adafruit-circuitpython-bmp280
安装完成后,将bmp280连接到核桃派的I2C1接口上,接线方式如下:
SCL: PI7
SDA: PI8
VCC: 3.3V
GND: GND
完成连线后,新建一个python文件,写入以下代码:
import board
import busio
import adafruit_bmp280
i2c = busio.I2C(board.SCL1, board.SDA1)
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c, address = 0x76)
bmp280.sea_level_pressure = 1018.25
print("Temperature: %0.1f C" % bmp280.temperature)
print("Pressure: %0.1f hPa" % bmp280.pressure)
print("Altitude = %0.2f meters" % bmp280.altitude)
然后使用python
来运行它,如果一切顺利,应该就可以看到一下输出:
接下来是另一个传感器,我使用的是SHT48。这是一款温湿度传感器,体积非常小,同样使用I2C进行通讯。
首先安装库文件:
pip3 install adafruit-circuitpython-sht4x
接线和上面一样:
SCL: PI7
SDA: PI8
VCC: 3.3V
GND: GND
接着在我们刚才创建的文件中加入以下内容:
import adafruit_sht4x
sht = adafruit_sht4x.SHT4x(i2c)
print("")
print("Found SHT4x with serial number", hex(sht.serial_number))
sht.mode = adafruit_sht4x.Mode.NOHEAT_HIGHPRECISION
print("Current mode is: ", adafruit_sht4x.Mode.string[sht.mode])
temperature, relative_humidity = sht.measurements
print("Temperature: %0.1f C" % temperature)
print("Humidity: %0.1f %%" % relative_humidity)
print("")
用python
运行一下,如果一切顺利,应该就可以看到一下输出:
我们可以看到两个传感器读数相差无几。
我们用手指贴在SHT40传感器背面的PCB上,10秒后,我们就可以看到出现了明显的温度差异:
因此,假设我们把SHT40放置于车内,BMP280放置于车外,当车内温度高与车外一定温度时(正常这个温度应大于10度,且同时室外温度低于0度。但为了方便演示,这里设置为2.5度),开启换气风扇(风扇使用板载LED进行指示),平衡车内外温度,就可以避免车窗上出现冷凝水再结冰的问题。完整代码如下。记得由于这里添加了GPIO控制,要使用sudo python
来运行:
import time
import board
import busio
import adafruit_bmp280
i2c = busio.I2C(board.SCL1, board.SDA1)
print(i2c.scan())
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c, address = 0x76)
bmp280.sea_level_pressure = 1013.25
import adafruit_sht4x
sht = adafruit_sht4x.SHT4x(i2c)
print("Found SHT4x with serial number", hex(sht.serial_number))
sht.mode = adafruit_sht4x.Mode.NOHEAT_HIGHPRECISION
print("Current mode is: ", adafruit_sht4x.Mode.string[sht.mode])
from digitalio import DigitalInOut, Direction, Pull
led = DigitalInOut(board.LED) #定义引脚编号
led.direction = Direction.OUTPUT #IO为输出
while True:
outer = bmp280.temperature
inner = sht.measurements[0]
print("outer: %0.1f C" % outer)
print("inner: %0.1f C" % inner)
print("")
if (inner - outer > 2.5):
led.value = 1
print(1)
else:
led.value = 0
print(0)
time.sleep(0.5)