термодатчик по 1-wire
-
Добрый день. Пишу программу для подключения термодатчика DS18B20 (http://labkit.ru/userfiles/file/documentation/Sensor/DS18B20_RU.pdf) к малине pi3. Возникли проблемы: Приветствие проходит успешно, на шине появляется ноль от датчика в ответ на мой ноль. Но затем в ответ на команду чтения из памяти, получаю на шине всегда все единицы с иногда «пробегающим» нулем. Ясно, что проблемы с таймингами. Замерял времена выполнения отдельных команд с помощью функций time.time() и вышло, что функции GPIO.xx выполняется в районе 3-5 мкс, что делает невозможным, на мой взгляд, соблюдение таймингов в 15 мкс. Если кто-то уже делал подобного рода программу или просто может чем-то помочь, буду очень рад. Прикрепляю программу на питоне к посту.
P.S. Использую не паразитное питание. Датчик питаю от 3.3V малины.import RPi.GPIO as GPIO
import time
import mathsecondMultiplier = 0.000001
tempValue = 0;def main_init():
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)def init_Greetings():
GPIO.setup(21, GPIO.OUT)
GPIO.output(21, 0)
time.sleep(550 * secondMultiplier)
GPIO.setup(21, GPIO.IN)
time.sleep(60 * secondMultiplier)
signal = GPIO.input(21)
time.sleep(500 * secondMultiplier)
return 1 - signaldef write(bit):
GPIO.setup(21, GPIO.OUT) #if bit == 1 if (bit == '1'): GPIO.output(21, 0) time.sleep(15 * secondMultiplier) GPIO.setup(21, GPIO.IN) #if bit == 0 if (bit == '0'): GPIO.output(21, 0) time.sleep(100 * secondMultiplier) GPIO.setup(21, GPIO.IN)
def writeByte(byte):
i = 0
while i < 8:
write(byte[7-i])
i = i + 1def setup_Termometr():
#Activate command 0xCC - Ignore ROM 11001100B writeByte('11001100') #Activate command 4Eh - Write to RAM 01001110B writeByte('01001110') #Send Data Bytes writeByte('00000000') writeByte('00000000') writeByte('11111110')
def start_Convertion():
#Activate command 44h - Start temperature convertion 01000100B writeByte('01000100') GPIO.setup(21, GPIO.IN)
def read_Bit():
GPIO.setup(21, GPIO.OUT) GPIO.output(21, 0) time.sleep(1 * secondMultiplier) GPIO.setup(21, GPIO.IN) time.sleep(15 * secondMultiplier) return GPIO.input(21)
def read_Termometr():
#Command 0CCh. Block ROM
writeByte('11001100')
#Activate command 0BEh. Read from ROM 1011 1110B
writeByte('10111110')
i = 0
while (i < 72):
bit = read_Bit()
#print bit
if (i < 12):
#print(GPIO.input(21))
global tempValue
tempValue = tempValue + bit * math.pow(2, i - 4)
i = i + 1#Main Program
main_init()#---Greetings, SENSOR
flag = init_Greetings()
if flag:
print("No error")
#If DS18B20 answered by greetings when continue to work
#Settings termometr's mode
#Resolution - 12bit
setup_Termometr()
#Start temperature convertion
start_Convertion()
while (1):
if (GPIO.input(21)):
break;
print("Ready to read")
#Read convertion's data
read_Termometr()
#Output temperature
print(tempValue)
else:
print("Error")
GPIO.cleanup() -
С такой стороны, чтобы самому реализовыать протокол обмена, использовать датчики не приходилось.
Когда такой же датчик подлючал к RaspberryPi B+, то у меня был модуль ядра 1wire, который отображал датчики в файлы или устройства в каталоге /dev/. Достаточно было просто прочитать файл и получаешь значение температуры.
Также есть еще проект owfs кажется, тоже для подключения датчиков через 1wire.