ARM技术william hill官网
直播中

jf_08252801

未满1年用户 21经验值
擅长:可编程逻辑 电源/新能源 测量仪表 嵌入式技术 连接器 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[经验]

【核桃派1B 开发板试用体验】车窗智能防结冰结霜

冬天北方车辆车窗会在夜晚结冰,导致第二天早上需要相当长的时间化冰,否则将严重影响视线无法驾驶。车窗起雾的原因主要是车内外温差较大,导致车内湿气在车窗上凝结,随后被车外的低温冻住结冰。我计划的解决方案是,当熄火并锁车后,检测车内外温度差,若温度差大于设定值,则开启通风功能快速平衡车内外温度;当温差小于阈值后关闭通风节省电量。

这里面就涉及到了两个温度传感器的数值读取。为了尽可能体验开发板功能,在这里我选取了两个不同的传感器。我们分来讲他们的驱动方法。

首先是BMP280,这本是一颗气压传感器,但是传感器内部有温度传感器,用来做补偿计算使用。温度传感器的读数可以直接读取,因此可以用作我们当前的应用。
BMP280 Pinout, Specifications & Applications

我们先要在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来运行它,如果一切顺利,应该就可以看到一下输出:

image.png

接下来是另一个传感器,我使用的是SHT48。这是一款温湿度传感器,体积非常小,同样使用I2C进行通讯。
e0fe4dc6d73c6f9c63cef66fd4dd5e4.jpg

首先安装库文件:

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运行一下,如果一切顺利,应该就可以看到一下输出:
image.png

我们可以看到两个传感器读数相差无几。

我们用手指贴在SHT40传感器背面的PCB上,10秒后,我们就可以看到出现了明显的温度差异:

image.png

因此,假设我们把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
# Can also set the mode to enable heater
# sht.mode = adafruit_sht4x.Mode.LOWHEAT_100MS
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:
    # print("Temperature: %0.1f C" % bmp280.temperature)
    # print("Pressure: %0.1f hPa" % bmp280.pressure)
    # print("Altitude = %0.2f meters" % bmp280.altitude)
    # print("")
    # temperature, relative_humidity = sht.measurements
    # print("Temperature: %0.1f C" % temperature)
    # print("Humidity: %0.1f %%" % relative_humidity)
    # print("")
    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)

更多回帖

发帖
×
20
完善资料,
赚取积分