#python #function #if-statement #average #sensors
#python #функция #if-оператор #среднее #датчики
Вопрос:
Я создаю верхнюю консоль для своей машины. Я хочу отображать температуру снаружи, используя средние показания двух датчиков температуры. В настоящее время я использую библиотеку Timo и могу получать значения температуры от каждого датчика. Когда я пытаюсь усреднить или преобразовать значения температуры, при запуске кода ничего не происходит, за исключением мигающего курсора. Я новичок в python.
Я попытался скорректировать свои определения, порядок, в котором вводятся операторы, я изменил расположение операторов внутри операторов if на внешнее. Надеюсь, это то, что я пропустил. Заранее приношу извинения, если мой вопрос неправильно отформатирован.
import os
import time
import serial
from w1thermsensor import W1ThermSensor
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
#---------------------------------------------------------
# Define the function to convert Celsius to Fahrenheit
#---------------------------------------------------------
def CelsiusToFahrenheit(TempCelsius):
TempFahrenheit = ((TempCelsius*9)/5) 32
return TempFahrenheit
#----------------------------------------------------------
# Define function to Average Outside Temperature in Fahrenheit
#----------------------------------------------------------
def OutsideTempAvg(A, B):
OutsideTemp = (A B)/2
return OutsideTemp
#----------------------------------------------------------
# Set Pointer to W1ThermSensor object
#----------------------------------------------------------
TmpSensor = W1ThermSensor()
#----------------------------------------------------------
# Define Sensors by ID
#----------------------------------------------------------
Fsensor = '03079779c963'
Rsensor = '03159779fe5a'
Isensor = '030797799182'
#----------------------------------------------------------
# Loop Through Available Sensors Identify and Assign
#----------------------------------------------------------
while True:
for TmpSensor in W1ThermSensor.get_available_sensors():
CurSensorID = TmpSensor.id
CurTempC = round(float(TmpSensor.get_temperature()),1)
if CurSensorID == Fsensor:
FtempC = CurTempC
elif CurSensorID == Rsensor:
RtempC = CurTempC
elif CurSensorID == Isensor:
ItempC = CurTempC
else:
print("Unexpected Sensor = " CurSensorID)
print("Temp = " str(FtempC))
print("Temp = " str(RtempC))
print("Temp = " str(ItempC))
#----------------------------------------------------------------
# Average and Convert Celsius to Fahrenheit
#----------------------------------------------------------------
OtempC = round(float(OutsideTempAvg(FtempC, RtempC)))
OtempF = round(float(CelsiusToFahrenheit(OtempC)))
FtempF = round(float(CelsiusToFahrenheit(FtempC)))
RtempF = round(float(CelsiusToFahrenheit(RtempC)))
ItempF = round(float(CelsiusToFahrenheit(ItempC)))
#-----------------------------------------------------------------
# Print for testing - Final will be sent to HMI display over Serial
#------------------------------------------------------------------
print("Outside Temperature = " str(OtempF) " Fahrenheit")
print("Inside Temperature = " str(ItempF) " Fahrenheit")
#---------------------------------------------------------------------
# Reset time - Final will be 5 minutes
#----------------------------------------------------------------------
time.sleep(5.0)
Я хочу иметь возможность печатать показания, как в C, так и в F, от каждого датчика и среднее значение от двух из них (Fsensor и Rsensor). В конечном итоге я отправлю результаты из последовательного интерфейса Pi на ЖК-дисплей HMI.
Комментарии:
1. Среднее значение — это среднее значение, которое у вас есть, это лучшее, что вы получите.
Ответ №1:
Я думаю, у вас проблема с отступом:
while True:
for sensor in W1ThermSensor.get_available_sensors():
if some_condition:
pass
elif some_other_condition:
pass
else: # unreal case just to handle all possible cases
print('this is not printed when everything is ok')
calculcate1() # this function is called only if above is printed!
calculate2() # <-- move all calculation to the same level as "for" loop.
примечание сбоку:
- Python позволяет инициализировать переменные по ходу работы, но вы несете ответственность за инициализацию переменных перед доступом! Если предположить, что Rsensor недоступен в цикле «for», ваш RtempC никогда не будет инициализирован. Чтобы решить эту проблему — просто создайте переменные заранее.
Ответ №2:
Вы абсолютно правы, вот что я придумал.
while True:
for TmpSensor in W1ThermSensor.get_available_sensors():
CurSensorID = TmpSensor.id
CurTempC = round(float(TmpSensor.get_temperature()),1)
CurTempF = round(float(TmpSensor.get_temperature(W1ThermSensor.DEGREES_F)),1)
if CurSensorID == Fsensor:
FtempC = CurTempC
FtempF = CurTempF
# print("F-Temp = " str(FtempC) " C" ", " str(FtempF) " F")
elif CurSensorID == Rsensor:
RtempC = CurTempC
RtempF = CurTempF
# print("R-Temp = " str(RtempC) " C" ", " str(RtempF) " F")
elif CurSensorID == Isensor:
ItempC = CurTempC
ItempF = round(float(CurTempF))
# print("I-Temp = " str(ItempC) " C" ", " str(ItempF) " F")
else:
print("Unexpected Sensor = " CurSensorID)
#----------------------------------------------------------------
# Average and Convert Celsius to Fahrenheit
#----------------------------------------------------------------
OtempC = round(float(OutsideTempAvg(FtempC, RtempC)))
OtempF = round(float(OutsideTempAvg(FtempF, RtempF)))
#-----------------------------------------------------------------
# Print for testing - Final will be sent to HMI display over Serial
#------------------------------------------------------------------
print("Outside Temperature = " str(OtempF) " Fahrenheit")
print("Inside Temperature = " str(ItempF) " Fahrenheit")
#---------------------------------------------------------------------
# Reset time - Final will be 5 minutes
#----------------------------------------------------------------------
time.sleep(60.0)