Я новичок и получаю эту ошибку, когда запускаю свой код в main_odroid.py:
'NameError: имя' alarmthresh5 'не определено'
Когда я запускаю этот код :
from threading import Thread
def func3():
Import main_odroid
global alarmthresh5
alarmthresh5 = 1.45 * stddev2
[...]
if floats[1] > alarmthresh5:
wpi.digitalWrite(1, 1)
[...]
Thread(target = func3).start()
[...]
[...] означает остаток (нерелевантного) кода, который я исключил для ясности.
Я использовал функцию поиска и пробовал разные ответы, но это не помогло проблема. Спасибо, и я заинтересован в ваших ответах.
РЕДАКТИРОВАТЬ: область действия переменной alarmthresh5 является глобальной, я думаю, потому что я набрал 'global alarmthresh5' в func3.
EDIT2: Весь код
import subprocess
from subprocess import Popen, PIPE
import os
import odroid_wiringpi as wpi
from collections import deque
import time
import datetime
from threading import Thread
from math import sqrt
sysdamping = 10
freqdamping = 14
totalbins = 2000
#Functions
def average(p): return sum(p) / float(len(p))
def variance(p): return list(map(lambda x: (x - average(p))**2, p))
def std_dev(p): return sqrt(average(variance(p)))
wpi.wiringPiSetup()
wpi.pinMode(1, 1)
wpi.pinMode(5, 1)
wpi.pinMode(27, 1)
wpi.pinMode(31, 1)
wpi.pinMode(23, 1)
wpi.pinMode(11, 1)
wpi.digitalWrite(23, 0)
wpi.digitalWrite(11, 0)
wpi.pinMode(2, 1)
wpi.pinMode(7, 1)
wpi.digitalWrite(2, 0)
wpi.digitalWrite(7, 0)
wpi.pinMode(9, 1)
wpi.digitalWrite(9, 0)
time.sleep(0.1)
wpi.pullUpDnControl(30, 2)
os.system("killall -9 soapy_power -q")
time.sleep(0.1)
def func2():
exec(open("/home/odroid/rtl-power-fftw/build/deactiveer.py").read())
def func3():
import main_odroid
global alarmthresh1
global alarmthresh2
global alarmthresh3
global alarmthresh4
global alarmthresh5
global Lijst
alarmthresh1 = (average(rolling[i]) + 1.45 * stddev2)
alarmthresh2 = alarmthresh1 + 2
alarmthresh3 = alarmthresh2 + 2
alarmthresh4 = alarmthresh3 + 2
alarmthresh5 = alarmthresh4 + 2
Lijst = [381843000.0, 382242000.0, 382245000.0, 382248000.0, 382254000.0, 382257000.0, 382305000.0, 382308000.0, 382320000.0, 382323000.0, 382326000.0, 382389000.0, 382392000.0, 382557000.0, 382560000.0, 382671000.0, 383157000.0, 383454000.0, 383457000.0, 383469000.0, 383472000.0, 383997000.0, 384000000.0, 384003000.0, 384006000.0]
def func4():
import main_odroid
global stddev2
stddev2 = std_dev(sweep)
def func1():
cmd = ["/home/odroid/.local/bin/soapy_power", "-f", "433M", "-r", "6M", "--force-rate", "-q", "-c", "-b", "2000", "-F", "rtl_power_fftw"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1)
rolling = []
i = 0
rolling_avg = deque([])
sweep = deque([], maxlen=1500)
stddev = 12
totalbins = 2000
# Let's see what's going on with rtl_power_fftw
for line in iter(p.stdout.readline, b''):
#Ignore garbage output
if not (b'#' in line or not line.strip()):
floats = list(map(float, line.split()))
# Create 2D array
if len(rolling) < totalbins:
rolling.append(deque([]))
rolling[i].append(floats[1])
sweep.append(floats[1])
# Let's start filtering...
if len(rolling[i]) >= freqdamping:
rolling[i].popleft()
print("ref 5")
input_state3 = wpi.digitalRead(9)
if floats[1] > alarmthresh5 and 380820000.0 < floats[0] < 384570000.0 and floats[0] not in Lijst: # Led 5
wpi.digitalWrite(1, 1)
if input_state3 == 0:
wpi.digitalWrite(9, 1) # Buzzer proxy
wpi.digitalWrite(31, 1) # Buzzer ON
print(round(floats[0]), round(floats[1]), alarmthresh5, "ref2")
Thread(target = func2).start()
if floats[1] > alarmthresh1 and floats[0] in [380310000.0, 381444000.0, 381579000.0, 381780000.0, 381783000.0, 382110000.0, 382836000.0, 382881000.0, 382884000.0, 382887000.0, 382890000.0, 382893000.0, 383037000.0, 383085000.0, 383340000.0, 383460000.0, 384258000.0, 384261000.0, 384264000.0]:
if input_state3 == 0:
wpi.digitalWrite(9, 1) # Buzzer proxy
wpi.digitalWrite(31, 1) # Buzzer ON
print(round(floats[0]), round(floats[1]), alarmthresh1, "ref1")
Thread(target = func2).start()
if floats[1] > alarmthresh4 and 380820000.0 < floats[0] < 384570000.0 and floats[0] not in Lijst: # Led 4
wpi.digitalWrite(7, 1)
if floats[1] > alarmthresh3 and 380820000.0 < floats[0] < 384570000.0 and floats[0] not in Lijst: # Led 3
wpi.digitalWrite(23, 1)
if floats[1] > alarmthresh2 and 380820000.0 < floats[0] < 384570000.0 and floats[0] not in Lijst: # Led 2
wpi.digitalWrite(5, 1)
if floats[1] > alarmthresh1 and 380820000.0 < floats[0] < 384570000.0 and floats[0] not in Lijst: # Led 1
input_state = wpi.digitalRead(27)
if input_state == 0:
wpi.digitalWrite(27, 1)
Thread(target = func2).start()
# Increment or reset indexer (i)
if i < totalbins - i: i = i + 1
else:
i = 0
Thread(target = func4).start() # Set stddev2
Thread(target = func3).start() # Set alarmthresh1 - alarmthresh5
print("ref 6")
p.stdout.close()
p.wait()
Thread(target = func1).start()
Ссылка 6 печатается до ссылки 5, поэтому func3 запускается до вызова alarmthresh5.