DS18B20, W1ThermSensor, Raspberry pi Zero W и Python3.9 — не считывает последовательно датчик

#python #python-3.x #raspberry-pi #sensors #1wire

#python #python-3.x #raspberry-pi #датчики #1 провод

Вопрос:

Прежде чем начать, я просмотрел раздел «похожие вопросы», прежде чем писать это, и не смог увидеть ни одного, который соответствовал бы ситуации, подобной моей. Если он найден, пожалуйста, дайте мне знать, и я отмечу его как «отвеченный», если он действительно похож. Я разработчик .net full stack по профессии, я только недавно начал увлекаться Python и электротехникой в качестве хобби.

Я создаю автоматизированную систему управления аквапоникой, часть проекта считывает температуру среды для выращивания и с помощью различных других датчиков пересчитывает частоту, с которой насос циклически работает, чтобы затопить слой. Я использую DS18B20 с Python3.9 и библиотекой W1ThermSensor v2.0.0a2. Вот инициализация и первая из нескольких функций для датчика. У меня есть w1thermsensor как свойство класса вместо наследования только во время начального тестирования, так как мне легче манипулировать кодом таким образом.

 #!/usr/bin/env python3

from w1thermsensor import W1ThermSensor, Sensor, Unit
from datetime import datetime
import os
import numpy
import traceback


class DS18B20:

    def __init__(self, min_temp=18, max_temp=26):
        self.sensor = W1ThermSensor()
        self.temp_string = "{dt} : Sensor: {id} :: {temp_c}C - {temp_f}F"
        self.temp_c = 0.00
        self.temp_f = 0.00
        self.is_active = False
        self.is_alert = False
        self.min_temp = min_temp
        self.max_temp = max_temp
        self.values = [0.00, 0.00, 0.00, 0.00, 0.00]
        self.value = 0.00

    def start(self):
        if self.sensor is None:
            return False
        os.system('modprobe w1-gpio')
        os.system('modprobe w1-therm')
        # Set baseline for values Average
        self.is_active = True
        self.monitor()
        self.values = [self.temp_c, self.temp_c, self.temp_c, self.temp_c, self.temp_c]
        self.value = numpy.average(self.values)
 

Эта проблема, с которой я сталкиваюсь, заключается в том, что у нее будет одна из 3 проблем:

  1. Вызывает w1thermsensor.ошибки.Ошибка NoSensorFoundError
  2. Вызывает w1thermsensor.ошибки.Ошибка SensorNotReadyError
  3. Не возвращает значения в свойстве temp_c после вызова get_temperature()

Я изучил это немного подробнее, если я загружу IDLE в терминале с помощью команды ‘sudo python3’, я могу ввести следующие команды, и это работает без проблем:

 sudo python3
>>> from w1thermsensor import W1ThermSensor, Sensor
>>> import time
>>> temp_sensor = W1ThermSensor(Sensor.DS18B20)
>>> while True:
...    print(str(round(temp_sensor.get_temperature()))
...    time.sleep(2)
 

и он работает без проблем. Я также пробую команду ‘cat’

 cd /sys/bus/w1/devices
cd 28-3c01d607414b
cat w1_slave
94 01 55 05 7f a5 81 66 5b : crc=5b YES
94 01 55 05 7f a5 81 66 5b t=25250
 

Трассировка стека показывает, что она выдает ошибки при вызове функции W1Termsensor () в «init ()». Мой вопрос в том, является ли причиной проблемы мой код или реализация, или это что-то другое. Мой режим ожидания установлен на 2 секунды в надежде, что я просто поймаю его в середине обновления. Любая помощь была бы большой помощью.

Дополнительная информация:

  • DS18B20 подключен к отдельному источнику питания 5 В, конденсатор предназначен для стабилизации напряжения, поскольку на той же шине питания 5 В есть реле 5 В и светодиодная матрица.
     5v  ------------- ---------VCC------
                     |                  |
                   4.7 Kohm             |
                     |                  |
    GPIO4 ---------------------DQ       = 1uf polCap
                                        |
                                        |
                                        |
    GND ----------------------GND-------
 
  • Я дважды проверил, что у меня включен 1-проводной.

Комментарии:

1. возможно, этот вопрос более подходит для другого сайта StackExchange, raspberrypi.stackexchange.com

2. Спасибо, я выбрал этот, поскольку он в основном касается библиотеки Python и меньше касается самой raspberry pi, если я получу больше информации, указывающей на конкретную проблему, связанную с RPi, я удалю вопрос и отправлю его на предложенный вами сайт. Спасибо за эту информацию. Я просмотрю этот сайт, чтобы узнать, есть ли там уже ответ.

3. @Klaus D Спасибо за редактирование, я пытался включить его в код, но для меня это не сработало.