Даже после того, как я объявляю переменные глобальными, я получаю эту ошибку, поскольку глобальное имя не определено. Я не уверен, что если бы я объявила переменную глобальной в правильном месте.Python: Не удается разрешить глобальную ошибку переменной
Что я пытаюсь сделать в этой программе из функции lux() Я прочитал необработанные данные с датчика в var. Исходные данные датчика имеют два значения: яркость и ИК. Я назначаю их channel0 и channel1 соответственно. В функции getLux() я использую channel0 и channel1 для вычисления значений усиления.
Пожалуйста, помогите мне решить эту ошибку
#!/usr/bin/python
import time
import smbus
from smbus import SMBus
address = 0x39
control = 0x03
tsl = SMBus(1)
pause = 0.08
def lux():
#global channel0
#global channel1
print "Workking"
tsl.write_byte(address, 0x80)
tsl.write_byte(address, control)
var = [0, 0, 0, 0]
var = tsl.read_i2c_block_data(0x39, 0x8d)
channel0 = ((var[1]<<8) + var[0])
channel1 = ((var[3]<<8) + var[2])
print "total light %5d IR light %5d" % (channel0, channel1)
time.sleep(2)
return (channel0, channel1)
def setGain(gain):
if (gain == 1):
tsl.write_byte_data(address, 0x81, 0x01)
elif (gain == 16):
tsl.write_byte_data(address, 0x81, 0x11)
time.sleep(pause)
def getLux(gain):
global channel0
global channel1
if (gain == 1 or gain == 16):
setGain(gain)
ambient = lux(channel0)
IR = lux(channel1)
elif (gain == 0):
setGain(16) #first try high gain
ambient = channel0
if (ambient < 65535):
IR = channel1
if (ambient >= 65535):
setGain(1) #set low gain
ambient = channel0
IR = channel1
if (gain == 1):
ambient *= 16 #scale 1x to 16x
IR *= 16
if (float(ambient == 0)):
ratio = 9999
else:
ratio = (IR/float(ambient))
if (ratio >= 0) & (ratio <= 0.52):
tlux = (0.0315 * ambient) - (0.0593 * ambient * (ratio**1.4))
elif (ratio <= 0.65):
tlux = (0.299 * ambient) - (0.0291 * IR)
elif (ratio <= 0.80):
tlux = (0.0157 * ambient) - (0.018 * IR)
elif (ratio <= 1.3):
tlux = (0.00338 * ambient) - (0.0026 * IR)
elif (ratio > 1.3):
tlux = 0
return tlux
while True:
print "LUX High Gain ", getLux(16)
print "LUX Low Gain ", getLux(1)
print "LUX AUTO Gain ", getLux()
Traceback (most recent call last): File "lux2.py", line 85, in <module> print "LUX High Gain ", getLux(16) File "lux2.py", line 45, in getLux ambient = lux(channel0) NameError: global name 'channel0' is not defined
Hi Rafael, благодарит за ответ. Без использования глобального значения, как я могу вызвать значения channel0 и channel1 из функции lux() для функции getlux()? – Rao
Проблема в том, что вы используете 'channel0' как в функциях 'lux', так и' getLux'. На самом деле это трудно понять. Когда вы вызываете 'ambient = lux (channel0)' в getLux, у вас пока нет значения для channel0. Что означает channel0? 'lux()' объявляется, поскольку ему не нужен какой-либо параметр, однако вы все равно называете его lux (channel0). Это не имеет смысла. Не могли бы вы попытаться отредактировать свой пост, объяснив, что означает эта переменная? – RafaelC
Я редактировал свое сообщение, объясняя, что я пытаюсь сделать. – Rao