import pyvisa import os.path import sys import os import csv import datetime import bme280 import time import smbus2 NUMMEAS = 1 NUMSAMPLES = 4 NUMCHANNELS = 7 NULLINGCHANNEL = 7 SCANNERSLOT = 2 AUTOZERO = 1 ENVMON = 0 BASESAVENAME = "Prod_VoltageBankLog_Ch" bus = smbus2.SMBus(1) calibration_params = bme280.load_calibration_params(bus, 0x76) rm = pyvisa.ResourceManager() inst2 = rm.open_resource('GPIB0::18::INSTR') # Meter inst1 = rm.open_resource('GPIB0::9::INSTR') # Scanner def openCloseGPIB(openClose): global GPIB global inst1 global inst2 if openClose == "close": inst1.close() inst2.close() elif openClose == "open": inst2 = rm.open_resource('GPIB0::18::INSTR') # Meter inst1 = rm.open_resource('GPIB0::9::INSTR') # Scanner def getEnvironment(instObj, i2cbus): value = instObj.sample(i2cbus, 0x76, calibration_params) return value def closeChannel(instObj, scannerCardSlot, channel): print("----- Closing channel: "+str(f"{channel:02}")+" on slot: "+str(scannerCardSlot)+" -----") instObj.write("CLOSE "+str(scannerCardSlot)+str(f"{channel:02}")) def openChannel(instObj, scannerCardSlot, channel = 9): if channel >= 9: print("----- Opening All Channels -----") instObj.write("RESET") else: print("----- Opening channel: "+str(f"{channel:02}")+" on slot: "+str(scannerCardSlot)+" -----") instObj.write("OPEN "+str(scannerCardSlot)+str(f"{channel:02}")) def readNVM(instObj): # dummy reading for auto range instObj.write("MOD=VDC:RAN=AUTO:NI=5")# DCV, AUTO RANGE, 5.5 digits instObj.write("MEAS=SI") time.sleep(2) instObj.write("NI=8")# 8.5 digits output = [] # Set amount of samples for i in range(NUMSAMPLES): time.sleep(1) instObj.write("MEAS=SI") time.sleep(110*(AUTOZERO+1)) out = instObj.read() print(out) output.append(instObj.read()) 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("DIS=ON") inst2.write("HISTORY,CLEAR") time.sleep(3) inst2.write("MOD=VDC:RAN=10:NI=8")# 10VDC RANGE, 8.5 digits inst2.write("MEAS=CON") inst2.write("DELI=END") # Delimeter set to END inst2.write("OUTPUT,GP-IB,ON") # Sets output via GPIB inst2.write("DR=OFF") # Turns Drift Correction OFF if AUTOZERO: inst2.write("DR=ON") # Turns Drift Correction ON # Scanner setup inst1.write("RESET") inst1.write("CRESET 2") inst1.write("CRESET 3") readings = [] for i in range(NUMCHANNELS): # get the nulled channel value closeChannel(inst1, SCANNERSLOT, i+10) print("NULLING...") nullMeanStatsA = [] nullStddevStatsA = [] for nulling in range(NUMMEAS): nullReadingsA = readNVM(inst2) nullMeanA, nullStddevA = getMeanSTDev(nullReadingsA) nullMeanStatsA.append(nullMeanA) nullStddevStatsA.append(nullStddevA) nullMeanStats = [] nullMeanStatsB = [] nullStddevStatsB = [] openChannel(inst1, SCANNERSLOT, i+10) closeChannel(inst1, SCANNERSLOT, i) print("REVERSING...") for nulling in range(NUMMEAS): nullReadingsB = readNVM(inst2) nullMeanB, nullStddevB = getMeanSTDev(nullReadingsB) nullMeanStatsB.append(nullMeanB) nullStddevStatsB.append(nullStddevB) openChannel(inst1, SCANNERSLOT, i) nullMeanStats = nullMeanStatsB - nullMeanStatsA # read value closeChannel(inst1, SCANNERSLOT, i) print("READING VALUE...") MeanStats = [] StddevStats = [] for nulling in range(NUMMEAS): Readings = readNVM(inst2) Mean, Stddev = getMeanSTDev(Readings) MeanStats.append(Mean) StddevStats.append(Stddev) openChannel(inst1, SCANNERSLOT, i) # compensate for nulling meanNull, x = getMeanSTDev(nullMeanStats) x, stddevNull = 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()