Bootstrap

嵌入式人工智能(21-基于树莓派4B的DS18B20温度传感器)

1、传感器

传感器是一种能够将环境中的物理量转化成电信号的设备或装置。它们可以检测和测量温度、压力、湿度、光照、声音、位置等各种物理量,并将其转换成电信号。传感器广泛应用于工业、医疗、农业、汽车、航空航天等领域,用于监测和控制系统。传感器的主要功能是实时获取环境信息,并将其传输给其他设备或系统进行处理和分析。常见的传感器包括温度传感器、压力传感器、湿度传感器、光传感器、声传感器、位置传感器等。随着技术的不断发展,传感器的种类和应用范围越来越广泛,正发挥着越来越重要的作用。

我们主要介绍各类传感器的原理,型号,与树莓派的连接方式,使用方法,样例等。

2、温度传感器DS18B20

DS18B20是一种数字温度传感器,它使用单总线接口进行通信。它具有高精度、低功耗和广泛的工作温度范围,使其成为许多应用中首选的温度传感器。

DS18B20传感器使用的是独特的一线通信协议,可以将多个传感器连接到同一个总线上,并通过唯一的64位ROM代码来识别每个传感器。这种特性使得传感器在多个传感器应用中非常有用,例如温度监控系统。

DS18B20传感器具有高精度的温度测量能力,可以测量-55°C到+125°C范围内的温度。它的精度可以达到±0.5°C,这使得它非常适用于精确温度测量应用,如气象站、温度控制和工业自动化等。

此外,DS18B20传感器具有低功耗特性,工作电流仅为1mA,使其非常适用于电池供电的应用。

总之,DS18B20是一种高精度、低功耗的数字温度传感器,适用于多种应用,包括温度监控、气象站和工业自动化等。它的特点包括独特的一线通信协议、多传感器连接能力和高精度温度测量能力。

3、与树莓派连接

最常见的DS18B20是上左图第一个,该传感器仅有3个引脚,从右至左依次为:VCC、DATA和GND 引脚。其中 VCC引脚可接树莓派的3.3V输出,GND则接树莓派的GND引脚,这里要特别注意,正、负引脚不能接反(把该传感器引脚朝下垂直桌面放置,使其平面面对我们,此时左侧引脚为负,右侧引脚为正),接反就会立刻发热,显示数据时总是显示85℃,甚至烧毁。中间的数据引脚可接在树派的7号物理引脚上,但必须串联一个 4.7~10kΩ的上拉电阻,否则电平过高时,将不能正常输入或输出,导致通电后立即显示85℃。具体接线如图所示,在开始接线前应先切断树派的电源。由于我这里使用的是DS18B20模块,已经连接上拉电阻,就不用考虑了。

4、单总线系统配置

1-Wire是由Dallas Semiconductor(现为Maxim Integrated所有)开发的一种通信协议,允许使用单线和接地基准在集成电路之间进行通信。它通常用于温度传感、识别和控制系统等应用中设备之间的低速、低成本数据交换。该协议采用主从架构,其中主设备发起通信,从设备相应响应。1线网络中的每个从设备都有一个唯一的64位地址,允许主设备单独对其进行寻址。通信是双向的,数据和电力在同一根电线上传输。1-Wire协议还提供了基本的错误检测和纠正机制,以确保可靠的数据传输。

(1)树莓派开启1-wire

(2)手动在boot/firmware/config.txt文件的all写入配置,将温度传感器的DATA引脚接在GPIO23上,就是物理引脚16.设置完后重启。

dtoverlay=w1-gpio-pullup,gpiopin=23

(2)进入设备目录,查看温度传感器设备,显示温度值

cd /sys/bus/w1/devices/     显示设备28-0823334e0c43,该设备号就是温度传感器的设备序列号(64bit),如果没有显示可尝试加载驱动。

sudo modprobe w1-gpio
sudo modprobe w1-therm

(3)查看设备当前温度值

t=26687/1000就是当前温度值26.687度。

(4)安装Python的w1thermsensor包来读取数据

pip install w1thermsensor

5、代码实现读取当前温度送OLED显示

代码比较简单,就不再解释了。

import os
import glob
import time
from PIL import Image  
from PIL import ImageDraw
from PIL import ImageFont
import RPi.GPIO as GPIO
import luma.oled as oled  
from luma.core.interface.serial import i2c    
from luma.oled.device import ssd1306  
from luma.core.render import canvas
import w1thermsensor

WIDTH=128
HEIGHT=64 

# 指定编号规则为BOARD
GPIO.setmode(GPIO.BOARD)
# 设置输入引脚
channel1 = 13
# 设置GPIO输入模式, 使用GPIO内置的上拉电阻, 即开关断开情况下输入为HIGH
GPIO.setup(channel1, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# 传感器的序列号要根据设备修改0823334e0c43
# 创建 W1 温度传感器对象
sensor = w1thermsensor.W1ThermSensor(w1thermsensor.Sensor.DS18B20)

def load_device():
    # 创建I2C接口对象  
    serial = i2c(port=1, address=0x3C)  # 地址可能因显示屏型号而异,由命令行“sudo i2cdetect -y 1”得到
    # 创建OLED设备对象  
    device = ssd1306(serial, WIDTH, HEIGHT) 
    return device

if __name__=='__main__':
    global device
    device = load_device()
    font = ImageFont.truetype('STKAITI.TTF',17)
    while True:
        if GPIO.input(channel1)==GPIO.LOW:
            GPIO.cleanup()
            exit()
        else:
            # 获取温度
            temperature = sensor.get_temperature()
            # 输出温度
            print('Temperature:{}°C'.format(temperature))
            with canvas(device) as draw:
                draw.rectangle(device.bounding_box, outline=0, fill=0)
                draw.text((0,0), "当前温度为:",font=font, fill='white')
                draw.text((0,20), str(temperature), font=font, fill="white")

 

;