树莓派以其计算能力及其在物联网、家庭自动化等领域的广泛应用而闻名。然而,对于任何电子系统与现实世界进行交互并获取有关它的信息,系统必须使用传感器。该过程使用多种类型的传感器,并根据要测量的参数及其应用选择所需的传感器。在本教程中,我们将学习将温度传感器DS18B20与树莓派连接。
DS18B20是广泛使用的温度传感器,主要用于化工、矿山等恶劣工作环境的场所。本文将介绍该传感器以及它如何超越其他温度传感器,最后将其与Raspberry Pi连接并查看16x2 LCD上的温度值。
所需材料
DS18B20 温度传感器
树莓派
16*2液晶显示屏
10k修剪锅
10k 上拉电阻
面包板
连接线
DS18B20温度传感器简介
DS18B20是一款三端子温度传感器,采用TO-92(晶体管型)封装。它非常易于使用,只需要一个外部组件即可开始工作。此外,它只需要MCU / MPU的一个GPIO引脚即可与之通信。典型的DS18B20温度传感器及其引脚名称如下所示。
该传感器也可作为防水版本提供,其中传感器由圆柱形金属管覆盖。在本教程中,我们将使用上面显示的普通晶体管型传感器。DS18B20为1线可编程温度传感器,只需数据引脚即可将信息发送到微控制器或微处理器板(如Raspberry Pi)。每个传感器都有一个唯一的 64 位地址,因此也可以将多个传感器连接到同一个 MCU/MPU,因为每个传感器可以在同一数据总线上单独寻址。传感器的规格如下所示。
工作电压:3-5V
测量范围:-55°C 至 +125°C
精度:±0.5°C
分辨率:9 位至 12 位
现在我们对传感器有了足够的了解,让我们统计它与树莓派的接口。
先决条件
假设您的树莓派已经使用操作系统刷新并能够连接到互联网。如果没有,请先按照树莓派入门教程进行操作,然后再继续。这里我们使用Rasbian Jessie安装的Raspberry Pi 3。
还假设您可以通过终端窗口或其他应用程序访问您的 pi,通过这些应用程序您可以编写和执行 python 程序并使用终端窗口。
电路图
正如我们在本教程前面所说,我们将DS18B20传感器与Pi连接,并在16*2 LCD屏幕上显示温度值。因此,传感器和LCD应与树莓派连接,如下所示。
按照电路图进行相应的连接。LCD和DS18B20传感器均在+5V的帮助下工作,+5V由树莓派上的5V引脚提供。LCD使用Raspberry Pi在4位模式下工作,GPIO引脚18,23,24和25用于数据线,GPIO引脚7和8用于控制线。电位计也用于控制LCD的对比度水平。DS18B20的数据线连接到GPIO引脚4。另请注意,必须使用10K电阻器拉动电路图中所示的高电平数据。
您可以按照上面的电路图进行连接,也可以使用引脚表跟进 GPIO 引脚编号。
我使用单股线和公对母线在面包板上构建电路以进行连接。如您所见,传感器只需要一根电线即可连接,因此占用的空间和引脚更少。建立所有连接后,我的硬件如下所示。现在是时候启动 pi 并开始编程了。
在树莓P上安装Adafruit LCD库
温度值将显示在 16*2 LCD 显示屏上。Adafruit 为我们提供了一个库,可以在 4 位模式下轻松操作此 LCD,因此让我们通过打开终端窗口 Pi 并按照以下步骤将其添加到我们的树莓派中。
第 1 步:使用以下行在树莓派上安装 git。Git允许您克隆 Github 上的任何项目文件,并在 Raspberry pi 上使用它。我们的库在 Github 上,所以我们必须安装 git 才能将该库下载到 pi 中。
apt-get install git
第 2 步:以下行链接到存在库的 GitHub 页面,只需执行该行即可克隆 Pi 主目录上的项目文件
git clone git://github.com/adafruit/Adafruit_Python_CharLCD
第 3 步:使用以下命令更改目录行,进入我们刚刚下载的项目文件。命令行如下
cd Adafruit_Python_CharLCD
第 4 步:目录中会有一个名为 setup.py 的文件,我们必须安装它,以安装库。使用以下代码安装库
sudo python setup.py install
也就是说,库应该已成功安装。现在同样,让我们继续安装同样来自Adafruit的DHT库。
在 Pi 中启用单线接口
由于DS18B20传感器通过单线方式通信,因此必须按照以下步骤在Pi上启用单线通信。
第 1 步:-打开命令提示符并使用以下命令打开配置文件
sudo nano /boot/config.txt
第 2 步:-在配置文件中添加行“dtoverlay=w1-gpio”(在下图中包围)并保存文件,如下所示
第 3 步:-使用 Ctrl+X 退出文件并通过按“Y”保存它,然后按 Enter 键。最后使用命令重新启动 Pi
sudo reboot
第 4 步:-重新启动后,再次打开终端并输入以下命令。
sudo modprobe w1–gpio sudo modprobe w1-therm. cd /sys/bus/w1/devices ls
您的终端窗口将显示如下内容
第 5 步:-在步骤 4 结束时,当您输入 ls 时,您的 pi 将显示一个唯一的数字,该数字对于每个用户来说都是不同的,具体取决于传感器,但始终以 28- 开头。就我而言,号码是28-03172337caff。
第 6 步:-现在我们可以通过输入以下命令来检查传感器是否正常工作
cd 28-XXXXXXXXXXXX [use the name of your directory or use Tab key for auto complete)
cat w1_slave
这两个命令将从传感器读取数据并将其显示在终端上,如下所示。下图中的温度值用红色包围。在我的情况下,温度值为37 * C。
为 DS18B20 传感器编程树莓派
现在,我们的Pi已准备好针对LCD进行编程并使用单线协议。因此,我们可以编写最终程序,从DS18B20传感器读取温度值并将其显示在LCD屏幕上。本页末尾给出了执行相同操作的完整 python 程序。但是,下面我将代码分成有意义的小片段来解释它们。
与往常一样,我们通过导入程序所需的头文件来开始程序。这里我们导入时间处理延时功能,LCD接头使用LCD与Pi。操作系统标头用于处理操作系统中的文件。
import time #import time for creating delay
import Adafruit_CharLCD as LCD #Import LCD library
import os #Import for file handling
import glob #Import for global
接下来我们必须提到连接到树莓派引脚的LCD引脚。使用上面提供的 GPIO 引脚图了解各个 GPIO 引脚的引脚号。一旦我们声明了LCD连接到哪些PI引脚,我们就可以指定行数和列数,最后使用以下代码行对其进行初始化。
lcd_rs = 7 #RS of LCD is connected to GPIO 7 on PI
lcd_en = 8 #EN of LCD is connected to GPIO 8 on PI
lcd_d4 = 25 #D4 of LCD is connected to GPIO 25 on PI
lcd_d5 = 24 #D5 of LCD is connected to GPIO 24 on PI
lcd_d6 = 23 #D6 of LCD is connected to GPIO 23 on PI
lcd_d7 = 18 #D7 of LCD is connected to GPIO 18 on PI
lcd_backlight = 0 #LED is not connected so we assign to 0
lcd_columns = 16 #for 16*2 LCD
lcd_rows = 2 #for 16*2 LCD
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
lcd_columns, lcd_rows, lcd_backlight) #Send all the pin details to library
初始化LCD后,我们在LCD上打印示例文本消息。字符“n”用于提及换行符。显示介绍后,我们引入了 2 秒的延迟,供用户阅读介绍消息。
lcd.message('DS18B20 with Pi n -CircuitDigest') #Give a intro message
time.sleep(2) #wait for 2 secs
现在,如果您能回忆起使用 Pi 启用单线接口的步骤 4。我们必须重复相同的代码行,因此我们使用 os.system 函数来执行相同的行。然后我们指定必须从中读取温度值的文件位置。device_folder变量指向以“28-”开头的文件夹,因为我们不知道文件夹的确切名称,我们使用 * 符号打开以 28 开头的任何内容。最后,在该文件夹中,我们使用另一个名为device_file的变量,该变量实际上指向内部具有温度值的文件。
然后我们使用名为 get_temp 的函数,在其中我们定义从我们在上述步骤中刚刚链接的文件中读取温度的过程。正如我们之前与终端检查的那样,该文件内部将包含温度值,但它将采用以下格式
由此我们只需要 37000 的值,即温度值。这里的实际温度值是37.00*C。因此,从这种文本格式中,我们必须修剪所有无用的数据并得到整数值 37000,最后将其除以 1000以获得实际数据。下面显示的函数完全相同
def get_temp(): #Fundtion to read the value of Temperature
file = open(device_file, 'r') #opent the file
lines = file.readlines() #read the lines in the file
file.close() #close the file
trimmed_data = lines[1].find('t=') #find the "t=" in the line
if trimmed_data != -1:
temp_string = lines[1][trimmed_data+2:] #trim the strig only to the temoerature value
temp_c = float(temp_string) / 1000.0 #divide the value of 1000 to get actual value
return temp_c #return the value to print on LCD
变量行用于读取文件内的行。然后比较这些行,搜索字母“t=”,并将该字母后面的值保存在变量temp_string中。最后,为了获得温度值,我们使用变量temp_c将字符串值除以 1000。最后返回函数的结果temp_c变量。
在无限 while 循环中,我们只需要调用上面定义的函数即可获取温度值并将其显示在 LCD 屏幕上。我们还每 1 秒清除一次 LCD 以显示更新的值。
while 1: #Infinite Loop
lcd.clear() #Clear the LCD screen
lcd.message ('Temp = %.1f C' % get_temp()) # Display the value of temperature
time.sleep(1) #Wait for 1 sec then update the values
输出/工作
与往常一样,完整的python代码在页面末尾给出,请使用代码并在Raspberry Pi上编译它。按照电路图中所示进行连接,在执行程序之前,请确保已按照上述步骤安装LCD头文件并在pi上启用单线通信。完成后,只需执行程序,如果一切按预期工作,您应该能够注意到介绍文本。如果没有,请调整对比度电位器,直到看到一些东西。最终结果如下所示。
#Program to read the values of Temp from the DS18B20 sensor and display them on the LCD
import time #import time for creating delay
import Adafruit_CharLCD as LCD #Import LCD library
import os #Import for file handling
import glob #Import for global
lcd_rs = 7 #RS of LCD is connected to GPIO 7 on PI
lcd_en = 8 #EN of LCD is connected to GPIO 8 on PI
lcd_d4 = 25 #D4 of LCD is connected to GPIO 25 on PI
lcd_d5 = 24 #D5 of LCD is connected to GPIO 24 on PI
lcd_d6 = 23 #D6 of LCD is connected to GPIO 23 on PI
lcd_d7 = 18 #D7 of LCD is connected to GPIO 18 on PI
lcd_backlight = 0 #LED is not connected so we assign to 0
lcd_columns = 16 #for 16*2 LCD
lcd_rows = 2 #for 16*2 LCD
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
lcd_columns, lcd_rows, lcd_backlight) #Send all the pin details to library
lcd.message('DS18B20 with Pi n -CircuitDigest') #Give a intro message
time.sleep(2) #wait for 2 secs
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
def get_temp(): #Fundtion to read the value of Temperature
file = open(device_file, 'r') #opent the file
lines = file.readlines() #read the lines in the file
file.close() #close the file
trimmed_data = lines[1].find('t=') #find the "t=" in the line
if trimmed_data != -1:
temp_string = lines[1][trimmed_data+2:] #trim the strig only to the temoerature value
temp_c = float(temp_string) / 1000.0 #divide the value of 1000 to get actual value
return temp_c #return the value to prnt on LCD
while 1: #Infinite Loop
lcd.clear() #Clear the LCD screen
lcd.message ('Temp = %.1f C' % get_temp()) # Display the value of temperature
time.sleep(1) #Wait for 1 sec then update the values
全部0条评论
快来发表一下你的评论吧 !