'CR1000 'Alyeska Met Site 'Written by Joel Bailey 9/12/2015 'Created by Short Cut (3.1) '10/12/2015 - Joel Bailey - Changed program to take pictures once daily at noon '10/04/2016 - Joel Bailey - Changed the camera control to come on at 58 minutes past the hour and off at 3 minutes past the hour ConstTable Const PAKBUS_INFO = 160 Const SPANEL_VDIV__SE = 11 Const P_MODL = "TE525MM" Const P_TIP = 0.1 Const P_UNITS = "mm" Const P__PP = 2 Const RH_RELAY__CP = 4 Const RH_MODL = "HC2S3" Const RH_SN = "20018503" Const RH_MULT = 0.1 Const RH_OFS = 0 Const AT_MULT = 0.1 Const AT_OFS = -50 Const AT__SE = 1 Const RH__SE = 2 Const WS_MODL = "RMY 05103" Const WS_UNITS = "m/s" Const WS_MULT = 0.098 Const WD_UNITS = "deg" Const WD_OFS = 0 Const WD_MULT = 355 Const WS__PP = 1 Const WD__SE = 8 Const WD__EX = Vx1 Const ATB_MODL = "Therm109" Const ATB_SN = "300280" Const ATB_MULT = 1 Const ATB_OFS = 0 Const ATB__SE = 5 Const ATB__EX = Vx3 Const PB_MODL = "CS106" Const PB_SN = "L1440687" Const PB_UNITS = "mBar" Const PB_MULT = 0.24 Const PB_OFS = 600 Const PB__SE = 15 Const PB__CP = 8 Const NR_MODL = "NR-LITE" Const NR_SN = "150522" Const NR_CALIB = 14.8 Const NR_CALIB_UNITS = "uV/W/m^2" Const NR_UNITS = "W/m^2" Const NR__DIFF = 2 Const SNW_MODL = "SR50A" Const SNW_SN = "6859" Const SNW_HT_CM = 200 Const SNW_SDI_ADDR = 0 Const SDI12__CP = 5 Const MODM_PWR__CP = 9 Const MODM_MODL = "9522B" Const MODM_SN = "XXX" Const MODM_ON_MIN = 0 Const MODM_OFF_MIN = 10 Const MODM_PERIOD = 60 Const MODM_V_LIM = 12.4 Const MODM_HOLD_V_LIM = 12.6 Const CAM_PWR__CP = 6 Const CAM_MODL = "CAM-CC5MPX" Const CAM_SN = "1984" EndConstTable 'Declare Variables and Units Public progSig As Long Public battery Public PTemp_C Public SolarPnlV Public pb Public p Public ws Public wd Public nr Public at Public rh Public dp Public Camera_SW12State As Boolean ' snow-sr50a: Public sr50_raw(2), sr50_down, snowdepth, sr50_height Alias sr50_raw(2) = sr50_quality Public atb ' time-variables: Dim Time(9) Alias Time(4) = thisHour Alias Time(5) = thisMinute Alias Time(9) = thisDOY ' modem: Public modemOnMin, modemOffMin, modemPeriod, modemVlim, modemHldVlim Public modemHold As Boolean, modemForce As Boolean Units battery=Volts Units PTemp_C=Deg C Units SolarPnlV=Volts Units pb=mbar Units p=mm Units ws=meters/second Units wd=degrees Units nr=W/m^2 Units at=Deg C Units rh=% Units dp=Deg C Units atb=Deg C 'Define Data Tables DataTable(Daily,True,-1) DataInterval(0,1440,Min,10) Sample(1,progSig,uint2) 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,atb,FP2,False) Average(1,nr,FP2,False) Average(1,snowdepth,FP2,False) EndTable DataTable(HrlyAtms,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Totalize(1,p,fp2,0) Sample(1,at,fp2) Average(1,at,fp2,0) Minimum(1,at,fp2,0,0) Maximum(1,at,fp2,0,0) Sample(1,rh,fp2) Minimum(1,rh,fp2,0,0) Maximum(1,rh,fp2,0,0) Sample(1,dp,fp2) Average(1,dp,fp2,0) Minimum(1,dp,fp2,0,0) Maximum(1,dp,fp2,0,0) Sample(1,ws,fp2) Sample(1,wd,fp2) WindVector(1,ws,wd,fp2,0,0,0,0) Maximum(1,ws,fp2,0,0) Sample(1,atb,fp2) Average(1,atb,fp2,0) Minimum(1,atb,fp2,0,0) Maximum(1,atb,fp2,0,0) Sample(1,pb,fp2) Average(1,pb,fp2,0) Average(1,nr,fp2,0) Average(1,snowdepth,fp2,0) EndTable DataTable(HrlyDiag,True,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Minimum(1,battery,FP2,False,False) Average(1,PTemp_C,FP2,False) Average(1,SolarPnlV,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,0) WindVector(1,ws,wd,FP2,False,0,0,0) FieldNames("ws_S_WVT,wd_D1_WVT,wd_SD1_WVT") Average(1,atb,FP2,False) Average(1,pb,FP2,False) Average(1,nr,FP2,False) Average(1,snowdepth,FP2,False) EndTable DataTable(SR50,True,-1) DataInterval(0,60,Min,10) Sample(1,progSig,uint2) Sample(1,at,FP2) Average(1,snowdepth,FP2,False) Sample(1,sr50_height,FP2) Average(1,sr50_quality,FP2,False) EndTable ' relay-control-sub:relayControl() Sub relayControl(relayPort,onMin,offMin,period,Vlimit,holdVlimit,hold,force) ' uses globals thisMinute, battery If force Then Call setRelayState(relayPort,1) If thisMinute MOD period = onMin AND battery >= Vlimit Then Call setRelayState(relayPort,1) If thisMinute MOD period = onMin AND battery < holdVlimit Then hold = 0 If thisMinute MOD period = offMin AND NOT hold Then Call setRelayState(relayPort,0) EndSub ' relay-control-sub:setPortState() Sub setRelayState(relay,state As Boolean) ' portSet() does not allow variable for port, so brute force it: If relay = 9 Then PortSet(9,state) Else If relay = 8 Then PortSet(8,state) Else If relay = 7 Then PortSet(7,state) Else If relay = 6 Then PortSet(6,state) Else If relay = 4 Then PortSet(4,state) Else If relay = 3 Then PortSet(3,state) EndIf EndSub 'Main Program BeginProg ' for base: progSig = status.ProgSignature sr50_height = SNW_HT_CM ' for modem: modemOnMin = (MODM_ON_MIN + MODM_PERIOD) MOD MODM_PERIOD modemOffMin = (MODM_OFF_MIN + MODM_PERIOD) MOD MODM_PERIOD modemPeriod = MODM_PERIOD modemVlim = MODM_V_LIM modemHldVlim = MODM_HOLD_V_LIM ' for camera communication SerialOpen(Com1,115200,4,0,1000) 'Main Scan Scan(60,Sec,1,0) 'Default Datalogger Battery Voltage measurement 'BattV' battery(battery) 'Default Wiring Panel Temperature measurement 'PTemp_C' PanelTemp(PTemp_C,250) 'solar panel voltage VoltSe(SolarPnlV,1,mV5000,SPANEL_VDIV__SE,True,0,250,0.01,0) 'CS106 Barometric Pressure Sensor measurement 'pb' If TimeIntoInterval(59,60,Min) Then PortSet(PB__CP,1) If TimeIntoInterval(0,60,Min) Then VoltSe(pb,1,mV2500,PB__SE,1,0,250,PB_MULT,PB_OFS) PortSet(PB__CP,0) EndIf 'TE525MM/TE525M Rain Gauge measurement 'p' PulseCount(p,1,P__PP,2,0,P_TIP,0) '05103 Wind Speed & 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,0,250,WD_MULT,WD_OFS) If wd>=360 OR wd<0 Then wd=0 'NR-LITE2 Net Radiometer (dynamic wind speed correction) measurement 'nr' and 'corr_nr' VoltDiff(nr,1,mv25,NR__DIFF,True,0,250,1000/NR_CALIB,0) If ws>=5 Then nr=nr*(1+0.021286*(ws-5)) Else nr=nr EndIf 'Turn SW12V Switch On PortSet(RH_RELAY__CP,1) Delay(0,3,Sec) 'HC2S3 (SW12V switched power) Temperature & Relative Humidity Sensor measurements 'at' and 'rh' VoltSe(at,1,mV2500,AT__SE,0,0,250,AT_MULT,AT_OFS) VoltSe(rh,1,mV2500,RH__SE,0,0,250,RH_MULT,RH_OFS) DewPoint(dp,at,rh) 'Turn SW12V Switch Off PortSet(RH_RELAY__CP,0) ' 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 '109 Temperature Probe measurement 'atb' Therm109(atb,1,ATB__SE,ATB__EX,0,250,ATB_MULT,ATB_OFS) ' time-variables: RealTime(Time()) 'SW12 Camera Control 'Turn ON SW12 for 5 minutes every 60 minutes If TimeIsBetween(0,1,60,Min) Then Camera_SW12State=True Else Camera_SW12State=False EndIf 'Always turn OFF SW12 if battery drops below 12.3 volts If Battery<12.3 Then Camera_SW12State=False 'Set SW12-1 to the state of 'SW12State' variable PortSet(CAM_PWR__CP,Camera_SW12State) ' modem: relayControl(MODM_PWR__CP,modemOnMin,modemOffMin,modemPeriod,modemVlim,modemHldVlim,modemHold,modemForce) 'Call Data Tables and Store Data CallTable Daily CallTable HrlyAtms CallTable HrlyDiag CallTable Met CallTable SR50 NextScan EndProg