'CR1000 - doughnut_lake.cr1 '9/29/2015 Joel Bailey '11/16/2015 Joel Bailey - added SR50, factory calibrations for Geokon 4500's, '11/17/2015 Joel Bailey - added Modem hold feature, changed thermistors to HalfBr, changed thermistors to 10 minutes per measurement '2/15/2016 Joel Bailey - changed Soil recorded data to degress C instead of milivolts '3/31/2016 Joel Bailey - added buble collector count for methane on PP2 '6/10/2016 Joel Bailey - added 4th Geokon 4500 to AVW200 (PB201, address 2), added sn and models of Geokons '9/16/2016 Joel Bailey - changed order of VW sensors '7/12/2017 Joel Bailey - changed the zero value calibration data for the VW sensors, the values were in the wrong order. '' Steinhart & Hart constants for PS302J2, calculated on host hayes: '' steinhart-hart-constants -10.00 16598.58 0.00 9795.00 10.00 5970.16 Const kA = 0.001393520 Const kB = 0.000238918 Const kC = 0.000000093 Const THERMISTOR_TYPE = "PS302J2" Const THERMISTOR_QTY = 12 Const R_REF_OHMS = 1000 Const SNW_MODL = "SR50A" Const SNW_SN = "" Const SNW_HT_CM = 191.5 Const SNW_SDI_ADDR = 0 Const SDI12__CP = 3 Const METHANE__PP = 2 Const VW_SENSOR_MODL = "Geokon 4500ALV-170kPa" Const VW_SN = "1320089" Const VW_2_SN = "1320087" Const VW_3_SN = "1320026" Const VW_4_SN = "1539088" 'Declare Variables and Units Public progSig As Long Dim MinIntoDay Public BattV Public FCLoaded Public PTemp_C Public Pb Public LCount Public therm(THERMISTOR_QTY), therm_R(THERMISTOR_QTY), therm_X(THERMISTOR_QTY) Public AVWRC Public VW(6) Public TT Public TT0 Public Digits Public Digits0 Public Lvl Public ZMode Public CAvg Public AVWRC_2 Public VW_2(6) Public TT_2 Public TT0_2 Public Digits_2 Public Digits0_2 Public Lvl_2 Public ZMode_2 Public CAvg_2 Public AVWRC_3 Public VW_3(6) Public TT_3 Public TT0_3 Public Digits_3 Public Digits0_3 Public Lvl_3 Public ZMode_3 Public CAvg_3 Public AVWRC_4 Public VW_4(6) Public TT_4 Public TT0_4 Public Digits_4 Public Digits0_4 Public Lvl_4 Public ZMode_4 Public CAvg_4 Public Atb Public At Public Rh Public SW12State As Boolean Public Mult(12)={1,1,1,1,1,1,1,1,1,1,1,1} Public Offs(12)={0,0,0,0,0,0,0,0,0,0,0,0} Public CS65X(3) Public CS65X_2(3) Public CS65X_3(3) Public Methane ' snow-sr50a: Public sr50_raw(2), sr50_down, snowdepth, sr50_height Public modem_hold As Boolean Alias sr50_raw(2) = sr50_quality Alias VW(1)=Freq Alias VW(2)=Amp Alias VW(3)=SNRat Alias VW(4)=NFreq Alias VW(5)=DRat Alias VW(6)=TR Alias VW_2(1)=Freq_2 Alias VW_2(2)=Amp_2 Alias VW_2(3)=SNRat_2 Alias VW_2(4)=NFreq_2 Alias VW_2(5)=DRat_2 Alias VW_2(6)=TR_2 Alias VW_3(1)=Freq_3 Alias VW_3(2)=Amp_3 Alias VW_3(3)=SNRat_3 Alias VW_3(4)=NFreq_3 Alias VW_3(5)=DRat_3 Alias VW_3(6)=TR_3 Alias VW_4(1)=Freq_4 Alias VW_4(2)=Amp_4 Alias VW_4(3)=SNRat_4 Alias VW_4(4)=NFreq_4 Alias VW_4(5)=DRat_4 Alias VW_4(6)=TR_4 Alias CS65X(1)=Sm10_VWC Alias CS65X(2)=Sm10_EC Alias CS65X(3)=Sm10_T Alias CS65X_2(1)=Sm20_VWC Alias CS65X_2(2)=Sm20_EC Alias CS65X_2(3)=Sm20_T Alias CS65X_3(1)=Sm40_VWC Alias CS65X_3(2)=Sm40_EC Alias CS65X_3(3)=Sm40_T Alias therm = st_5cm,st_10cm,st_15cm,st_30cm,st_50cm,st_70cm,st_90cm,st_110cm,st_135cm,st_150cm,st_175cm,st_200cm Alias therm_R = st_5cm_R,st_10cm_R,st_15cm_R,st_30cm_R,st_50cm_R,st_70cm_R,st_90cm_R,st_110cm_R,st_135cm_R,st_150cm_R,st_175cm_R,st_200cm_R Alias Lvl = DNP1_2_270.6CM Alias Lvl_2 = DNP1_0_62.5CM Alias Lvl_3 = DNP1_3_370.6CM Alias Lvl_4 = DNP1_1_170.6CM Units BattV=Volts Units PTemp_C=Deg C Units Pb=mbar Units therm_R() = Ohms Units therm() = degC Units TT=deg C Units TT0=deg C Units Digits=Digits Units Digits0=Digits Units Lvl=m Units TT_2=deg C Units TT0_2=deg C Units Digits_2=Digits Units Digits0_2=Digits Units Lvl_2=m Units TT_3=deg C Units TT0_3=deg C Units Digits_3=Digits Units Digits0_3=Digits Units Lvl_3=m Units Freq=Hz Units Amp=mV RMS Units NFreq=Hz Units TR=ohms Units Freq_2=Hz Units Amp_2=mV RMS Units NFreq_2=Hz Units TR_2=ohms Units Freq_3=Hz Units Amp_3=mV RMS Units NFreq_3=Hz Units TR_3=ohms Units Freq_4=Hz Units Amp_4=mV RMS Units NFreq_4=Hz Units TR_4=ohms Units Atb=Deg C Units At=Deg C Units Rh=% Units Sm10_VWC=m^3/m^3 Units Sm10_EC=dS/m Units Sm10_T=Deg C Units Sm20_VWC=m^3/m^3 Units Sm20_EC=dS/m Units Sm20_T=Deg C Units Sm40_VWC=m^3/m^3 Units Sm40_EC=dS/m Units Sm40_T=Deg C Units snowdepth=cm Units methane = tips 'Define Data Tables DataTable(HrlyDiag,True,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Minimum(1,BattV,FP2,False,False) Average(1,BattV,FP2,False) Average(1,PTemp_C,FP2,False) EndTable DataTable(HrlySoil,True,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Average(1,therm(1),FP2,False) Average(1,therm(2),FP2,False) Average(1,therm(3),FP2,False) Average(1,therm(4),FP2,False) Average(1,therm(5),FP2,False) Average(1,therm(6),FP2,False) Average(1,therm(7),FP2,False) Average(1,therm(8),FP2,False) Average(1,therm(9),FP2,False) Average(1,therm(10),FP2,False) Average(1,therm(11),FP2,False) Average(1,therm(12),FP2,False) Sample(1,Sm10_VWC,FP2) Sample(1,Sm10_EC,FP2) Sample(1,Sm10_T,FP2) Sample(1,Sm20_VWC,FP2) Sample(1,Sm20_EC,FP2) Sample(1,Sm20_T,FP2) Sample(1,Sm40_VWC,FP2) Sample(1,Sm40_EC,FP2) Sample(1,Sm40_T,FP2) EndTable DataTable(Met,True,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Average(1,At,FP2,False) Sample(1,Rh,FP2) Average(1,Atb,FP2,False) Average(1,Pb,FP2,False) Average(1,snowdepth,fp2,0) EndTable DataTable(Water,True,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Sample(1,Digits,IEEE4) Sample(1,Lvl,FP2) Sample(1,TT,FP2) Sample(1,Digits_2,IEEE4) Sample(1,Lvl_2,FP2) Sample(1,TT_2,FP2) Sample(1,Digits_3,IEEE4) Sample(1,Lvl_3,FP2) Sample(1,TT_3,FP2) Sample(1,Digits_4,IEEE4) Sample(1,Lvl_4,FP2) Sample(1,TT_4,FP2) EndTable DataTable(Daily,True,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Average(1,Pb,FP2,False) Average(1,At,FP2,False) Average(1,Atb,FP2,False) Average(1,snowdepth,FP2,False) EndTable ' SR50: base air-hc2s3 snow-sr50a DataTable(SR50,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Average(1,At,fp2,0) Average(1,snowdepth,fp2,0) Sample(1,sr50_height,fp2) Average(1,sr50_quality,fp2,0) EndTable ' Methane: Walter Bubbler DataTable(LakeMethane,1,-1) DataInterval(0,60,Min,0) Totalize(1,Methane,FP2,False) EndTable 'Calibration history table DataTable(CalHist,NewFieldCal,10) Sample(1,progSig,uint2) SampleFieldCal EndTable ' thermistors:calc_thermistors() Sub calc_thermistors() Dim j, lnR For j=1 To THERMISTOR_QTY '' calculate thermistor resistance from ratio and ref R: therm_R(j) = R_REF_OHMS * therm_X(j) / (1-therm_X(j)) '' calculate natural log of thermistor resistance: lnR = LN(therm_R(j)) '' use Steinhart & Hart equation to derive temperature: therm(j) = (1/(kA + kB*lnR + kC*lnR^3)) - 273.15 Next j EndSub 'Main Program BeginProg SerialOpen(Com3,38400,4,0,0) 'Initialize calibration variables for 'Geokon 4500 Series Vibrating Wire Piezometer calculation 'Lvl' CAvg=1 : Digits0=9810 : TT0=24.1 'Initialize calibration variables for 'Geokon 4500 Series Vibrating Wire Piezometer calculation 'Lvl_2' CAvg_2=1 : Digits0_2=9739 : TT0_2=24.3 SerialOpen(Com4,38400,4,0,0) 'Initialize calibration variables for 'Geokon 4500 Series Vibrating Wire Piezometer calculation 'Lvl_3' CAvg_3=1 : Digits0_3=9880 : TT0_3=22.6 'Initialize calibration variables for 'Geokon 4500 Series Vibrating Wire Piezometer calculation 'Lvl_4' CAvg_4=1 : Digits0_4=9673 : TT0_4=24.4 'Load the most recent calibration values from the CalHist table FCLoaded=LoadFieldCal(True) ' for base: progSig = status.ProgSignature ' for snow-sr50a: sr50_height = SNW_HT_CM ' start with modem_on modem_hold = 1 'Main Scan Scan(60,Sec,1,0) 'Default Datalogger Battery Voltage measurement 'BattV' Battery(BattV) 'Default Wiring Panel Temperature measurement 'PTemp_C' PanelTemp(PTemp_C,250) 'Geokon 4500 Series Vibrating Wire Piezometer measurement 'Freq' AVW200(AVWRC,Com3,0,200,VW(1),1,1,1,1000,4000,1,_60Hz,1,0) 'Calculate thermistor temperature 'TT' TT=1/(1.4051E-3+2.369E-4*LN(TR)+1.019E-7*LN(TR)^3)-273.15 'Calculate digits 'Digits' Digits=Freq^2/1000 'Calculate water level 'Lvl' (PSI) Lvl=(Digits0-Digits)*-.005636+(TT-TT0)*-0.002564 'Convert water level 'Lvl' from PSI to m Lvl=Lvl*-0.70432 'Zeroing calibration for 'Geokon 4500 Series Vibrating Wire Piezometer calculations 'Digits' and 'TT' FieldCal(4,Digits,1,0,Digits0,ZMode,0,1,CAvg) FieldCal(4,TT,1,0,TT0,ZMode,0,1,CAvg) 'Geokon 4500 Series Vibrating Wire Piezometer measurement 'Freq_2' AVW200(AVWRC_2,Com3,0,200,VW_2(1),2,1,1,1000,4000,1,_60Hz,1,0) 'Calculate thermistor temperature 'TT_2' TT_2=1/(1.4051E-3+2.369E-4*LN(TR_2)+1.019E-7*LN(TR_2)^3)-273.15 'Calculate digits 'Digits_2' Digits_2=Freq_2^2/1000 'Calculate water level 'Lvl_2' (PSI) Lvl_2=(Digits0_2-Digits_2)*-0.005690+(TT_2-TT0_2)*-.002527 'Convert water level 'Lvl_2' from PSI to m Lvl_2=Lvl_2*-0.70432 'Zeroing calibration for 'Geokon 4500 Series Vibrating Wire Piezometer calculations 'Digits_2' and 'TT_2' FieldCal(4,Digits_2,1,0,Digits0_2,ZMode_2,0,1,CAvg_2) FieldCal(4,TT_2,1,0,TT0_2,ZMode_2,0,1,CAvg_2) 'Geokon 4500 Series Vibrating Wire Piezometer measurement 'Freq_3' AVW200(AVWRC_3,Com4,0,201,VW_3(1),1,1,1,1000,4000,1,_60Hz,1,0) 'Calculate thermistor temperature 'TT_3' TT_3=1/(1.4051E-3+2.369E-4*LN(TR_3)+1.019E-7*LN(TR_3)^3)-273.15 'Calculate digits 'Digits_3' Digits_3=Freq_3^2/1000 'Calculate water level 'Lvl_3' (PSI) Lvl_3=(Digits0_3-Digits_3)*-0.007005+(TT_3-TT0_3)*-.003995 'Convert water level 'Lvl_3' from PSI to m Lvl_3=Lvl_3*-0.70432 'Zeroing calibration for 'Geokon 4500 Series Vibrating Wire Piezometer calculations 'Digits_3' and 'TT_3' FieldCal(4,Digits_3,1,0,Digits0_3,ZMode_3,0,1,CAvg_3) FieldCal(4,TT_3,1,0,TT0_3,ZMode_3,0,1,CAvg_3) 'Geokon 4500 Series Vibrating Wire Piezometer measurement 'Freq_4' AVW200(AVWRC_4,Com4,0,201,VW_4(1),2,1,1,1000,4000,1,_60Hz,1,0) 'Calculate thermistor temperature 'TT_4' TT_4=1/(1.4051E-3+2.369E-4*LN(TR_4)+1.019E-7*LN(TR_4)^3)-273.15 'Calculate digits 'Digits_4' Digits_4=Freq_4^2/1000 'Calculate water level 'Lvl_4' (PSI) Lvl_4=(Digits0_4-Digits_4)*-.005895+(TT_4-TT0_4)*-.002662 'Convert water level 'Lvl_4' from PSI to m Lvl_4=Lvl_4*-0.70432 'Zeroing calibration for 'Geokon 4500 Series Vibrating Wire Piezometer calculations 'Digits_4' and 'TT_4' FieldCal(4,Digits_4,1,0,Digits0_4,ZMode_4,0,1,CAvg_4) FieldCal(4,TT_4,1,0,TT0_4,ZMode_4,0,1,CAvg_4) 'Turn AM16/32 Multiplexer On and measure Soil Temps every 10 mins If TimeIntoInterval(0,10,min) Then PortSet(1,1) Delay(0,150,mSec) LCount=1 SubScan(0,uSec,THERMISTOR_QTY) 'Switch to next AM16/32 Multiplexer channel PulsePort(2,10000) 'Generic Single Ended Voltage measurements 'Therm_X()' on the AM16/32 Multiplexer BrHalf(therm_X(LCount),1,mv2500,1,Vx1,1,2500,False,0,250,Mult(LCount),Offs(LCount)) LCount=LCount+1 NextSubScan 'Turn AM16/32 Multiplexer Off PortSet(1,0) Delay(0,150,mSec) calc_thermistors() EndIf '109 Temperature Probe measurement 'Atb' Therm109(Atb,1,5,2,0,250,1,0) 'Turn SW12V Switch On PortSet(4,1) Delay(0,3,Sec) 'HC2S3 (SW12V switched power) Temperature & Relative Humidity Sensor measurements 'At' and 'Rh' VoltSe(At,1,mV2500,3,0,0,250,0.1,-50) VoltSe(Rh,1,mV2500,4,0,0,250,0.1,0) If Rh>100 AND Rh<103 Then Rh=100 'CS106 Barometric Pressure Sensor measurement 'Pb' VoltSe(Pb,1,mV2500,7,1,0,250,0.240,500) 'Turn SW12V Switch Off PortSet(4,0) 'Default Wiring Panel Temperature measurement 'PTemp_C' PanelTemp(PTemp_C,250) 'CS650/655 Water Content Reflectometer measurements 'Sm10_VWC', 'Sm10_EC', and 'Sm10_T' If TimeIntoInterval(0,1,Hr) Then SDI12Recorder(CS65X(),SDI12__CP,"1","M!",1,0) EndIf 'CS650/655 Water Content Reflectometer measurements 'Sm20_VWC', 'Sm20_EC', and 'Sm20_T' If TimeIntoInterval(0,1,Hr) Then SDI12Recorder(CS65X_2(),SDI12__CP,"2","M!",1,0) EndIf 'CS650/655 Water Content Reflectometer measurements 'Sm40_VWC', 'Sm40_EC', and 'Sm40_T' If TimeIntoInterval(0,1,Hr) Then SDI12Recorder(CS65X_3(),SDI12__CP,"3","M!",1,0) EndIf ' snow-sr50a: '' read SR50A snow depth sensor: '' read distance in m (positive) and quality number into sr50_raw() '' make distance down negative, convert to cm '' apply correction for speed of sound as f(temperature, 0C) '' calculate snow depth as sum of sensor height and distance down '' SDI12Recorder(sr50_raw, SDI12__CP, SNW_SDI_ADDR, "M1!", 1, 0) sr50_raw = sr50_raw * -100.0 sr50_down = sr50_raw * SQR((At+273.15) / 273.15) snowdepth = sr50_height + sr50_down ' Methane bubbler PulseCount(Methane,1,METHANE__PP,2,0,1,0) 'SW12 Timed Control - RF450 Control 'Get minutes into current day MinIntoDay=Public.TimeStamp(4,1)/60 'Turn ON SW12 for 15 minutes every 60 minutes If (MinIntoDay MOD 60 < 15) Then SW12State=True 'Turn OFF SW12 only if time runs out and RS232 is not active ElseIf (ComPortIsActive(ComRS232)=False AND NOT modem_hold) Then SW12State=False EndIf 'Always turn OFF SW12 if battery drops below 12.6 volts If BattV<12.6 Then SW12State=False 'Set SW12 to the state of 'SW12State' variable SW12(SW12State) 'Call Data Tables and Store Data CallTable HrlyDiag CallTable HrlySoil CallTable Met CallTable Water CallTable Daily CallTable CalHist CallTable SR50 CallTable LakeMethane NextScan EndProg