' pt-aquistar: const CM_PER_PSI = 70.377 ' steinhart_hart: '' constants for GWS thermistors, YSI 44034: const KA = 0.0014654354 : const KB = 0.0002386780 : const KC = 0.0000001000 constTable ' pakbus-info: const PAKBUS_INFO = 175 ' site-info: const SITE_NAME = "Sag River E Bank" const SITE_DESCR = "hydro+cam station" const LATITUDE = 69.94594 const LONGITUDE = -148.66731 const ELEVATION_M = 60 const TZ_HOURS = -9 ' pt-aquistar: const PT_MODL = "INW AquiStar PT12" const PT_QTY = 2 const PT1_SDI_ADDR = 1 const PT2_SDI_ADDR = 2 const SDI12__CP = 3 ' air-hmp45c: const RH_MODL = "HMP45C" 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 ' barometer-cs106: const PB_MODL = "CS106" const PB_UNITS = "mBar" const PB_MULT = 0.24 const PB_OFS = 500 const PB__SE = 4 ' sensor-power-control: const SENSOR_PWR__CP = 4 ' 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 ' thermistor-atb: const ATB_TYPE = "YSI 44034" const ATB__EX = Vx2 const ATB1__SE = 15 const ATB_REF_OHMS = 1000 const ATB_QTY = 2 ' solar-panel: const SPANEL_VDIV__SE = 9 ' 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 endConstTable ' prog-signature: public progSig as long ' utility-vars: dim i ' pt-aquistar: dim pt_output(3) public pt_stage(PT_QTY) : units pt_stage = cm public pt_temp(PT_QTY) : units pt_temp = degC public pt_batt(PT_QTY) : units pt_batt = V public pt_addr(PT_QTY) as long : alias pt_addr = pt1_addr, pt2_addr ' air-hmp45c: public at : units at = degC public rh : units rh = percent public dp : units dp = degC ' barometer-cs106: public pb : units pb = mbar ' wind-rmyoung: public ws : units ws = m/s public wd : units wd = deg ' thermistor-atb: public atb(ATB_QTY) : alias atb = atb1, atb2 : units atb() = degC public atb_R(ATB_QTY) : alias atb_R = atb1_R, atb2_R : units atb_R() = kOhms dim X(ATB_QTY) ' battery: public battery : units battery = Volts ' solar-panel: public solarPanel : units solarPanel = Volts ' logger-panel-temp: public panelTemp : units panelTemp = degC ' 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 ' Diag: prog-signature thermistor-atb battery solar-panel logger-panel-temp DataTable(Diag,1,-1) dataInterval(0,60,Min,0) sample(1,progSig,uint2) sample(ATB_QTY,atb_R,fp2) sample(ATB_QTY,atb,fp2) average(1,battery,fp2,0) average(1,solarPanel,fp2,0) average(1,panelTemp,fp2,0) endTable ' Hydro: prog-signature pt-aquistar DataTable(Hydro,1,-1) dataInterval(0,60,Min,0) sample(1,progSig,uint2) average(PT_QTY,pt_stage,fp2,0) average(PT_QTY,pt_temp,fp2,0) sample(PT_QTY,pt_addr,uint2) endTable ' Hydro-15min: prog-signature pt-aquistar DataTable(Hydro-15min,1,-1) dataInterval(0,15,Min,0) sample(1,progSig,uint2) sample(PT_QTY,pt_stage,fp2) average(PT_QTY,pt_stage,fp2,0) maximum(PT_QTY,pt_stage,fp2,0,0) minimum(PT_QTY,pt_stage,fp2,0,0) sample(PT_QTY,pt_temp,fp2) endTable ' Met: prog-signature air-hmp45c barometer-cs106 wind-rmyoung thermistor-atb DataTable(Met,1,-1) dataInterval(0,60,Min,0) sample(1,progSig,uint2) sample(1,at,fp2) sample(1,rh,fp2) sample(1,dp,fp2) average(1,at,fp2,0) maximum(1,at,fp2,0,0) minimum(1,at,fp2,0,0) average(1,rh,fp2,0) maximum(1,rh,fp2,0,0) minimum(1,rh,fp2,0,0) average(1,dp,fp2,0) maximum(1,dp,fp2,0,0) minimum(1,dp,fp2,0,0) average(1,pb,fp2,0) 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(ATB_QTY,atb,fp2,0) average(ATB_QTY,atb_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 7 and 8 (used for rs232/com4) select case port case 9: portSet(9,state) case 6: portSet(6,state) case 5: portSet(5,state) case 4: portSet(4,state) case 3: portSet(3,state) case 2: portSet(2,state) case 1: portSet(1,state) endSelect endSub beginProg ' for prog-signature: progSig = status.ProgSignature ' for pt-aquistar: pt1_addr = PT1_SDI_ADDR pt2_addr = PT2_SDI_ADDR ' 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 '' NOTE: reordered scan blocks from sagriver-26May2015-34985.cr1 scan(60,sec,0,0) ' pt-aquistar: for i = 1 to PT_QTY SDI12Recorder(pt_output(),SDI12__CP,pt_addr(i),"M!",1.0,0) pt_stage(i) = pt_output(1) * CM_PER_PSI pt_temp(i) = pt_output(2) pt_batt(i) = pt_output(3) next i ' air-hmp45c: 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) ' barometer-cs106: voltSE(pb,1,mV2500,PB__SE,1,0,250,PB_MULT,PB_OFS) ' sensor-power-control: portSet(SENSOR_PWR__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) ' thermistor-atb: brHalf (X(1),ATB_QTY,mV2500,ATB1__SE,ATB__EX,1,2500,True,0,250,1.0,0) for i = 1 to ATB_QTY atb_R(i) = ATB_REF_OHMS * X(i) / (1-X(i)) atb(i) = (1/(KA + KB*ln(atb_R(i)) + KC*ln(atb_R(i))^3)) - 273.15 next i ' battery: battery(battery) ' solar-panel: voltSE(solarPanel,1,mV5000,SPANEL_VDIV__SE,True,0,250,0.01,0) ' logger-panel-temp: panelTemp(panelTemp,250) ' call-datatables: calltable Hydro calltable Hydro-15min calltable Met calltable Diag ' 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 '' NOTE: reordered scan blocks from sagriver-26May2015-34985.cr1 slowSequence scan(2,sec,0,0) ' sensor-power-control: if iftime(58, 60, sec) then portSet(SENSOR_PWR__CP,1) nextScan endProg