查看: 2161|回复: 0

[教程] 【一网打尽】LEARN RASPBERRY PI (11 of 13)

[复制链接]
  • TA的每日心情
    开心
    2016-8-4 10:56
  • 签到天数: 242 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-3-30 22:03:54 | 显示全部楼层 |阅读模式
    分享到:
    Overview SIMON MONK

    The Occidentalis Linux distribution for Raspberry Pi (and Raspbian as of Dec 2012) includes support for the DS18B20 1-wire temperature sensor. These sensors come in a small three pin package like a transistor and are accurate digital devices.

    learn_raspberry_pi_summary.jpg
    In this lesson, you will learn how to use a DS18B20 with the Raspberry Pi to take temperature readings.
    Since the Raspberry Pi has no ADC (Analog to Digital Converter), it cannot directly use an analog temperature sensor like the TMP36, making the DS18B20 a good choice for temperature sensing.

    Other Code LibrariesIf you are a python-fancier, there's also a nice DS18B20 library that works with raspberry pi over athttps://github.com/timofurrer/ds18b20 (written by Timo!)

    Parts SIMON MONK

    To build the project described in this lesson, you will need the following parts.

    learn_raspberry_pi_pi.jpg
    Raspberry Pi
    learn_raspberry_pi_temp_probe.jpg
    DS18B20 Digital temperature sensor + extras, or waterproof or high temperature versions (see products sidebar)
    You'll also need a 4.7K or 10K ohm resistor, it comes with the sensor when purchased from Adafruit
    learn_raspberry_pi_breadboard_half_web.jpg
    Half-sized breadboard

    learn_raspberry_pi_jumpers_web.jpg
    Jumper wire pack
    learn_raspberry_pi_cobbler.jpg
    Pi Cobbler

    Hardware SIMON MONK

    The breadboard layout for just the basic DS18B20 is shown below.
    The DS18B20 "1-wire" sensors can be connected in parallel - unlike nearly any other sensor sold! All sensors should share the same pins, but you only need one 4.7K resistor for all of them
    The resistor is used as a 'pullup' for the data-line, and is required to keep the data transfer stable and happy
    Be careful to get the DS18B20 the right way around. The curved edge should be to the left as shown in the figure below. If you put it the wrong way around, it will get hot and then break.

    Despite both being temperature sensors, the DS18B20+ is totally different than the TMP36. You cannot use a TMP36 for this tutorial!

    learn_raspberry_pi_breadboard-ic.png
    If you are using the waterproof version of the DS18B20 then the device has three leads, red, black and yellow. The bare copper screening lead that does not need to be connected.
    If you are using the "high temperature" version of the DS18B20 we sell, connect Orange Stripe to 3.3V, White connects to ground and Blue Stripe is data, pin #4.
    You still need a ~4.7K-10K resistor from data to 3.3V

    learn_raspberry_pi_breadboard-probe.png
    learn_raspberry_pi_project_probe.jpg
    DS18B20 SIMON MONK

    Although the DS18B20 just looks like a regular transistor, there is actually quite a lot going on inside.
    The chip includes the special 1-wire serial interface as well as control logic and the temperature sensor itself.
    Its output pin sends digital messages and Raspbian/Occidentalis includes an interface to read those messages. You can experiment with the device from the command line or over SSH (see Lesson 6), before we run the full program.

    Add OneWire support
    Start by adding the following line to /boot/config.txt
    You can edit that file with nano by running sudo nano /boot/config.txt and then scrolling to the bottom and typing it there

    Copy Code


    • dtoverlay=w1-gpio

    Then reboot with sudo reboot. When the Pi is back up and you're logged in again, type the commands you see below into a terminal window. When you are in the 'devices' directory, the directory starting '28-' may have a different name, so cd to the name of whatever directory is there.

    Copy Code


    • sudo modprobe w1-gpio
    • sudo modprobe w1-therm
    • cd /sys/bus/w1/devices
    • ls
    • cd 28-xxxx (change this to match what serial number pops up)
    • cat w1_slave

    learn_raspberry_pi_modprobe.png
    The interface is a little unreliable, but fortunately it tells us if there is a valid temperature to read. It's like a file, so all we have to do is read
    The response will either have YES or NO at the end of the first line. If it is yes, then the temperature will be at the end of the second line, in 1/000 degrees C. So, in the example above, the temperature is actually read as 20.687 and then 26.125 degrees C.
    If you have more than one Sensor connected, you'll see multiple 28-xxx files. Each one will have the unique serial number so you may want to plug one in at a time, look at what file is created, and label the sensor!

    Software SIMON MONK

    The Python program deals with any failed messages and reports the temperature in degrees C and F every second.

    Copy Code


    • import os
    • import glob
    • import time
    • 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 read_temp_raw():
    •     f = open(device_file, 'r')
    •     lines = f.readlines()
    •     f.close()
    •     return lines
    • def read_temp():
    •     lines = read_temp_raw()
    •     while lines[0].strip()[-3 != 'YES':
    •         time.sleep(0.2)
    •         lines = read_temp_raw()
    •     equals_pos = lines[1].find('t=')
    •     if equals_pos != -1:
    •         temp_string = lines[1][equals_pos+2
    •         temp_c = float(temp_string) / 1000.0
    •         temp_f = temp_c * 9.0 / 5.0 + 32.0
    •         return temp_c, temp_f
    •        
    • while True:
    •         print(read_temp())       
    •         time.sleep(1)

    The program starts by issuing the 'modprobe' commands that are needed to start the interface running.
    The next three lines, find the file from which the messages can be read.
    A problem has been reported with occasional hangs when reading the temperature file when using Raspbian. If you find you have the same problem, try replacing the function read_temp_raw with the code below. You will also need to add a line at the top of the file 'import subprocess'.

    Copy Code


    • def read_temp_raw():
    •         catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    •         out,err = catdata.communicate()
    •         out_decode = out.decode('utf-8')
    •         lines = out_decode.split('\n')
    •         return lines

    Reading the temperature takes place in two functions, read_temp_raw just fetches the two lines of the message from the interface. The read_temp function wraps this up checking for bad messages and retrying until it gets a message with 'YES' on end of the first line. The function returns two values, the first being the temperature in degrees C and the second in degree F.
    You could if you wished separate these two as shown in the example below:

    Copy Code


    • deg_c, deg_f = read_temp()

    The main loop of the program simply loops, reading the temperature and printing it, before sleeping for a second.
    To upload the program onto your Raspberry Pi, you can use SSH to connect to the Pi, start an editor window using the line:

    Copy Code


    • nano thermometer.py

    and then paste the code above, before saving the file with CTRL-x and Y.

    learn_raspberry_pi_ssh_edior.png
    Configure and Test SIMON MONK

    The program must be run as super user, so type the following command into the terminal to start it:

    Copy Code


    • sudo python thermometer.py

    If all is well, you will see a series of readings like this:

    learn_raspberry_pi_readings.png
    Try putting your finger over the sensor to warm it up.

    Adding more sensors
    You can add additional DS18B20 sensors in parallel - connect all the sensors' VCC, data and ground pins together. Use a single 4.7K resistor. You will see multiple /sys/bus/w1/devices/28-nnnnn directories, each one having the unique serial number as the directory name. The python example code only works for one sensor right now so you will have to adapt it if you want it to read from different sensors at once










    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 02:08 , Processed in 0.117723 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.