'atm1.cr1x 'CR1000X Series 'Created by Short Cut (4.0) '10-31-2019 - Modified by Joel Bailey '8-10-2022 - Joel Bailey - added functionality to turn Camera on and off at certain intervals, switched the camera control to Pulse C6 'Constants ConstTable Const PAKBUS_INFO = 388 Const P_MODL = "TE525M" Const P_SN = "xx" Const P_TIP = 0.1 Const P_UNITS = "mm" Const P_PP = P1 Const RH_RELAY_CP = C4 Const RH_MODL = "EE181" Const RH_SN = "19191600018874" 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 = P2 Const WD_SE = 8 Const WD_EX = Vx2 Const PB_MODL = "CS106" Const PB_SN = "P4510063" Const PB_UNITS = "mBar" Const PB_MULT = 0.240 Const PB_OFS = 500 Const PB_SE = 3 Const PB_EN_CP = C1 Const NR_MODL = "NR-LITE2" Const NR_SN = "xx" Const NR_CALIB = 11.9 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 = "11512" Const SNW_HT_CM = 514 Const SNW_SDI_ADDR = "0" Const SNW_SDI12_CP = C3 Const SR50A_HEATER_CP = C2 Const MODM_MODL = "Iridium" Const MODM_SN = "881692766783" Const MODM_ON_MIN = 0 Const MODM_OFF_MIN =15 Const MODM_PERIOD = 60 Const MODM_V_LIM = 12.0 Const MODM_PWR = SW12_1 Const CAM_TRIG_CP = C6 Const CAM_MODL = "CCFC" Const CAM_SN = "xx" Const CAM_COM_CP = ComC7 Const CAM_PWR = SW12_2 Const CAM_ON_MIN = 57 Const CAM_OFF_MIN =3 Const CAM_PERIOD = 60 Const CAM_V_LIM = 12.0 Const NumTempSensors = 10 Const CS225_SDI12_CP = C5 Const CS225_SDI_ADDR = "0" 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 SR50AH(2) Public SD Public sr50_down Public sr50_height_cm Public HtrCntrl As Boolean Public SW12State As Boolean Public SW12_2State As Boolean Public NR_raw Public NR Public CS225Temp(NumTempSensors) As Float Dim i As Long Alias SR50AH(1)=DT Alias SR50AH(2)=Q Alias CS225Temp(1) = SnowTemp_360cm Alias CS225Temp(2) = SnowTemp_320cm Alias CS225Temp(3) = SnowTemp_280cm Alias CS225Temp(4) = SnowTemp_240cm Alias CS225Temp(5) = SnowTemp_200cm Alias CS225Temp(6) = SnowTemp_160cm Alias CS225Temp(7) = SnowTemp_120cm Alias CS225Temp(8) = SnowTemp_80cm Alias CS225Temp(9) = SnowTemp_40cm Alias CS225Temp(10) = SnowTemp_0cm 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 Units SD=cm Units CS225Temp()=Deg C 'Define Data Tables DataTable(HrlyAtms,True,-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) Sample(NumTempSensors,CS225Temp(),IEEE4) EndTable DataTable(Daily,True,-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,True,-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 DataTable(MET,True,-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) Sample(NumTempSensors,CS225Temp(),IEEE4) EndTable DataTable(SR50,True,-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 '***************************************************************************** '* --------------------- ConvertNumToSDI12address() ---------------------- * '* Convert SDI-12 character address (0->9, A->Z, and a->z) to number value * '* (0->61). * '***************************************************************************** Function ConvertNumToSDI12address(address As Long) As String * 1 Select Case address Case 0 To 9 'ASCII Code 48->57 = 0->9 Return(CHR(address + 48)) Case 10 To 35 'ASCII Code 65->90 = A->Z = 10->35 Return(CHR(address + 55)) Case 36 To 61 'ASCII Code 97->122 = a->z = 36->61 Return(CHR(address + 61)) EndSelect Return("") EndFunction 'ConvertNumToSDI12address() 'Main Program BeginProg ' for base: progSig = status.ProgSignature sr50_height_cm = SNW_HT_CM ' for camera communication SerialOpen(CAM_COM_CP,115200,4,0,1000,0) SW12(CAM_PWR,1,0) '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) 'EE181 (panel switched power) Temperature & Relative Humidity Sensor measurements 'AT' and 'RH' PortSet(RH_RELAY_CP,1) Delay(0,2,Sec) VoltSe(AT,1,mV1000,AT_SE,False,0,15000,AT_MULT,AT_OFS) VoltSe(RH,1,mV1000,RH_SE,False,0,15000,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,1,0,P_TIP,0) '05108-45 Wind Speed & Direction Sensor measurements 'WS' and 'WD' PulseCount(WS,1,WS_PP,5,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 'SR50AH Heated Sonic Ranging Sensor (SDI-12 Output) measurements 'DT' and 'Q' and calculations 'SD' and 'DBTCDT' SDI12Recorder(SR50AH(),SNW_SDI12_CP,SNW_SDI_ADDR,"M1!",1,0,-1) DT = DT * 100.0 sr50_down=DT*SQR((AT+273.15)/273.15) SD=SR50_height_cm-sr50_down 'SR50AH Heated Sonic Ranging Sensor (SDI-12 Output) heater control If BattV>=11.7 Then If AT<=2 Then HtrCntrl=True If AT>3 Then HtrCntrl=False Else HtrCntrl=False EndIf PortSet(SR50A_HEATER_CP,HtrCntrl) 'Read the current Temperature Value of CS225 string For i=1 To NumTempSensors SDI12Recorder (CS225Temp(i),CS225_SDI12_CP,ConvertNumToSDI12address(i),"R0!",1.0,0) Next 'NR-LITE2 Net Radiometer (dynamic wind speed correction) measurement 'NR_raw' and 'NR' VoltDiff(NR_raw,1,mV200,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) Then SW12State=False EndIf 'Always turn OFF SW12 if battery drops below MODM_V_LIM volts If BattV