' add wind turbine current, diff4 measures V across 10 mOhm shunt on return line ' add C40 charge controller with 4 Ohm load, measure V across 1 Ohm ' steinhart_hart: '' Steinhart & Hart constants for GWS thermistors const KA = 0.0014654354 const KB = 0.0002386780 const KC = 0.0000001000 constTable ' pakbus-info: Const PAKBUS_INFO = 175 ' site-info: const SITE_NAME = "Franklin Bluffs Cam/Repeater Station" const SITE_DESCR = "repeater+cam station" const LATITUDE = 69.94476 const LONGITUDE = -148.67146 const ELEVATION_M = 60 const TZ_HOURS = -9 ' rh-pwr-on: const RH_RELAY__CP = 1 ' 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 ' 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 ' sun-elevation: const SUN_ELEV_MIN_DEG = -10 ' camera-cc640: const CAM_MODL = "CC640" const CAM_QTY = 3 const CAM_OFS_MIN = 0 const CAM_PERIOD_MIN = 60 const CAM_TRIG__CP = 2 const CAM_TRIG_USEC = 10000 ' 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 Const WT_MODL="Forgen 500LT" Const WT_SHUNT_mOHMS=10 Const WT_SHUNT__DIFF=4 Const DUMPLOAD_MODL="Xantrex C40, 4 Ohms" Const DUMPLOAD__DIFF=6 EndConstTable ' prog-signature: Public progSig As Long ' utility-vars: Dim i ' air-hmp45c: 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 ' forgen VAWT wind turbine Public wt_current : Units wt_current=mA ' dump load current from C40 charge controller Public dumpload_current : Units dumpload_current=mA ' 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 atb_X(2) ' battery: Public battery : Units battery = Volts ' solar-panel: Public solarPanel : Units solarPanel = Volts ' logger-panel-temp: Public panelTemp : Units panelTemp = degC ' sun-elevation: Public solarpos(5) Alias solarpos = sun_azimuth, sun_elevation, hr_angle, declination, air_mass Public sun_elev_setpt ' camera-cc640: Public camOfs As Long Public camPeriod As Long Public takePicture As Boolean Public camForce As Boolean ' 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 ' Met: prog-signature air-hmp45c 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) 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 DataTable(Power-avg,1,-1) DataInterval(0,15,Min,0) Sample(1,progSig,uint2) Average(1,battery,fp2,0) Average(1,solarPanel,fp2,0) Average(1,ws,fp2,0) Average(1,wt_current,fp2,0) Average(1,dumpload_current,fp2,0) EndTable DataTable(Power-max,1,-1) DataInterval(0,15,Min,0) Sample(1,progSig,uint2) Maximum(1,battery,fp2,0,0) Maximum(1,solarPanel,fp2,0,0) Maximum(1,ws,fp2,0,0) Maximum(1,wt_current,fp2,0,0) Maximum(1,dumpload_current,fp2,0,0) EndTable ' steinhart_hart:therm_X_to_R_T() Sub therm_X_to_R_T( X, refOhms, R, T ) R = refOhms * X / (1-X) T = (1/(KA + KB*LN(R) + KC*LN(R)^3)) - 273.15 EndSub ' 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 sun-elevation: sun_elev_setpt = SUN_ELEV_MIN_DEG ' for camera-cc640: camOfs = CAM_OFS_MIN camPeriod = CAM_PERIOD_MIN ' 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(5,sec,0,0) ' battery: battery(battery) ' solar-panel: VoltSe(solarPanel,1,mV5000,SPANEL_VDIV__SE,True,0,250,0.01,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) ' wind turbine: VoltDiff(wt_current,1,mv2500C,WT_SHUNT__DIFF,True,0,250,1/WT_SHUNT_mOHMS,0) ' C40 dump load, read voltage across 1Ohm R, convert to current: VoltDiff(dumpload_current,1,mV5000,DUMPLOAD__DIFF,True,0,250,1,0) CallTable power-avg CallTable power-max NextScan SlowSequence Scan(60,sec,0,0) ' rh-pwr-on: PortSet(RH_RELAY__CP,1) Delay(0,2000,mSec) ' 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) ' rh-pwr-off: PortSet(RH_RELAY__CP,0) ' thermistor-atb: BrHalf (atb_X(1),ATB_QTY,mV2500,ATB1__SE,ATB__EX,1,2500,True,0,250,1.0,0) For i = 1 To ATB_QTY therm_X_to_R_T(atb_X(i),ATB_REF_OHMS,atb_R(i),atb(i)) Next i ' logger-panel-temp: panelTemp(panelTemp,250) ' call-datatables: CallTable Met CallTable Diag ' sun-elevation: SolarPosition(solarpos, -1, TZ_HOURS*3600, LATITUDE, LONGITUDE, ELEVATION_M, -1, at) ' camera-cc640: If IfTime(camOfs,camPeriod,min) Then takePicture = 1 If IfTime(720,1440,min) Then takePicture = 1 If takePicture Then If sun_elevation >= sun_elev_setpt OR camForce Then PulsePort(CAM_TRIG__CP,CAM_TRIG_USEC) EndIf takePicture = 0 EndIf ' 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 EndProg