#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 проблем:
- Вызывает w1thermsensor.ошибки.Ошибка NoSensorFoundError
- Вызывает w1thermsensor.ошибки.Ошибка SensorNotReadyError
- Не возвращает значения в свойстве 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 Спасибо за редактирование, я пытался включить его в код, но для меня это не сработало.