Есть ли лучший способ усреднить два входа датчика температуры?

#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)