Taisomas DS18b20

Jump to navigation Jump to search

Dėmesio: Jūs nesate prisijungęs. Jūsų IP adresas bus viešai matomas, jei atliksite kokius nors keitimus. Jeigu prisijungsite arba sukursite paskyrą, jūsų keitimai bus priskirti jūsų naudotojo vardui; drauge įgysite naujų galimybių.

Keitimas gali būti atšauktas. Prašome patikrinti palyginimą, esantį žemiau, kad patvirtintumėte, kad jūs tai ir norite padaryti, ir tada išsaugokite pakeitimus, esančius žemiau, kad užbaigtumėte keitimo atšaukimą.

Dabartinė versija Jūsų tekstas
8 eilutė: 8 eilutė:
 
== RaspberryPI pajungimas naudojant 4.7k Ohm rezistorių ==
 
== RaspberryPI pajungimas naudojant 4.7k Ohm rezistorių ==
  
=== Standartinis jungimas ===
 
 
[[Vaizdas:35139160190 cea3435a09 b.jpg]]
 
[[Vaizdas:35139160190 cea3435a09 b.jpg]]
 
 
=== Alternatyvus jungimas, kai standartiniai pinai jau yra užimti ===
 
 
[[Vaizdas:Termpo gpio209287.jpg|600px]]
 
 
[[Vaizdas:Termpo gpio43250897.jpg|600px]]
 
 
* PIN17 - VCC (Raudonas)
 
* PIN14 - GND (Juodas)
 
* PIN11 - DATA (Geltonas)
 
 
Taip pat galima jungti kelis sensorius, tokia tvarka:
 
 
[[Vaizdas:46695522054 335a5086f5 z.jpg]]
 
 
== Raspbian paruošimas ==
 
 
Į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 [https://pinout.xyz/pinout/1_wire 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 ===
 
 
<syntaxhighlight lang="python">
 
#!/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)
 
</syntaxhighlight>
 
 
=== Python scriptas temperatūrai nuskaityti (jeigu naudojami keli sensoriai) ===
 
 
 
<syntaxhighlight lang="python">
 
#!/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()
 
</syntaxhighlight>
 
 
== Dingusių iš sistemos sensorių sutvarkymas ==
 
 
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
 
<syntaxhighlight lang="python">
 
#!/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)
 
</syntaxhighlight>
 
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) ==
 
 
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)))
 
  
 
[[Category:Hardware]]
 
[[Category:Hardware]]
 
[[Category:RaspberryPI]]
 
[[Category:RaspberryPI]]
 
[[Category:OrangePI]]
 
[[Category:OrangePI]]

Primename, kad viskas, kas patenka į Žinynas, yra skelbiama pagal GNU Free Documentation License 1.2 (plačiau – Žinynas:Autorinės teisės). Jei nenorite, kad jūsų indėlis būtų be gailesčio kaitaliojamas ir platinamas, nerašykite čia.
Jūs taip pat pasižadate, kad tai jūsų pačių rašytas turinys arba kopijuotas iš viešų ar panašių nemokamų šaltinių. Nekopijuokite autorinėmis teisėmis apsaugotų darbų be leidimo!

Kad apsaugotume vikį nuo automatinio keitimų šlamšto, prašome išspręsti šį CAPTCHA:

Atšaukti Kaip redaguoti (atsidaro naujame lange)