'RocheMountMet.cr1 'written by Joel Bailey 7/12/2015 'CR1000 'Created by Short Cut (3.1) '08-13-2015 - Bill Cable added subsurface measurements (Thermistor Probe, 3 Hydra Probes, and 3 thermistors for Hydra Probes) '10-21-2015 - Joel Bailey changed radio on off period to hourly, added line to reset modemForce every minute '09-20-2016 - Joel Bailey added SR50a and ATB_2M '\\\\\\\\\\\\\\\\\\\\\\\\\\\\ WIRING //////////////////////////// 'CR1000 '**SE Channel '1 - Air Temp '2 - RH probe '3 - NR-lite (H) '4 - NR-lite (L) '5 - ATB_2m 109 probe Red wire '6 - '7 - '8 - RMYoung WD Green '9 - '10 - '11 - '12 - '13 - '14 - '15 - '16 - Multiplexer H1 - Ref. Resistor to Vx1 '**Vx '1 - Thermistor Probes - Ref. Resistor to SE16 '2 - RMYoung WD Blue '3 - ATB_2m 109 probe Black wire '**Control Ports '1 - Multiplexer Reset '2 - Multiplexer Clk '3 - SR50A '4 - RH relay '5 - '6 - Iridium Control '7 - Hydra Probes (blue) '8 - external SW12V for Hydra Probes (red) '9 '**Pulse Ports '1 - tipping bucket '2 - RMYOUNG wind speed Red '**Multiplexer 'H - Thermistor Probe signal 'L - not used ' Thermistor Probes 'therm depth wire color ' 1 2 blue ' 2 5 white ' 3 10 orange ' 4 15 white ' 5 20 green ' 6 25 white ' 7 30 brown ' 8 35 white ' 9 40 slate ' 10 50 white ' 11 60 blue ' 12 70 red ' 13 80 orange ' 14 100 red ' 15 125 green ' 16 150 red ' signal ground black & black ' Soil Pit Thermistor Triples ' therm wire color ' 1 white ' 2 red ' 3 green ' signal ground black ConstTable Const PAKBUS_INFO = 147 Const P_MODL = "TE525MM" Const P_TIP = 0.1 Const P_UNITS = "mm" Const P__PP = 1 Const RH_RELAY__CP = 4 Const RH_MODL = "HP45C" Const RH_SN = "" 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 ATB_MODL = "Therm109" Const ATB_SN = "" Const ATB_MULT = 1 Const ATB_OFS = 0 Const ATB__SE = 5 Const ATB__EX = Vx3 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 = 2 Const WD__SE = 8 Const WD__EX = VX2 Const NR_MODL = "NR-LITE" Const NR_SN = "" Const NR_CALIB = 14.6 Const NR_CALIB_UNITS = "uV/W/m^2" Const NR_UNITS = "W/m^2" Const NR__DIFF = 2 Const MODM_PWR__CP = 6 Const MODM_MODL = "Iridium" Const MODM_SN = "" 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 SNW_MODL = "SR50A" Const SNW_SN = "" Const SNW_HT_CM = 135 Const SNW_SDI_ADDR = 0 Const SDI12__CP = 3 EndConstTable 'Constants for Subsurface Measurements 'Steinhart-Hart Fit Constants Const C1 = 0.0011281 Const C2 = 0.0002343 Const C3 = 0.000000086946 'Fixed resistor value Const Rf = 25000 ' base: Public progSig As Long 'Declare Variables and Units Dim AirTC Public BattV Public PTemp_C Public at Public rh Public precip Public ws Public wd Public netRadRaw Public netRad Public dp 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 'Subsurface Measurements Public TempHydra(3), TempHydra_offset(3) Public Hydra(3,9) '9 parameters from the Hydra Probe's II Public TP1_Rt, TP1_ratio, TP1_temp(16), TP1_offset(16) Dim i,k Alias Hydra(1,1)=HydraMoisture1 Alias Hydra(2,1)=HydraMoisture2 Alias Hydra(3,1)=HydraMoisture3 Units BattV=Volts Units PTemp_C=Deg C Units at=Deg C Units rh=% Units precip=mm Units ws=meters/second Units wd=degrees Units netRadRaw=W/m^2 Units netRad=Watts/meter^2 Units dp=Deg C Units atb=Deg C Units snowdepth = cm 'Define Data Tables DataTable(Daily,True,-1) DataInterval(0,1,Day,10) Totalize(1,precip,FP2,False) Average(1,at,FP2,False) Average(1,ws,FP2,False) Average(1,netRad,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,snowdepth,FP2,False) EndTable DataTable(HrlyDiag,True,-1) DataInterval(0,60,Min,10) Minimum(1,BattV,FP2,False,False) Average(1,BattV,FP2,False) Average(1,PTemp_C,FP2,False) EndTable DataTable(HrlyAtms,True,-1) DataInterval(0,60,Min,10) 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) Maximum(1,ws,FP2,False,False) Average(1,netRad,FP2,False) Average(1,dp,FP2,False) Sample(1,dp,FP2) Minimum(1,dp,FP2,False,False) Maximum(1,dp,FP2,False,False) Sample(1,wd,fp2) WindVector(1,ws,wd,fp2,0,0,0,0) Sample(1,atb,fp2) Average(1,atb,fp2,0) Minimum(1,atb,fp2,0,0) Maximum(1,atb,fp2,0,0) Average(1,snowdepth,fp2,0) EndTable DataTable(Met,True,-1) DataInterval(0,60,Min,10) Totalize(1,precip,FP2,False) Average(1,at,FP2,False) Sample(1,rh,FP2) Average(1,ws,FP2,False) Average(1,netRad,FP2,False) Average(1,atb,FP2,False) Average(1,snowdepth,FP2,False) EndTable DataTable(SubSurf,True,-1) DataInterval(0,60,Min,10) Average(16,TP1_temp(),FP2,False) Average(3,TempHydra(),FP2,False) Average(1,Hydra(1,1),FP2,False) 'soil moisture Average(1,Hydra(2,1),FP2,False) 'soil moisture Average(1,Hydra(3,1),FP2,False) 'soil moisture 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 thisHour=12 AND thisMinute<10 Then Call setRelayState(relayPort,1) If thisMinute MOD period = onMin AND BattV >= Vlimit Then Call setRelayState(relayPort,1) If thisMinute MOD period = onMin AND BattV < 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 = 5 Then PortSet(5,state) Else If relay = 4 Then PortSet(4,state) Else If relay = 3 Then PortSet(3,state) Else If relay = 2 Then PortSet(2,state) Else If relay = 1 Then PortSet(1,state) EndIf EndSub 'Main Program BeginProg 'Offsets for subsurface measurements 'can't declare arrays of constants so have to do it this way 'Thermistor Tripple #TT1204 TempHydra_offset(1) = 0.012 TempHydra_offset(2) = 0.033 TempHydra_offset(3) = 0.055 'Thermistor Probe offsets #1214 TP1_offset(1) = -0.011 TP1_offset(2) = 0.088 TP1_offset(3) = 0.013 TP1_offset(4) = 0.058 TP1_offset(5) = 0.031 TP1_offset(6) = 0.016 TP1_offset(7) = 0.049 TP1_offset(8) = -0.004 TP1_offset(9) = -0.013 TP1_offset(10) = -0.003 TP1_offset(11) = 0.081 TP1_offset(12) = 0.034 TP1_offset(13) = 0.024 TP1_offset(14) = 0.025 TP1_offset(15) = 0.046 TP1_offset(16) = 0.024 ' for base: progSig = status.ProgSignature 'for sr50a 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 'Main Scan Scan(60,Sec,1,0) 'Default Datalogger Battery Voltage measurement 'BattV' Battery(BattV) 'Default Wiring Panel Temperature measurement 'PTemp_C' PanelTemp(PTemp_C,_60Hz) 'HMP45C (6-wire, panel switched power) Temperature & Relative Humidity Sensor measurements 'at' and 'rh' PortSet(RH_RELAY__CP,1) Delay(0,150,mSec) VoltSe(at,1,mV2500,AT__SE,0,0,_60Hz,AT_MULT,AT_OFS) VoltSe(rh,1,mV2500,RH__SE,0,0,_60Hz,RH_MULT,RH_OFS) PortSet(RH_RELAY__CP,0) 'TE525MM/TE525M Rain Gauge measurement 'precip' PulseCount(precip,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-LITE Net Radiometer (dynamic wind speed correction) measurement 'netRadRaw' and 'netRad' VoltDiff(netRadRaw,1,mv25,NR__DIFF,True,0,_60Hz,84.03362,0) If ws>=5 Then netRad=netRadRaw*(1+0.021286*(ws-5)) Else netRad=netRadRaw EndIf 'Dew Point calculation 'dp' AirTC=at DewPoint(dp,AirTC,rh) If dp>AirTC OR dp=NAN Then dp=AirTC ' 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()) ' modem: relayControl(MODM_PWR__CP,modemOnMin,modemOffMin,modemPeriod,modemVlim,modemHldVlim,modemHold,modemForce) modemForce=0 'Subsurface Measurements 'measure thermistor probe and 3 thermistors for soil pit on multiplexer PortSet(1,1) 'Multiplexer ON i = 1 SubScan(0,uSec,16) 'for thermistor probe PulsePort(2,10000) BrHalf (TP1_ratio,1,mV2500,16,Vx1,1,2500,False,0,250,1.0,0) TP1_Rt = Rf*(TP1_ratio/(1-TP1_ratio)) 'calculate resistance TP1_temp(i) = 1/(C1+C2*LN(TP1_Rt)+C3*LN(TP1_Rt)^3) - 273.15 - TP1_offset(i) 'calculate temperature with correction for zero offset i = i+1 NextSubScan i = 1 SubScan(0,uSec,3) 'for thermistor tripple PulsePort(2,10000) BrHalf (TP1_ratio,1,mV2500,16,Vx1,1,2500,False,0,250,1.0,0) TP1_Rt = Rf*(TP1_ratio/(1-TP1_ratio)) 'calculate resistance TempHydra(i) = 1/(C1+C2*LN(TP1_Rt)+C3*LN(TP1_Rt)^3) - 273.15 - TempHydra_offset(i) 'calculate temperature with correction for zero offset i = i+1 NextSubScan PortSet(1,0) 'Multiplexer OFF 'Hydra II Probes If TimeIntoInterval(0,60,Min) Then PortSet(8,1) 'power on Delay (0,5,Sec) k = 1 SubScan(0,uSec,3) SDI12Recorder (Hydra(k,1),7,k,"M!",1.0,0) 'read 9 soil parameters k = k+1 NextSubScan PortSet(8,0) 'power off EndIf 'Call Data Tables and Store Data CallTable Daily CallTable HrlyDiag CallTable HrlyAtms CallTable Met CallTable SubSurf CallTable SR50 NextScan EndProg