'atks1.cr1 'CR1000 Series 'Created by Short Cut (4.0) '06-15-2021 - Modified by Joel Bailey '08-18-2021 - Modified on site '08-10-2022 - Added timed Camera power control, installed SW12 on CP4 to turn camera on/off at 59/02 mins '08-19-2022 - Changed SR50A to multiple measurements Const PT_PSI_TO_CM = 70.377285 'Constants ConstTable Const PAKBUS_INFO = 392 Const P_MODL = "TE525M" Const P_SN = "xx" Const P_TIP = 0.1 Const P_UNITS = "mm" Const P_PP = 1 Const RH_RELAY_CP = 2 Const RH_MODL = "HC2S3" Const RH_SN = "XX" Const RH_MULT = 0.1 Const RH_OFS = 0 Const AT_MULT = 0.1 Const AT_OFS = -40 Const AT_SE = 1 Const RH_SE = 2 Const WS_MODL = "RMY 05108" Const WS_UNITS = "m/s" Const WS_MULT = 0.1666 Const WD_UNITS = "deg" Const WD_OFS = 0 Const WD_MULT = 355 Const WS_PP = 2 Const WD_SE = 8 Const WD_EX = Vx1 Const PB_MODL = "CS106" Const PB_SN = "XX" Const PB_UNITS = "mBar" Const PB_MULT = 0.240 Const PB_OFS = 500 Const PB_SE = 3 Const PB_EN_CP = 1 Const NR_MODL = "NR-LITE2" Const NR_SN = "xx" Const NR_CALIB = 14.3 Const NR_CALIB_UNITS = "uV/W/m^2" Const NR_UNITS = "W/m^2" Const NR_DIFF = 3 Const SNW_MODL = "SR50AH" Const SNW_SN = "XX" Const SNW_HT_CM = 153.3 Const SNW_SDI_ADDR = "0" Const SNW_SDI12_CP = 3 Const MODM_MODL = "RF451" Const MODM_SN = "XX" Const MODM_ON_MIN = 0 Const MODM_OFF_MIN = 15 Const MODM_PERIOD = 60 Const MODM_V_LIM = 12.0 Const CAM_TRIG_CP = 6 Const CAM_MODL = "CCFC" Const CAM_SN = "1292" Const CAM_COM_CP = Com4 Const CAM_PWR_CP = 4 Const CAM_ON_MIN = 57 Const CAM_OFF_MIN = 3 Const CAM_PERIOD = 60 Const CAM_V_LIM = 12.0 Const PT_MODL = "INW AquiStar PT12" Const PT1_SN = "?" Const PT2_SN = "?" Const PT1_SDI_ADDR = 1 Const PT2_SDI_ADDR = 2 Const SDI12__CP = 5 EndConstTable 'Declare Variables and Units Public progSig As Long Public BattV Public PTemp_C Public AT Public RH Public PB Public P Public WS Public WD Public SW12State As Boolean Public SW12_2State As Boolean Public NR_raw Public NR ' pt-aquistar: Public pt1(3), pt2(3) Alias pt1 = pt1stage, pt1temp, pt1batt Alias pt2 = pt2stage, pt2temp, pt2batt Units pt1stage = cm Units pt2stage = cm Units pt1temp = degC Units pt2temp = degC Units pt1batt = Volts Units pt2batt = Volts Public SR50A_M(2) 'Single measured values. Alias SR50A_M(1) = MDT : Units MDT = meters 'Distance from the SR50AT. Alias SR50A_M(2) = MQ : Units MQ = unitless 'Quality number. 'Array to hold 11 SR50AT measurements composed of a distance and 'quality number, and air temperature. Public SR50A(11,2) 'Sorted array of 11 SR50AT measurements composed of a distance and 'quality number, and temperature. Measurements are sorted by the 'distance value from smallest to largest. Public Result_SR50A(11,2) Public TCDT : Units TCDT = m 'Temperature corrected distance Public Q : Units Q = unitless 'Quality number Public DT: Units DT = cm ' same as TCDT except in cm Public SD : Units SD = cm 'snow depth Public Initial_Dist : Units Initial_Dist = cm 'Controls SR50AT measurement. This flag can be manually controlled to 'run tests in the field or is automatically set 2 minutes before the 'hourly data storage interval. This is done so 11 measurements can 'be made and sorted before the values are stored. Public SR50ACtrl As Boolean 'Set this flag to measure and store the initial distance from the 'SR50AT to the ground. Public SR50A_MID As Boolean Dim n 'used as a counter Units BattV=Volts Units PTemp_C=Deg C Units AT=Deg C Units RH=% Units PB=mbar Units P=mm Units WS=meters/second Units WD=degrees Units NR_raw=W/m^2 Units NR=W/m^2 'Define Data Tables DataTable(HrlyAtms,1,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Totalize(1,P,FP2,False) Sample(1,AT,FP2) Average(1,AT,FP2,False) Minimum(1,AT,FP2,False,False) Maximum(1,AT,FP2,False,False) Sample(1,RH,FP2) Minimum(1,RH,FP2,False,False) Maximum(1,RH,FP2,False,False) Sample(1,WS,FP2) Sample(1,WD,FP2) WindVector(1,WS,WD,FP2,False,0,0,0) FieldNames("WS_S_WVT,WD_D1_WVT,WD_SD1_WVT") Maximum(1,WS,FP2,False,False) Sample(1,PB,IEEE4) Average(1,PB,IEEE4,False) Average(1,NR,FP2,False) Average(1,SD,FP2,False) EndTable DataTable(Daily,1,-1) DataInterval(0,1440,Min,10) Sample(1,progSig,uint2) Minimum(1,BattV,FP2,False,False) Totalize(1,P,FP2,False) Average(1,AT,FP2,False) Average(1,WS,FP2,False) WindVector(1,WS,WD,FP2,False,0,0,0) FieldNames("WS_S_WVT,WD_D1_WVT,WD_SD1_WVT") Average(1,NR,FP2,False) Average(1,SD,FP2,False) EndTable DataTable(HrlyDiag,1,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Sample(1,BattV,FP2) Average(1,BattV,FP2,False) Minimum(1,BattV,FP2,False,False) Sample(1,PTemp_C,FP2) Average(1,PTemp_C,FP2,False) EndTable ' Hydro: base pt-aquistar turbidity-obs500 DataTable(Hydro,1,-1) DataInterval(0,15,Min,0) Sample(1,progSig,uint2) Average(1,pt1stage,fp2,0) Average(1,pt1temp,fp2,0) Average(1,pt2stage,fp2,0) Average(1,pt2temp,fp2,0) EndTable DataTable(MET,1,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Totalize(1,P,FP2,False) Average(1,AT,FP2,False) Sample(1,RH,FP2) Average(1,WS,FP2,False) WindVector(1,WS,WD,FP2,False,0,0,0) FieldNames("WS_S_WVT,WD_D1_WVT,WD_SD1_WVT") Average(1,PB,IEEE4,False) Average(1,NR,FP2,False) Average(1,SD,FP2,False) EndTable DataTable(SR50,1,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Sample(1,AT,FP2) Average(1,SD,FP2,False) Sample(1,DT,FP2) Average(1,Q,FP2,False) EndTable ' QtrHrWtr: base pt-aquistar turbidity-obs500 DataTable(QtrHrWtr,1,-1) DataInterval(0,15,Min,0) Sample(1,progSig,uint2) Sample(1,pt1stage,fp2) Maximum(1,pt1stage,fp2,0,0) Minimum(1,pt1stage,fp2,0,0) Sample(1,pt1temp,fp2) Sample(1,pt2stage,fp2) Maximum(1,pt2stage,fp2,0,0) Minimum(1,pt2stage,fp2,0,0) Sample(1,pt2temp,fp2) EndTable 'Main Program BeginProg ' for base: progSig = status.ProgSignature Initial_Dist = SNW_HT_CM n=1 ' for camera communication SerialOpen(CAM_COM_CP,115200,4,0,1000) SW12(1) 'Main Scan Scan(60,Sec,1,0) 'Default CR1000X Datalogger Battery Voltage measurement 'BattV' Battery(BattV) 'Default CR1000X Datalogger Wiring Panel Temperature measurement 'PTemp_C' PanelTemp(PTemp_C,15000) 'H2SC3 (panel switched power) Temperature & Relative Humidity Sensor measurements 'AT' and 'RH' PortSet(RH_RELAY_CP,1) Delay(0,3,Sec) VoltSe(AT,1,mV2500,AT_SE,True,0,250,AT_MULT,AT_OFS) VoltSe(RH,1,mV2500,RH_SE,True,0,250,RH_MULT,RH_OFS) PortSet(RH_RELAY_CP,0) If RH>100 AND RH<103 Then RH=100 'CS106 Barometric Pressure Sensor measurement 'PB' If TimeIntoInterval(59,60,Min) Then PortSet(PB_EN_CP,1) If TimeIntoInterval(0,60,Min) Then VoltSe(PB,1,mV5000,PB_SE,True,0,15000,PB_MULT,PB_OFS) PortSet(PB_EN_CP,0) EndIf 'TE525MM/TE525M Rain Gauge measurement 'P' PulseCount(P,1,P_PP,2,0,P_TIP,0) '05108-45 Wind Speed & Direction Sensor measurements 'WS' and 'WD' PulseCount(WS,1,WS_PP,1,1,WS_MULT,0) BrHalf(WD,1,mV5000,WD_SE,WD_EX,1,2500,True,20000,15000,WD_MULT,0) If WD>=355 OR WD<0 Then WD=0 'Automated Water stage measurement. Must occur two minutes before 'actual storage time to get 11 measurements completed. If TimeIntoInterval (3,5,Min) Then SR50ACtrl = True EndIf 'Set this flag to true to get the initial distance from the SR50AT 'to the ground. If SR50A_MID Then SR50ACtrl = True 'Logic to make 11 water stage measurements, sort them, and store 'the corrected values. If SR50ACtrl Then 'SR50A Sonic Ranging Sensor (SDI-12 Output) measurements 'MDT, MQ, & MAir SDI12Recorder(SR50A_M(),SNW_SDI12_CP,"0","M1!",1,0) 'Load the array to be sorted. SR50A(n,1) = SR50A_M(1) SR50A(n,2) = SR50A_M(2) n += 1 If n > 11 Then n = 1 SR50ACtrl = False SortSpa (Result_SR50A(1,1),11,SR50A(1,1),2) TCDT = Result_SR50A(6,1)*SQR((AT+273.15)/273.15) Q = Result_SR50A(6,2) If SR50A_MID Then Initial_Dist = TCDT*100 SR50A_MID = False EndIf DT = TCDT*100 SD = Initial_Dist - (TCDT*100) EndIf EndIf 'NR-LITE2 Net Radiometer (dynamic wind speed correction) measurement 'NR_raw' and 'NR' VoltDiff(NR_raw,1,mV250,NR_DIFF,True,0,15000,1000/NR_CALIB,0) If WS>=5 Then NR=NR_raw*(1+0.021286*(WS-5)) Else NR=NR_raw EndIf 'SW12 Timed Control for Satellite modem 'Turn ON SW12 between MODM_ON_MIN and MODM_OFF_MIN If TimeIsBetween(MODM_ON_MIN,MODM_OFF_MIN,MODM_PERIOD,Min) Then SW12State=True 'Turn OFF SW12 only if time runs out and ComRS232 is not active 'ElseIf (ComPortIsActive(ComRS232)=False) Else SW12State=False EndIf 'Always turn OFF SW12 if battery drops below MODM_V_LIM volts If BattV