'CR1000 'CaribouHillsMet.cr1 'Created by Short Cut (4.3) '11/22/2022 - Modified by Joel Bailey '2/8/2023 - Modified by Joel Bailey - added US units table and calculations 'Constants ConstTable Const PAKBUS_INFO = 1 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 = 3 Const RH_2M_MODL = "HC2S3" Const RH_2M_SN = "XX" Const RH_2M_MULT = 0.1 Const RH_2M_OFS = 0 Const AT_2M_MULT = 0.1 Const AT_2M_OFS = -50 Const AT_2M_SE = 1 Const RH_2M_SE = 2 Const RH_3M_MODL = "HC2S3" Const RH_3M_SN = "XX" Const RH_3M_MULT = 0.1 Const RH_3M_OFS = 0 Const AT_3M_MULT = 0.1 Const AT_3M_OFS = -50 Const AT_3M_SE = 3 Const RH_3M_SE = 4 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 = 7 Const WD_EX = Vx1 Const PB_MODL = "CS106" Const PB_SN = "XX" Const PB_UNITS = "mBar" Const PB_MULT = 0.184 Const PB_OFS = 600 Const PB_SE = 14 Const PB_EN_CP = 2 Const NR_MODL = "NR-LITE2" Const NR_SN = "114129" Const NR_CALIB = 11.6 Const NR_CALIB_UNITS = "uV/W/m^2" Const NR_UNITS = "W/m^2" Const NR_DIFF = 5 Const CMP3_CALIB = 13.65 Const CMP3_DIFF = 3 Const CMP3_SN = "13846" Const SNW_MODL = "SR50A" Const SNW_SN = "4451" Const SNW_HT_CM = 168.0 Const SNW_SDI_ADDR = "0" Const SNW_SDI12_CP = 1 Const SM_SDI_ADDR = "1" Const MODM_MODL = "RV50" Const MODM_SN = "XX" Const MODM_ON_MIN = 0 Const MODM_OFF_MIN = 10 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 EndConstTable 'Declare Variables and Units Public progSig As Long Public BattV Public PTemp_C Public P Public P_INCH Public SR50A(2) Public SR50A_TCDT Public SD Public SD_INCH Public SlrW Public SlrkJ Public WS Public WS_MPH Public WD Public NR_Wm2 Public CNR_Wm2 Public ST_30cm Public ST_5cm Public ST_15cm Public ST_60cm Public ST_30cm_F Public ST_5cm_F Public ST_15cm_F Public ST_60cm_F Public CS65X(3) Public PB Public PB_inHG Public AT_2M Public RH_2M Public AT_3M Public RH_3M Public AT_2M_F Public AT_3M_F Public SM_10CMT_F Public SW12State As Boolean Public SW12_2State As Boolean Alias SR50A(1)=SR50A_DT Alias SR50A(2)=SR50A_Q Alias CS65X(1)=SM_10CM_VWC Alias CS65X(2)=SM_10CM_EC Alias CS65X(3)=SM_10CMT Units BattV=Volts Units PTemp_C=Deg C Units P=mm Units P_INCH=inch Units SlrW=W/m^2 Units SlrkJ=kJ/m^2 Units WS=meters/second Units WS_MPH=miles/hour Units WD=degrees Units NR_Wm2=W/m^2 Units CNR_Wm2=Watts/meter^2 Units ST_5cm=Deg C Units ST_15cm=Deg C Units ST_30cm=Deg C Units ST_60cm=Deg C Units ST_5cm_F=Deg F Units ST_15cm_F=Deg F Units ST_30cm_F=Deg F Units ST_60cm_F=Deg F Units PB=mbar Units PB_inHG=inHG Units AT_2M=Deg C Units AT_2M_F=Deg F Units RH_2M=% Units AT_3M=Deg C Units AT_3M_F=Deg F Units RH_3M=% Units SM_10CM_VWC=m^3/m^3 Units SM_10CM_EC=dS/m Units SM_10CMT=Deg C Units SM_10CMT_F=Deg F 'Define Data Tables DataTable(HrlyMet,True,-1) DataInterval(0,60,Min,10) Totalize(1,P,FP2,False) Sample(1,SR50A_DT,FP2) Sample(1,SR50A_Q,FP2) Sample(1,SR50A_TCDT,FP2) Sample(1,SD,FP2) Average(1,SD,FP2,False) Sample(1,SlrW,FP2) Average(1,SlrW,FP2,False) Totalize(1,SlrkJ,IEEE4,False) Sample(1,WS,FP2) Maximum(1,WS,FP2,False,False) Minimum(1,WS,FP2,False,False) Average(1,WS,FP2,False) Sample(1,WD,FP2) WindVector(1,WS,WD,FP2,False,0,0,0) FieldNames("WS_S_WVT,WD_D1_WVT,WD_SD1_WVT") Sample(1,NR_Wm2,FP2) Average(1,NR_Wm2,FP2,False) Sample(1,CNR_Wm2,FP2) Average(1,CNR_Wm2,FP2,False) Sample(1,PB,IEEE4) Average(1,PB,IEEE4,False) Sample(1,AT_2M,FP2) Maximum(1,AT_2M,FP2,False,False) Minimum(1,AT_2M,FP2,False,False) Average(1,AT_2M,FP2,False) Sample(1,RH_2M,FP2) Sample(1,AT_3M,FP2) Maximum(1,AT_3M,FP2,False,False) Minimum(1,AT_3M,FP2,False,False) Average(1,AT_3M,FP2,False) Sample(1,RH_3M,FP2) EndTable DataTable(HrlySoil,True,-1) DataInterval(0,60,Min,10) Minimum(1,BattV,FP2,False,False) Sample(1,ST_30cm,FP2) Average(1,ST_30cm,FP2,False) Sample(1,ST_5cm,FP2) Average(1,ST_5cm,FP2,False) Sample(1,ST_15cm,FP2) Average(1,ST_15cm,FP2,False) Sample(1,ST_60cm,FP2) Average(1,ST_60cm,FP2,False) Sample(1,SM_10CM_VWC,FP2) Average(1,SM_10CM_VWC,FP2,False) Sample(1,SM_10CM_EC,FP2) Average(1,SM_10CM_EC,FP2,False) Sample(1,SM_10CMT,FP2) Average(1,SM_10CMT,FP2,False) EndTable DataTable(HrlyDiag,True,-1) DataInterval(0,60,Min,10) Sample(1,BattV,FP2) Average(1,BattV,FP2,False) Sample(1,PTemp_C,FP2) Average(1,PTemp_C,FP2,False) EndTable DataTable(Hrly_US,True,-1) DataInterval(0,60,Min,10) Totalize(1,P_INCH,FP2,False) Average(1,SD_INCH,FP2,False) Maximum(1,WS_MPH,FP2,False,False) Average(1,WS_MPH,FP2,False) Average(1,PB_inHG,IEEE4,False) Average(1,AT_2M_F,FP2,False) Average(1,AT_3M_F,FP2,False) Average(1,ST_30cm_F,FP2,False) Average(1,ST_5cm_F,FP2,False) Average(1,ST_15cm_F,FP2,False) Average(1,ST_60cm_F,FP2,False) Average(1,SM_10CMT_F,FP2,False) EndTable DataTable(Daily,True,-1) DataInterval(0,1,Day,10) Sample(1,BattV,FP2) Average(1,BattV,FP2,False) Maximum(1,BattV,FP2,False,False) Minimum(1,BattV,FP2,False,False) Sample(1,PTemp_C,FP2) Average(1,PTemp_C,FP2,False) Maximum(1,AT_2M,FP2,False,False) Minimum(1,AT_2M,FP2,False,False) Average(1,AT_2M,FP2,False) Maximum(1,AT_3M,FP2,False,False) Minimum(1,AT_3M,FP2,False,False) Average(1,AT_3M,FP2,False) EndTable 'Main Program BeginProg ' for base: progSig = status.ProgSignature PortsConfig (&B00100000,&B11111111) ' for camera communication SerialOpen(CAM_COM_CP,115200,4,0,1000) SW12(1) 'Main Scan Scan(60,Sec,1,0) 'Default CR1000 Datalogger Battery Voltage measurement 'BattV' Battery(BattV) 'Default CR1000 Datalogger Wiring Panel Temperature measurement 'PTemp_C' PanelTemp(PTemp_C,250) 'TE525MM/TE525M Rain Gauge measurement 'P' PulseCount(P,1,1,2,0,0.1,0) P_INCH=P*0.03937 'SR50A/SR50A-EE Sonic Ranging Sensor (SDI-12 Output) measurements 'SR50A_DT' and 'SR50A_Q' and calculations 'SR50A_TCDT' and 'SD' SDI12Recorder(SR50A(),SNW_SDI12_CP,SNW_SDI_ADDR,"M1!",1,0,-1) SR50A_TCDT=SR50A_DT*SQR((AT_2M+273.15)/273.15) SD=((SNW_HT_CM/100)-SR50A_TCDT)*100 SD_INCH=SD*0.3937 'CM3 Pyranometer measurements 'SlrkJ' and 'SlrW' VoltDiff(SlrW,1,mV25,CMP3_DIFF,True,0,250,1,0) If SlrW<0 Then SlrW=0 'Calculate total flux 'The multiplier to calculate total flux was calculated by Short Cut 'and based on a program execution rate (scan rate) of 60 Seconds. 'If you change the program execution rate outside of Short Cut with the CRBasic Editor 'you will need to recalculate this multiplier. See the sensor manual for more details. SlrkJ=SlrW*(60*(1000/CMP3_CALIB)/1000) 'Calculate flux density SlrW=SlrW*(1000/CMP3_CALIB) '05108-45 Wind Speed and Direction Sensor measurements 'WS' and 'WD' PulseCount(WS,1,WS_PP,1,1,WS_MULT,0) BrHalf(WD,1,mV2500,WD_SE,WD_EX,1,2500,True,20000,250,WD_MULT,WD_OFS) If WD>=355 OR WD<0 Then WD=0 WS_MPH=WS*2.237 'NR-LITE2 Net Radiometer (dynamic wind speed correction) measurement 'NR_Wm2' and 'CNR_Wm2' VoltDiff(NR_Wm2,1,mv25,NR_DIFF,True,0,250,1000/NR_CALIB,0) If WS>=5 Then CNR_Wm2=NR_Wm2*(1+0.021286*(WS-5)) Else CNR_Wm2=NR_Wm2 EndIf '109 Temperature Probe measurement 'ST_30cm' Therm109(ST_30cm,1,8,1,0,250,1,0) ST_30cm_F=(ST_30cm*1.8)+32 '109 Temperature Probe measurement 'ST_5cm' Therm109(ST_5cm,1,11,1,0,250,1,0) ST_5cm_F=(ST_5cm*1.8)+32 '109 Temperature Probe measurement 'ST_15cm' Therm109(ST_15cm,1,12,2,0,250,1,0) ST_15cm_F=(ST_15cm*1.8)+32 '109 Temperature Probe measurement 'ST_60cm' Therm109(ST_60cm,1,13,2,0,250,1,0) ST_60cm_F=(ST_60cm*1.8)+32 'CS650/655 Water Content Reflectometer measurements 'SM_10CM_VWC', 'SM_10CM_EC', and 'SM_10CMT' If TimeIntoInterval(0,1,Hr) Then SDI12Recorder(CS65X(),SNW_SDI12_CP,SM_SDI_ADDR,"M!",1,0,-1) SM_10CMT_F = (SM_10CMT*1.8)+32 EndIf 'CS105 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,mV2500,PB_SE,1,0,250,PB_MULT,PB_OFS) PB_inHG=PB*0.02952 PortSet(PB_EN_CP,0) EndIf 'Turn SW12V Switch On PortSet(RH_RELAY_CP,1) Delay(0,3,Sec) 'HC2S3 (SW12V switched power) Temperature & Relative Humidity Sensor measurements 'AT_2M' and 'RH_2M' VoltSe(AT_2M,1,mV2500,AT_2M_SE,0,0,250,AT_2M_MULT,AT_2M_OFS) VoltSe(RH_2M,1,mV2500,RH_2M_SE,0,0,250,RH_2M_MULT,RH_2M_OFS) If RH_2M>100 AND RH_2M<103 Then RH_2M=100 AT_2M_F = (AT_2M*1.8)+32 'HC2S3 (SW12V switched power) Temperature & Relative Humidity Sensor measurements 'AT_3M' and 'RH_3M' VoltSe(AT_3M,1,mV2500,AT_3M_SE,0,0,250,AT_3M_MULT,AT_3M_OFS) VoltSe(RH_3M,1,mV2500,RH_3M_SE,0,0,250,RH_3M_MULT,RH_3M_OFS) If RH_3M>100 AND RH_3M<103 Then RH_3M=100 AT_3M_F = (AT_3M*1.8)+32 'Turn SW12V Switch Off PortSet(RH_RELAY_CP,0) 'SW12 Timed Control for Cell 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