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