From 0a4dcca1c6a5c2f4a2ce366dec05715fd24910e4 Mon Sep 17 00:00:00 2001 From: xans Date: Sun, 16 Feb 2025 22:49:36 +0100 Subject: [PATCH] Upload files to "/" --- NV-Scan.py | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 NV-Scan.py diff --git a/NV-Scan.py b/NV-Scan.py new file mode 100644 index 0000000..41aeb0b --- /dev/null +++ b/NV-Scan.py @@ -0,0 +1,143 @@ + +import time +import os +import GPIBPrologix +import csv +import datetime +import bme280 +import smbus2 + +NUMMEAS = 3 +NUMSAMPLES = 20 +NUMCHANNELS = 7 +NULLINGCHANNEL = 7 +SCANNERSLOT = 2 +BASESAVENAME = "Prod_VoltageBankLog_Ch" + +bus = smbus2.SMBus(1) +calibration_params = bme280.load_calibration_params(bus, 0x76) +GPIB = GPIBPrologix.ResourceManager("/dev/ttyACM0") +inst2 = GPIB.open_resource(29) +inst1 = GPIB.open_resource(28) + +def openCloseGPIB(openClose): + global GPIB + global inst1 + global inst2 + if openClose == "close": + GPIB.close + elif openClose == "open": + GPIB = GPIBPrologix.ResourceManager("/dev/ttyACM0") + inst2 = GPIB.open_resource(29) + inst1 = GPIB.open_resource(28) + +def getEnvironment(instObj, i2cbus): + value = instObj.sample(i2cbus, 0x76, calibration_params) + return value + +def closeChannel(instObj, scannerCardSlot, channel): + print("----- Closing channel: "+str(channel)+" on slot: "+str(scannerCardSlot)+" -----") + instObj.write(":ROUTe:CLOSe (@ "+str(scannerCardSlot)+"!"+str(channel)+")") + +def openChannel(instObj, scannerCardSlot, channel = 9): + if channel >= 9: + instObj.write(":ROUTe:OPEN ALL") + +def readNVM(instObj): + # dummy reading for auto range + instObj.write("I1,"+str(1)+"X") + instObj.write("H0X") + time.sleep(2) + print("Selected range from dummy reading: ") + # Set amount of samples + instObj.write("I1,"+str(NUMSAMPLES)+"X") + instObj.write("H0X") + #openCloseGPIB("close") + time.sleep(NUMSAMPLES*0.55) + #openCloseGPIB("open") + instObj.write("F2X") + output = instObj.read().split(',') + output = map(float, output) + return (list(output)) + +def getMeanSTDev(values): + mean = sum(values)/len(values) + variance = sum([(x - mean) ** 2 for x in values]) / (len(values) - 1) + stddev = variance ** 0.5 + #print(mean,variance,stddev) + return mean, stddev + +# NVM Setup +inst2.write("R0B1X") # auto range +inst2.write("K2X") +inst2.write("O0P0N0W0X") +inst2.write("S2X") +inst2.write("T8X") #manual trigger +inst2.write("F2X") #All readings from buffer +inst2.write("G0X") +inst2.write("W1000X") #1s trigger delay + +# Scanner setup +inst1.write("*RST") +inst1.write(":ROUTe:CONFigure:SLOT1:CTYPe C7058") +inst1.write(":ROUTe:CONFigure:SLOT2:CTYPe C7168") +inst1.write(":ROUTe:CONFigure:SLOT2:POLE 2") +inst1.write(":ROUTe:OPEN ALL") +inst1.write(":DISP:ENAB 1") +inst1.write(":DISP:WIND1:TEXT:DATA ' '") +inst1.write(":DISP:WIND1:TEXT:STAT 1") +inst1.write(":DISP:WIND2:TEXT:DATA ' '") +inst1.write("DISP:WIND2:TEXT:STAT 1") + +readings = [] + +for i in range(NUMCHANNELS): + # get the nulled channel value + closeChannel(inst1, SCANNERSLOT, NULLINGCHANNEL) + print("NULLING...") + nullMeanStats = [] + nullStddevStats = [] + for nulling in range(NUMMEAS): + nullReadings = readNVM(inst2) + nullMean, nullStddev = getMeanSTDev(nullReadings) + nullMeanStats.append(nullMean) + nullStddevStats.append(nullStddev) + openChannel(inst1, SCANNERSLOT, 9) + + # read value + closeChannel(inst1, SCANNERSLOT, i+1) + MeanStats = [] + StddevStats = [] + for nulling in range(NUMMEAS): + Readings = readNVM(inst2) + Mean, Stddev = getMeanSTDev(Readings) + MeanStats.append(Mean) + StddevStats.append(Stddev) + openChannel(inst1, SCANNERSLOT, 9) + + # compensate for nulling + meanNull, x = getMeanSTDev(nullMeanStats) + stddevNull, x = getMeanSTDev(nullMeanStats) + meanMeas, x = getMeanSTDev(MeanStats) + stddevMeas, x = getMeanSTDev(StddevStats) + meanCompensated = meanMeas - meanNull + stddevCompensated = stddevMeas + stddevNull + d = datetime.datetime.now() + dx = d - datetime.timedelta(microseconds=d.microsecond) + data = getEnvironment(bme280, bus) + fields=[dx.strftime("%d-%m-%y %H:%M:%S"),i+1,round(meanNull,10),round(stddevNull,10),round(meanMeas,10),round(stddevMeas,10),round(meanCompensated,10),round(stddevCompensated,10),round(data.humidity,2),round(data.temperature,2),round(data.pressure,2)] + print(fields) + + if not os.path.exists("data/"): + os.makedirs("data/") + if not os.path.exists("data/"+BASESAVENAME+str(i+1)+".csv"): + with open("data/"+BASESAVENAME+str(i+1)+".csv", 'w') as file: + file.writelines("DateTime;Channel;NullingMean;NullingStddev;MeasuredMean;MeasuredStddev;CompensatedMean;CompensatedStddev;EnvHumidity;EnvTemperature;EnvPressure") + else: + with open("data/"+BASESAVENAME+str(i+1)+".csv", 'a') as f: + writer = csv.writer(f) + writer.writerow(fields) +#inst1.write(":DISP:ENAB 0") +inst2.write("A1,''X") +#inst1.write(":DISP:TEXT:STAT 0") +GPIB.close()