'CR1000 'Created by Short Cut (2.9) '10-22-2012 changed from a 3 to 5 second delay to HC2S3 '08-23-2013 added email send features '08-28-2013 fixed email features '03-26-2014 moved SM__CP to CP8, connected camera to COM3(CP5, CP6) '09-17-2014 removed the time requirments for modem, now modem will stay on when above a certain voltage '10-07-2014 added statement to void false readings of the SR50A '07-30-2015 removed email features '' 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 '' Steinhart & Hart constants for YSI44033, calculated on host hayes: '' steinhart-hart-constants -10.00 16598.58 0.00 9795.00 10.00 5970.16 Const YSI_kA = 0.00147 Const YSI_kB = 0.000239 Const YSI_kC = 0.00000010002 ConstTable Const PAKBUS_INFO = 1 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_1M__SE = 2 Const RH_2M__SE = 6 Const RH_1M_MODL = "HC2S3" Const RH_1M_SN = "" Const RH_1M_MULT = 0.1 Const RH_1M_OFS = 0 Const RH_2M_MODL = "HC2S3" Const RH_2M_SN = "" Const RH_2M_MULT = 0.1 Const RH_2M_OFS = 0 Const AT_1M_MULT = 0.1 Const AT_1M_OFS = -50 Const AT_1M__SE = 1 Const AT_2M_MULT = 0.1 Const AT_2M__SE = 5 Const AT_2M_OFS = -50 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 SR__DIFF = 2 Const THERMISTOR_TYPE = "PS302J2" Const THERMISTOR_QTY = 15 Const MUX_THERM__SE = 16 Const MUX_RESET__CP = 1 Const MUX_CLOCK__CP = 2 Const MUX__EX = Vx2 Const R_REF_OHMS = 15000 Const SM_MODL = "CS616" Const SM_10CM__SE = 13 Const SM_20CM__SE = 14 Const SM_40CM__SE = 15 Const SM__CP = 8 Const SD__AD = 0 Const SD_Height= 1.276 Const SDI__CP = 7 Const MODM_PWR__CP = 9 Const MODM_MODL = "RAVENXTG" Const MODM_SN = "" Const MODM_V_LIM = 12.4 EndConstTable 'Declare Variables and Units Public BattV Public PTemp_C Public at_1m Public at_2m Public rh_1m Public rh_2m Public dp Public precip Public precip_hrly_total Public sr Public sr_kJ Public WS Public wd Public sm_10cm_VW Public sm_10cm_PA_uS Public sm_20cm_VW Public sm_20cm_PA_uS Public sm_40cm_VW Public sm_40cm_PA_uS Public sd(2) Public sd_tcd Public snowdepth Public new_snowdepth Public Therm(15) Public Therm_r(15) Dim i, Therm_X(15) Public SolarPnlV Public Mult(15)={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} Public Offs(15)={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} Dim Time(9) Public modemVlim Alias sd(1) = Raw_Dist Alias sd(2) = SignalQuality Alias Time(4) = thisHour Alias Time(5) = thisMinute Alias Time(9) = thisDOY Alias Therm(1)=st_2cm Alias Therm(2)=st_5cm Alias Therm(3)=st_10cm Alias Therm(4)=st_15cm Alias Therm(5)=st_20cm Alias Therm(6)=st_30cm Alias Therm(7)=st_40cm Alias Therm(8)=st_50cm Alias Therm(9)=st_75cm Alias Therm(10)=st_100cm Alias Therm(11)=st_125cm Alias Therm(12)=st_150cm Alias Therm(13)=SST Alias Therm(14)=ATB_1M Alias Therm(15)=ATB_2M Units BattV=Volts Units PTemp_C=Deg C Units at_1m=Deg C Units at_2m=Deg C Units rh_1m=% Units rh_2m=% Units precip=mm Units precip_hrly_total=mm Units sr=W/m^2 Units sr_kJ=kJ/m^2 Units snowdepth=meters Units WS=meters/second Units wd=degrees Units sm_10cm_PA_uS=uSec Units sm_20cm_PA_uS=uSec Units sm_40cm_PA_uS=uSec Units dp=Deg C Units SolarPnlV=V Units st_2cm=degC Units st_5cm=degC Units st_10cm=degC Units st_15cm=degC Units st_20cm=degC Units st_30cm=degC Units st_40cm=degC Units st_50cm=degC Units st_75cm=degC Units st_100cm=degC Units st_125cm=degC Units st_150cm=degC Units SST=degC Units ATB_1M=degC Units ATB_2M=degC 'Define Data Tables DataTable(HrlyAtms,True,-1) DataInterval(0,60,Min,10) Totalize(1,precip,FP2,False) Sample(1,at_1m,FP2) Average(1,at_1m,FP2,False) Minimum(1,at_1m,FP2,False,False) Maximum(1,at_1m,FP2,False,False) Sample(1,at_2m,FP2) Average(1,at_2m,FP2,False) Minimum(1,at_2m,FP2,False,False) Maximum(1,at_2m,FP2,False,False) Sample(1,rh_1m,FP2) Minimum(1,rh_1m,FP2,False,False) Maximum(1,rh_1m,FP2,False,False) Sample(1,rh_2m,FP2) Minimum(1,rh_2m,FP2,False,False) Maximum(1,rh_2m,FP2,False,False) Sample(1,dp,FP2) Average(1,dp,FP2,False) Minimum(1,dp,FP2,False,False) Maximum(1,dp,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,ATB_1M,FP2) Average(1,ATB_1M,FP2,False) Minimum(1,ATB_1M,FP2,False,False) Maximum(1,ATB_1M,FP2,False,False) Sample(1,ATB_2M,FP2) Average(1,ATB_2M,FP2,False) Minimum(1,ATB_2M,FP2,False,False) Maximum(1,ATB_2M,FP2,False,False) Sample(1,snowdepth,FP2) Average(1,sr,FP2,False) EndTable DataTable(Daily,True,-1) DataInterval(0,1440,Min,10) Totalize(1,precip,FP2,False) Average(1,at_1m,FP2,False) Average(1,at_2m,FP2,False) WindVector (1,WS,wd,FP2,False,0,0,0) FieldNames("WS_S_WVT,WindDir_D1_WVT,WindDir_SD1_WVT") Average(1,ATB_1M,FP2,False) Average(1,ATB_2M,FP2,False) Average(1,sr,FP2,False) EndTable DataTable(HrlyDiag,True,-1) DataInterval(0,60,Min,10) Average(1,BattV,FP2,False) Average(1,SolarPnlV,FP2,False) Average(1,PTemp_C,FP2,False) EndTable DataTable(HrlySoil,True,-1) DataInterval(0,60,Min,10) Sample(1,SST,FP2) Average(1,SST,FP2,False) Maximum(1,SST,FP2,False,False) Minimum(1,SST,FP2,False,False) Average(1,st_2cm,FP2,False) Average(1,st_5cm,FP2,False) Average(1,st_10cm,FP2,False) Average(1,st_15cm,FP2,False) Average(1,st_20cm,FP2,False) Average(1,st_30cm,FP2,False) Average(1,st_40cm,FP2,False) Average(1,st_50cm,FP2,False) Average(1,st_75cm,FP2,False) Average(1,st_100cm,FP2,False) Average(1,st_125cm,FP2,False) Average(1,st_150cm,FP2,False) Average(1,sm_10cm_VW,FP2,False) Average(1,sm_20cm_VW,FP2,False) Average(1,sm_40cm_VW,FP2,False) Average(1,sm_10cm_PA_uS,FP2,False) Average(1,sm_20cm_PA_uS,FP2,False) Average(1,sm_40cm_PA_uS,FP2,False) EndTable DataTable(Met,True,-1) DataInterval(0,60,Min,10) Totalize(1,precip,FP2,False) Average(1,at_1m,FP2,False) Average(1,at_2m,FP2,False) Sample(1,rh_1m,FP2) Sample(1,rh_2m,FP2) WindVector (1,WS,wd,FP2,False,0,0,0) FieldNames("WS_S_WVT,WindDir_D1_WVT,WindDir_SD1_WVT") Average(1,ATB_1M,FP2,False) Average(1,ATB_2M,FP2,False) Average(1,sr,FP2,False) EndTable ' Therm-R: base thermistors DataTable(Therm_r,1,-1) DataInterval(0,60,Min,0) Average(THERMISTOR_QTY,Therm_r(),ieee4,0) EndTable ' relay-control-sub:relayControl() Sub relayControl(relayPort,Vlimit) ' uses globals thisMinute, BattV If BattV >= Vlimit AND IfTime(0,60,Min) Then Call setRelayState(relayPort,1) If IfTime(15,60,Min) 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 = 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 ' thermistors:calc_thermistors() Sub calc_thermistors() Dim j,k,lnR For j=1 To 12 '' calculate thermistor resistance from ratio and ref R: Therm_r(j) = R_REF_OHMS * Therm_X(j) / (1-Therm_X(j)) '' calculate natural log of thermistor resistance: lnR = LN(Therm_r(j)) '' use Steinhart & Hart equation to derive temperature: Therm(j) = (1/(kA + kB*lnR + kC*lnR^3)) - 273.15 Next j ' calculate three YSI 44033 thermistors For k=13 To 15 '' calculate thermistor resistance from ratio and ref R: Therm_r(k) = R_REF_OHMS * Therm_X(k) / (1-Therm_X(k)) '' calculate natural log of thermistor resistance: lnR = LN(Therm_r(k)) '' use Steinhart & Hart equation to derive temperature: Therm(k) = (1/(YSI_kA + YSI_kB*lnR + YSI_kC*lnR^3)) - 273.15 Next k EndSub 'Main Program BeginProg ' for modem: modemVlim = MODM_V_LIM ' for camera communication SerialOpen(Com3,115200,4,0,1000) 'Main Scan Scan(60,Sec,1,0) 'Default Datalogger Battery Voltage measurement 'BattV' Battery(BattV) ' for camera communication SerialOpen(Com3,115200,4,0,1000) 'Default Wiring Panel Temperature measurement 'PTemp_C' PanelTemp(PTemp_C,250) 'HC2S3 (panel switched power) Temperature & Relative Humidity Sensor measurements 'at' and 'RH' PortSet(RH_RELAY__CP,1) Delay(0,5,Sec) VoltSe(at_1m,1,mV2500,AT_1M__SE,1,0,250,AT_1M_MULT,AT_1M_OFS) VoltSe(at_2m,1,mV2500,AT_2M__SE,1,0,250,AT_2M_MULT,AT_2M_OFS) VoltSe(rh_1m,1,mV2500,RH_1M__SE,1,0,250,RH_1M_MULT,RH_1M_OFS) VoltSe(rh_2m,1,mV2500,RH_2M__SE,1,0,250,RH_2M_MULT,RH_2M_OFS) PortSet(RH_RELAY__CP,0) If rh_1m>100 AND rh_1m<103 Then rh_1m=100 If rh_2m>100 AND rh_2m<103 Then rh_2m=100 'TE525MM/TE525M Rain Gauge measurement 'precip' PulseCount(precip,1,P__PP,2,0,P_TIP,0) precip_hrly_total = precip + precip_hrly_total If IfTime(0,1,Hr) precip_hrly_total = 0 EndIf 'CMP3/CMP6/CMP11 Pyranometer measurements 'nr_SlrkJ' and 'nr' VoltDiff(sr,1,mV25,SR__DIFF,True,0,250,1,0) If sr<0 Then sr=0 sr_kJ=sr*3.773585 sr=sr*62.89308 '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,1,0,250,WD_MULT,WD_OFS) If wd>=360 Then wd=0 'Dew Point calculation 'dp' DewPoint(dp,at_1m,rh_1m) If dp>at_1m OR dp=NAN Then dp=at_1m 'Generic Single-Ended Voltage measurements 'SolarPnlV' VoltSe(SolarPnlV,1,mV5000,SPANEL_VDIV__SE,True,0,_60Hz,0.01,0) 'CS616 Water Content Reflectometer measurements 'sm_10cm_VW' and 'sm_10cm_PA_uS' If IfTime(0,1,Hr) Then CS616(sm_10cm_PA_uS,1,SM_10CM__SE,SM__CP,1,1,0) sm_10cm_VW=-0.0663+(-0.0063*sm_10cm_PA_uS)+(0.0007*sm_10cm_PA_uS^2) EndIf 'CS616 Water Content Reflectometer measurements 'sm_20cm_VW' and 'sm_20cm_PA_uS' If IfTime(0,1,Hr) Then CS616(sm_20cm_PA_uS,1,SM_20CM__SE,SM__CP,1,1,0) sm_20cm_VW=-0.0663+(-0.0063*sm_20cm_PA_uS)+(0.0007*sm_20cm_PA_uS^2) EndIf 'CS616 Water Content Reflectometer measurements 'sm_40cm_VW' and 'sm_40cm_PA_uS' If IfTime(0,1,Hr) Then CS616(sm_40cm_PA_uS,1,SM_40CM__SE,SM__CP,1,1,0) sm_40cm_VW=-0.0663+(-0.0063*sm_40cm_PA_uS)+(0.0007*sm_40cm_PA_uS^2) EndIf 'Measure SR50A SDI12Recorder(sd(),SDI__CP,SD__AD,"M1!",1,0) sd_tcd=Raw_Dist*(SQR((at_1m+273.15)/273.15)) new_snowdepth=SD_Height-sd_tcd 'will remove bad readings If new_snowdepth < 1.25 Then snowdepth = new_snowdepth EndIf ' time-variables: RealTime(Time()) ' modem: relayControl(MODM_PWR__CP,modemVlim) 'Call Data Tables and Store Data CallTable(HrlyAtms) CallTable(Daily) CallTable(HrlyDiag) CallTable(Met) CallTable(HrlySoil) NextScan SlowSequence Scan(600,sec,0,0) 'Turn AM16/32 Multiplexer On PortSet(MUX_RESET__CP,1) i=1 SubScan(0,uSec,THERMISTOR_QTY) 'Switch to next AM16/32 Multiplexer channel PulsePort(MUX_CLOCK__CP,10000) 'Generic Differential Voltage measurements 'DiffV()' on the AM16/32 Multiplexer BrHalf(Therm_X(i),1,mV2500,MUX_THERM__SE,MUX__EX,1,2500,True,0,250,1.0,0) i=i+1 NextSubScan 'Turn AM16/32 Multiplexer Off PortSet(MUX_RESET__CP,0) 'run subroutine to calculate degrees for each thermistor calc_thermistors() 'call soil tables CallTable(HrlySoil) CallTable(Therm_r) NextScan EndProg