'ASS1 Alyeska Sag River Site 1 'Adapted from Ken Irving's das2-12sep2012.cr1 program. 'Written by Joel Bailey 9/13/2015 '5/18/2019 - removed slow sequence, changed pt measurments to 3 min interval Const NR_WS_CORR = 0.021286 Const TWOPI = 4 * ATN2(1,0) Const PT_PSI_TO_CM = 70.377285 ConstTable Const PAKBUS_INFO = 161 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 = "60835619" 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 SDI12__CP = 5 Const CAM_PWR__CP = 6 Const CAM_MODL = "CAM-CC5MPX" Const CAM_SN = "1992" Const CAM_ON_MIN = 0 Const CAM_OFF_MIN = 1 Const CAM_V_LIM = 12.4 Const CAM_HOLD_V_LIM = 12.6 Const LATITUDE = 69 Const LONGITUDE = -149 Const TZ_HOURS = -9 Const SUN_ELEV_MIN_DEG = -10 Const MODM_PWR__CP = 9 Const IRIDIUM_PWR__CP = 7 Const MODM_MODL = "IRIDIUM and FGR115RC" Const MODM_SN = "3000025010942640" Const MODM_ON_MIN = 0 Const MODM_OFF_MIN = 10 Const MODM_PERIOD = 30 Const MODM_V_LIM = 12.4 Const MODM_HOLD_V_LIM = 12.6 Const PT_MODL = "INW AquiStar PT12" Const PT1_SN = "?" Const PT2_SN = "?" Const PT1_SDI_ADDR = 1 Const PT2_SDI_ADDR = 0 Const PB_MODL = "CS106" Const PB_SN = "L1720413" Const PB_UNITS = "mBar" Const PB_MULT = 0.24 Const PB_OFS = 600 Const PB__SE = 15 Const PB__CP = 8 EndConstTable ' base: Public progSig As Long ' logger-diagnostics: Public battery, SolarPnlV, PanelT ' wind-rmyoung: Public ws, wd Alias ws = windSpeed Units ws = WS_UNITS Alias wd = windDir Units wd = WD_UNITS ' CS106 Barometric Pressure Public pb Units pb=mbar ' TE525mm Tipping Bucket Units PanelT = degC Units battery = Volts ' air-hc2s3: Public at, rh, dp Units at = degC Units rh = percent Units dp = depC Public p Units p = mm ' time-variables: Dim Time(9) Alias Time(4) = thisHour Alias Time(5) = thisMinute Alias Time(9) = thisDOY ' camera: Public camOnMin, camOffMin, camVlim, camHldVlim Public camHold As Boolean, camForce As Boolean Public sun_elev, sun_setpt, sun_ok As Boolean ' modem: Public modemOnMin, modemOffMin, modemPeriod, modemVlim, modemHldVlim Public modemHold As Boolean, modemForce As Boolean ' 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 ' Daily: DataTable(Daily,1,-1) DataInterval(0,1440,Min,0) Sample(1,progSig,uint2) Average(1,at,fp2,0) Average(1,ws,fp2,0) WindVector(1,windSpeed,windDir,fp2,0,0,0,0) EndTable ' HrlyAtms: base air-hc2s3 wind-rmyoung 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,windSpeed,fp2) Sample(1,windDir,fp2) WindVector(1,windSpeed,windDir,fp2,0,0,0,0) Maximum(1,windSpeed,fp2,0,0) Sample(1,pb,fp2) Average(1,pb,fp2,0) EndTable ' HrlyDiag: base logger-diagnostics DataTable(HrlyDiag,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Average(1,battery,fp2,0) Average(1,PanelT,fp2,0) Average(1,SolarPnlV,fp2,0) 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 ' Met: base air-hc2s3 wind-rmyoung DataTable(Met,1,8) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Totalize(1,p,FP2,False) Average(1,at,fp2,0) Sample(1,rh,fp2) WindVector(1,windSpeed,windDir,fp2,0,0,0,0) Average(1,pb,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 ' 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:relayControl2() Sub relayControl2(relayPort,onMin,offMin,Vlimit,holdVlimit,hold,force,condition) ' uses globals thisMinute, If force Then Call setRelayState(relayPort,1) If thisMinute = onMin AND battery >= Vlimit AND condition Then Call setRelayState(relayPort,1) If thisMinute = onMin AND battery < holdVlimit Then hold = 0 If thisMinute = 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 ' camera:calc_sunElev() Sub calc_SunElev() Dim declination, solar_hour RealTime(Time()) solar_hour = thisHour + (thisMinute/60) + (LONGITUDE/15 - TZ_HOURS) declination = -23.45 * COS( TWOPI * (thisDOY + 10) / 365 ) sun_elev = (LATITUDE - 90) * COS(solar_hour * 15 * TWOPI / 360) + declination EndSub BeginProg ' for base: progSig = status.ProgSignature ' for camera: camVlim = CAM_V_LIM camHldVlim = CAM_HOLD_V_LIM sun_setpt = SUN_ELEV_MIN_DEG ' 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) Scan(60,sec,1,0) ' logger-diagnostics: PanelTemp(PanelT,250) battery(battery) VoltSe(SolarPnlV,1,mV5000,SPANEL_VDIV__SE,True,0,250,0.01,0) 'CS106 Barometric Pressure Sensor '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) ' rh-pwr-on: PortSet(RH_RELAY__CP,1) Delay(0,4000,mSec) ' air-hc2s3: VoltSe(at,1,mV2500,AT__SE,1,0,250,AT_MULT,AT_OFS) VoltSe(rh,1,mV2500,RH__SE,1,0,250,RH_MULT,RH_OFS) DewPoint(dp,at,rh) ' wind-rmyoung: PulseCount(ws,1,WS__PP,1,1,WS_MULT,0) BrHalf(wd,1,mV2500,WD__SE,WD__EX,1,2500,1,0,250,WD_MULT,WD_OFS) ' rh-pwr-off: PortSet(RH_RELAY__CP,0) If TimeIntoInterval(0,3,Min) Then ' pt-aquistar: '' outputs: 1:pressure (PSI), 2:water temp (C), 3:battery (V) SDI12Recorder(pt1(),SDI12__CP,PT1_SDI_ADDR,"M!",1.0,0) SDI12Recorder(pt2(),SDI12__CP,PT2_SDI_ADDR,"M!",1.0,0) pt1(1) = pt1(1) * PT_PSI_TO_CM pt2(1) = pt2(1) * PT_PSI_TO_CM EndIf ' time-variables: RealTime(Time()) ' camera: calc_sunElev() sun_ok = sun_elev>=sun_setpt relayControl2(CAM_PWR__CP,camOnMin,camOffMin,camVlim,camHldVlim,camHold,camForce,sun_ok) ' modem: relayControl(MODM_PWR__CP,modemOnMin,modemOffMin,modemPeriod,modemVlim,modemHldVlim,modemHold,modemForce) ' call-met-tables: CallTable Daily CallTable HrlyAtms CallTable HrlyDiag CallTable Met CallTable Hydro CallTable QtrHrWtr NextScan EndProg