DS18b20: Skirtumas tarp puslapio versijų
(multiple sensoriai ir temperaturu nuskaitymas) |
(puse metų, kol supratau tokį paprastą sensoriaus recoverinimo būdą :D) |
||
(nerodoma viena tarpinė versija, sukurta to paties naudotojo) | |||
111 eilutė: | 111 eilutė: | ||
ReadAllSensors() | ReadAllSensors() | ||
</syntaxhighlight> | </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]] |
Dabartinė 14:39, 29 vasario 2020 versija
Temperatūros sensorius.
RaspberryPI pajungimas naudojant 4.7k Ohm rezistorių[keisti]
Standartinis jungimas[keisti]
Alternatyvus jungimas, kai standartiniai pinai jau yra užimti[keisti]
- PIN17 - VCC (Raudonas)
- PIN14 - GND (Juodas)
- PIN11 - DATA (Geltonas)
Taip pat galima jungti kelis sensorius, tokia tvarka:
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)))