'' 2-18-2016 Joel Bailey Changed hold time for HC2S3 to 5 seconds to allow warm up time for -20C and colder '' 5-18-2016 Joel Bailey added Raind gauge and Net radiometer '' 10-07-2016 Joe Bailey Movesd the PB measurements inside 5 sec scann interval, changed offset for PB to 500 from 600 '' 6/22/2017 EKY changed PB msmt to control port 7 and added delay ' soil-moisture-cs616: ' CS616 default calibration constants Const SM_A0 = -0.0663 Const SM_A1 = -0.0063 Const SM_A2 = 0.0007 ' soil-thermistors: Const MUX_PULSE_USEC = 10000 '' Steinhart & Hart constants for PS302J2, calculated on host hayes: '' steinhart-hart-constants -10.00 16598.58 0.00 9795.00 10.00 5970.16 Const kA = 0.001393520 Const kB = 0.000238918 Const kC = 0.000000093 Const NR_WS_CORR = 0.021286 ConstTable ' pakbus-info: Const PAKBUS_INFO = 14 ' site-info: Const SITE_NAME = "West Old Murphy Dome Road" Const SITE_DESCR = "met station" Const TZ_HOURS = -9 ' rh-pwr-on: Const RH_RELAY__CP = 4 ' air-hc2s3: Const ATRH_MODL = "HC2S3" 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 ' wind-rmyoung: Const WSWD_MODL = "RMY 05103" Const WS_MULT = 0.098 Const WD_OFS = 0 Const WD_MULT = 355 Const WS__PP = 1 Const WD__SE = 3 Const WD__EX = Vx1 ' air-soil-cs109: Const ATB_MODL = "CS109" Const ATB__SE = 4 Const ST0__SE = 5 Const CS109__EX = Vx3 ' solar-panel: Const SPANEL_VDIV__SE = 9 ' barometer-cs106: Const PB_MODL = "CS106" Const PB_UNITS = "mBar" Const PB_MULT = 0.24 Const PB_OFS = 500 Const PB__SE = 15 ' snow-sr50a: Const SNW_MODL = "SR50A" Const SNW_SDI_ADDR = 0 Const SDI12__CP = 5 Const SNW_HT_CM = 200 ' soil-moisture-cs616: Const SM_MODL = "CS616" Const SM_DEPTHS_CM = "10,30,50" Const SM_QTY = 3 Const SM1__SE = 6 Const SM_ENABLE__CP = 3 ' soil-thermistors: Const ST_TYPE = "PS302J2" Const ST_QTY = 9 Const ST_DEPTHS_CM = "5,10,20,30,50,70,90,110,130" Const MUX_SE_QTY = 1 Const MUX_THERM__SE = 16 Const MUX_RESET__CP = 1 Const MUX_CLOCK__CP = 2 Const MUX__EX = Vx2 Const R_REF_KOHMS = 15.000 Const SETTLING_USEC = 25000 ' radio: Const RDIO_PWR__CP = 9 Const RDIO_MODL = "FGR" Const RDIO_ON_MIN = 0 Const RDIO_PERIOD_MIN = 30 Const RDIO_TIMER_SEC = 300 Const RDIO_V_LIM = 12.4 Const RDIO_HOLD_V_LIM = 12.6 ' Rain gauge Const P_MODL = "TE525MM" Const P_TIP = 0.1 Const P_UNITS = "mm" Const P__PP = 2 ' NR-Lite Radiometer Const NR_MODL = "NR-LITE" 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 = 6 EndConstTable ' prog-signature: Public progSig As Long ' air-hc2s3: Public at : Units at = degC Public rh : Units rh = percent Public dp : Units dp = degC ' wind-rmyoung: Public ws : Units ws = m/s Public wd : Units wd = deg ' air-soil-cs109: Public atb : Units atb = degC Public st0 : Units st0 = degC ' battery: Public battery : Units battery = Volts ' solar-panel: Public solarPanel : Units solarPanel = Volts ' logger-panel-temp: Public panelTemp : Units panelTemp = degC ' barometer-cs106: Public pb Units pb = mbar ' snow-sr50a: Public sr50_raw(2) Public sr50_down Public snowdepth Public sr50_height Alias sr50_raw(2) = sr50_quality ' soil-moisture-cs616: ' CS616 period and volumetric water content Public sm_cs616(SM_QTY) : Units sm_cs616() = usec Public sm_vwc(SM_QTY) : Units sm_vwc() = m^3/m^3 Dim j ' soil-thermistors: ' brhalf() measurement yields ratio of thermistor to reference R: Dim st_X(ST_QTY) ' thermistor resistance is resolved by Ohms Law and ref R from ratio: Public st(ST_QTY) : Units st() = degC ' thermistor temperature calculated by Steinhart & Hart curve fit: Public st_R(ST_QTY) : Units st_R() = kOhms Dim lnR Dim i ' time-variables: Dim Time(9) Alias Time(4) = thisHour Alias Time(5) = thisMinute Alias Time(9) = thisDOY ' radio: Public radioOnMin, radioPeriod, radioTimer, radioTimerPreset, radioVlim, radioHoldVlim Public radioHold As Boolean, radioForce As Boolean ' precip-te525m: Public precip Units precip = P_UNITS ' netrad-nrlite: Public nr(2) Alias nr = netRad_raw,netRad Units nr() = NR_UNITS ' Atms: prog-signature air-hc2s3 air-soil-cs109 barometer-cs106 snow-sr50a DataTable(Atms,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) 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,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,snowdepth,fp2,0) Totalize(1,precip,fp2,0) Average(1,netRad,fp2,0) EndTable ' Diag: prog-signature battery solar-panel logger-panel-temp DataTable(Diag,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Average(1,battery,fp2,0) Average(1,solarPanel,fp2,0) Average(1,panelTemp,fp2,0) EndTable ' Met: prog-signature air-hc2s3 wind-rmyoung air-soil-cs109 barometer-cs106 snow-sr50a DataTable(Met,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Average(1,at,fp2,0) Sample(1,rh,fp2) Sample(1,ws,fp2) Sample(1,wd,fp2) WindVector(1,ws,wd,fp2,0,0,0,0) FieldNames("ws_mean:,wd_mean:,wd_stdev:") Maximum(1,ws,fp2,0,0) Average(1,atb,fp2,0) Average(1,pb,fp2,0) Average(1,snowdepth,fp2,0) Totalize(1,precip,fp2,0) Average(1,netRad,fp2,0) EndTable ' Soil: prog-signature air-soil-cs109 soil-moisture-cs616 soil-thermistors DataTable(Soil,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Sample(1,st0,fp2) Average(1,st0,fp2,0) Maximum(1,st0,fp2,0,0) Minimum(1,st0,fp2,0,0) Average(SM_QTY,sm_cs616(),fp2,0) Average(SM_QTY,sm_vwc(),fp2,0) Average(ST_QTY,st(),fp2,0) EndTable ' SR50: prog-signature air-hc2s3 snow-sr50a DataTable(SR50,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Average(1,at,fp2,0) Average(1,snowdepth,fp2,0) Sample(1,sr50_height,fp2) Average(1,sr50_quality,fp2,0) EndTable ' Therm-R: prog-signature soil-thermistors DataTable(Therm-R,1,-1) DataInterval(0,60,Min,0) Sample(1,progSig,uint2) Average(ST_QTY,st_R(),fp2,0) EndTable ' relay-control:relayControl() Sub relayControl(relay, condition, onMin, periodMin, timerSec, timerPreset, Optional hold=0, Optional forceOnce=0, Optional scanSec=60) timerSec = timerSec - scanSec If onMin < 0 Then onMin = (onMin + periodMin) MOD periodMin If condition AND (public.timestamp(1,1) INTDV 60) MOD periodMin = onMin OR forceOnce Then If timerSec < timerPreset Then timerSec = timerPreset If forceOnce Then forceOnce=0 EndIf If relay = 9 Then If timerSec > 0 Then If NOT status.SW12Volts Then SW12(1) Else If NOT hold AND status.SW12Volts Then SW12(0) EndIf Else If timerSec > 0 Then If NOT status.portStatus(relay) Then Call setPortState(relay,1) Else If NOT hold AND status.portStatus(relay) Then Call setPortState(relay,0) EndIf EndIf EndSub ' relay-control:setPortState() Sub setPortState(port,state As Boolean) ' port 9 is SW12V ' skip ports 3 and 4 (com2) ' skip ports 5 and 6 (com3) ' skip ports 7 and 8 (com4) Select Case port Case 9: PortSet(9,state) Case 2: PortSet(2,state) Case 1: PortSet(1,state) EndSelect EndSub BeginProg ' for prog-signature: progSig = status.ProgSignature ' for snow-sr50a: sr50_height = SNW_HT_CM ' for radio: radioOnMin = RDIO_ON_MIN radioPeriod = RDIO_PERIOD_MIN radioTimerPreset = RDIO_TIMER_SEC radioVlim = RDIO_V_LIM radioHoldVlim = RDIO_HOLD_V_LIM radioHold = 1 radioForce = 1 Scan(60,sec,0,0) ' 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) ' rh-pwr-off: PortSet(RH_RELAY__CP,0) ' 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) ' air-soil-cs109: Therm109(atb,1,ATB__SE,CS109__EX,0,250,1.0,0) Therm109(st0,1,ST0__SE,CS109__EX,0,250,1.0,0) ' battery: battery(battery) ' solar-panel: VoltSe(solarPanel,1,mV5000,SPANEL_VDIV__SE,True,0,250,0.01,0) ' logger-panel-temp: panelTemp(panelTemp,250) 'CS106 Barometric Pressure Sensor measurement 'Pb' If TimeIntoInterval(59,60,Min) Then PortSet(7,1) If TimeIntoInterval(0,60,Min) Then VoltSe(pb,1,mV2500,PB__SE,1,0,250,PB_MULT,PB_OFS) PortSet(7,0) EndIf ' snow-sr50a: 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 ' precip-te525m: PulseCount(precip,1,P__PP,2,0,P_TIP,0) ' netrad-nrlite: VoltDiff(nr,1,mv25,NR__DIFF,True,0,250,1000/NR_CALIB,0) netRad = netRad_raw If ws > 5 Then netRad = netRad_raw * (1 + NR_WS_CORR * (ws-5)) ' call-datatables: CallTable Met CallTable Atms CallTable Diag CallTable SR50 CallTable Soil CallTable Therm-R ' time-variables: RealTime(Time()) ' radio: If IfTime(12,24,hr) Then radioForce = 1 relayControl(RDIO_PWR__CP, battery>radioVlim, radioOnMin, radioPeriod, radioTimer, radioTimerPreset, radioHold, radioForce) If IfTime(30,60,min) AND radioHold AND battery < radioHoldVlim Then radioHold = 0 NextScan SlowSequence Scan(5,sec,0,0) ' rh-power-on: If IfTime(55, 60, sec) Then PortSet(RH_RELAY__CP,1) NextScan SlowSequence Scan(600,sec,0,0) ' soil-moisture-cs616: CS616(sm_cs616(1),SM_QTY,SM1__SE,SM_ENABLE__CP,4,1.0,0) For j=1 To SM_QTY 'convert CS616 period to Volumetric Water Content sm_vwc(j) = SM_A0 + SM_A1 * sm_cs616(j) + SM_A2 * sm_cs616(j)^2 Next ' soil-thermistors: PortSet(MUX_RESET__CP,1) i = 1 SubScan(0,Sec,ST_QTY) PulsePort(MUX_CLOCK__CP,MUX_PULSE_USEC) BrHalf(st_X(i),1,mV2500,MUX_THERM__SE,MUX__EX,1,2500,True,SETTLING_USEC,250,1.0,0) i = i + 1 NextSubScan PortSet(MUX_RESET__CP,0) For i=1 To ST_QTY st_R(i) = R_REF_KOHMS * st_X(i) / (1-st_X(i)) lnR = LN(st_R(i)*1000) st(i) = (1/(kA + kB*lnR + kC*lnR^3)) - 273.15 Next i NextScan EndProg