DS18b20

Iš Žinynas.
Jump to navigation Jump to search

Temperatūros sensorius.

41f5egsLS2L.jpg

RaspberryPI pajungimas naudojant 4.7k Ohm rezistorių[keisti]

 Standartinis jungimas[keisti]

35139160190 cea3435a09 b.jpg


Alternatyvus jungimas, kai standartiniai pinai jau yra užimti[keisti]

Termpo gpio209287.jpg

Termpo gpio43250897.jpg

  • PIN17 - VCC (Raudonas)
  • PIN14 - GND (Juodas)
  • PIN11 - DATA (Geltonas)

Taip pat galima jungti kelis sensorius, tokia tvarka:

46695522054 335a5086f5 z.jpg

Raspbian paruošimas[keisti]

Įgalinam wire 1 overlay, į /boot/config.txt įrašome šią eilutę:

dtoverlay=w1-gpio,gpiopin=17

Išsaugome ir perkrauname RaspberryPI. Perkrovus turėtų atsirasti šie įrenginiai:

ls /sys/bus/w1/devices

Daugiau apie wire 1 sąsają. DĖMESIO! Jungiant standartiškai kai standartiniai pinai nėra užimti, žiūr. pav. 1, nereikia prirašyti gpiopin parametro, tuomet duomenys eis standartiškai per PIN 7.

Python scriptas temperatūrai nuskaityti[keisti]

#!/usr/bin/env python
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)

Python scriptas temperatūrai nuskaityti (jeigu naudojami keli sensoriai)[keisti]

#!/usr/bin/python
import os
import glob
import time


sensors = [{"hwid":"28-03049779621c", "name":"1 sensorius", "color":"#ff0000"},
              {"hwid":"28-03049779691d", "name":"2 sensorius", "color":"#0000ff"},
              {"hwid":"28-03049779b25b", "name":"3 sensorius", "color":"#3cb371"},
              {"hwid":"28-03049779d1ab", "name":"4 sensorius", "color":"#6a5acd"}]

 
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
 
def read_temp_raw(dev):
    f = open("/sys/bus/w1/devices/"+dev+"/w1_slave",'r')
    lines = f.readlines()
    f.close()
    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 = round((float(temp_string) / 1000.0),2)
        return temp_c

def ReadAllSensors():
   for sensor in sensors:
        temp = str(read_temp_raw(sensor["hwid"]))
        print "Sensor: "+str(sensor["name"])+" temp: "+temp+"C"

ReadAllSensors()

Dingusių iš sistemos sensorių sutvarkymas[keisti]

Galbūt paskutinis workaroundas kurį galima būtų vadinti tikru problemos sprendimo būdu bet labai gerai, kai nėra jokios kitos alternatyvos. Dažnai nusipirkus nelegaliai pagamintų "piratinių" ds18b20 sensorių, jie turi tokią problemą po kiek laiko tiesiog dingsta iš sistemos apie tai iš anksto nepranešę. :)

Norint juos matyti kaip ankščiau nepakanka "reboot", reikia išjungti maitinimą ir vėl jį ijungti, po kelių sekundžių bet automatizuotose sistemose, kai norime padaryti autonominį valdyma, toks variantas tikrai netinka ir reikia ieškoti kitų sprendimų. Vienas iš tokių sprendimų sensorių maitinimo laidą jungti tiesiogiai prie GPIO porto ir paduoti jam 3.3V maitinimą, sensoriams dingus tą maitinimą išjungti po to vėl įjungti. Taip galima bent preliminariai automatizuoti ir išspresti esamą problemą kai kito pasirinkimo nėra, kadangi daugelis GPIO portų gali atiduoti 3.3V maitinimą kurio pakanka šio tipo sensoriams... Taigi prieš automatizuojant šios problemos sprendimą įsitikiname, kad sensorius (ar keli sujungti į grandinę) yra sujungti į šiuos fizinius RaspberriPI pin'us (atkreipkite dėmesį į tai, kad fizinių ir GPIO tipo portų numeravimas yra skirtingas).

  • pin13 vcc (raudonas laidas, įtampa) # GPIO PORT 27
  • pin6 gnd (melynas laidas, groundas)
  • pin11 data (geltonas laidas, duomenų perdavimas) # GPIO PORT 17

Pastarąjį pin13 mes ir naudosime elektrai paduoti ir išjungti, panaudojant žemiau esantį python scriptą, bet prieš tai įsitikinkite, kad jūsų /boot/config.txt sukonfigūruotas taip:

dtoverlay w1-gpio gpiopin=17 pullup=on

Ir /etc/modules turi šią eilutę:

w1-therm strong_pullup=2
#!/usr/bin/python2.7
import RPi.GPIO as GPIO
import time
import os

pin = 27


if (os.path.isdir("/sys/bus/w1/devices/28-03049779621c") == False):
       GPIO.setwarnings(False)
       GPIO.setmode(GPIO.BCM)
       print "Recovering 1-Wire ..."
       GPIO.setup(pin, GPIO.OUT)
       print("Isjungiam srove i pin: "+str(pin))
       GPIO.output(pin, GPIO.LOW)
       time.sleep(15)
       print("Duodam srove i pin: "+str(pin))
       GPIO.output(pin, GPIO.HIGH)

Turime tik pakeisti sensoriaus pavadinimą 28-03049779621c į jūsų naudojamą (jeigu sensoriai yra keli, tuomet pasirinkite vieną iš jų pavadinimų, nes dažniausiai kai dingsta tai dingsta jie visi). Įdėkite scriptą į /usr/local/bin/1wire_fix. Tuomet į /etc/crontab įdėkite šią eilutę, kad sensorių nebuvimo tikrinimas įvyktų kas minutę:

* * * * * root /usr/local/bin/1wire_fix > /dev/null 2>&1

Jeigu norime, kad informacija kada ir kaip buvo sutrikęs veikimas, rašytūsi į log, tuomet darome taip:

* * * * * root /usr/local/bin/1wire_fix >> /root/1wire_fix.log 2>&1


Software tipo apejimas (userspace driver)[keisti]

cd
git clone https://github.com/danjperron/BitBangingDS18B20
cd BitBangingDS18B20/python
sudo python setup.py install

Then from python read all the sensor. I use GPIO17 (pin 11) on this example

sudo python
import DS18B20
gpiopin = 17
sensors = DS18B20.scan(gpiopin)
for i in sensors:
 print('{} : {}'.format(i, DS18B20.read(True,gpiopin,i)))