Skip to content
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи
Collapse
  1. Главная
  2. Raspberry Pi
  3. термодатчик по 1-wire

термодатчик по 1-wire

Запланировано Прикреплена Закрыта Перенесена Raspberry Pi
2 Сообщения 1 Posters 33 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • piP Не в сети
    piP Не в сети
    pi
    написал в отредактировано
    #1

    Добрый день. Пишу программу для подключения термодатчика 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 math

    secondMultiplier = 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 - signal

    def 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 + 1

    def 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()

    1 ответ Последний ответ
    0
    • piP Не в сети
      piP Не в сети
      pi
      написал в отредактировано
      #2

      С такой стороны, чтобы самому реализовыать протокол обмена, использовать датчики не приходилось.
      Когда такой же датчик подлючал к RaspberryPi B+, то у меня был модуль ядра 1wire, который отображал датчики в файлы или устройства в каталоге /dev/. Достаточно было просто прочитать файл и получаешь значение температуры.
      Также есть еще проект owfs кажется, тоже для подключения датчиков через 1wire.

      1 ответ Последний ответ
      0

      • Войти

      • Нет учётной записи? Зарегистрироваться

      • Login or register to search.
      • Первое сообщение
        Последнее сообщение
      0
      • Категории
      • Главная
      • Документация
      • Последние
      • Пользователи