Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Tallinu's Improved, Configurable, Spin-Glitchless
- # Two Axis Solar Tracking with Night Park
- # XHead changed only sensor required
- # -- Configure for your build before use! --
- # Daylight sensor should face UP.
- # Which side is each device's port on?
- # For 2-port solar panels, use the POWER port!
- # Replace 9 with 0=North, 1=West, 2=South, 3=East
- define SensorPortDirection 9 # Daylight Sensor
- define PanelPortDirection 9 # Solar Panels
- # -- No configuration beyond this point. --
- define hashDoublePanel -539224550
- define hashSinglePanel -2045627372
- alias dDaylightSensor d0
- alias rAngle r0
- alias rNightMode r1
- alias rNightModeSet r11
- alias rSensorAngle r14
- alias rPanelAngle r15
- #Init H rotation offset for solar panel placement
- mul rPanelAngle PanelPortDirection 90
- #Solar panel V axis is perpendicular to port
- sub rPanelAngle rPanelAngle 90
- #Keep offset within -180 to 180
- add rPanelAngle rPanelAngle 180
- mod rPanelAngle rPanelAngle 360
- sub rPanelAngle rPanelAngle 180
- #Init daylight sensor rotation offset
- mul rSensorAngle SensorPortDirection 90
- #Config Check
- bltz SensorPortDirection ConfigError
- bgt SensorPortDirection 3 ConfigError
- bltz PanelPortDirection ConfigError
- bgt PanelPortDirection 3 ConfigError
- #Hardware check, DS required
- bdns dDaylightSensor SensorError
- Loop:
- #Get Vertical angle from sensor
- l rAngle dDaylightSensor Vertical
- #If abs rAngle > 90, sun is below horizon. Unlike
- #"Activate," this test isn't fooled by mountains!
- abs rNightMode rAngle #Weak typing allows temp use
- sgt rNightMode rNightMode 90 #1=night, 0=day
- and rNightModeSet rNightMode rNightModeSet
- beq rNightModeSet 1 Loop
- #Convert to panel's 150 degree percent-based range
- sub rAngle 75 rAngle
- div rAngle rAngle 1.5 #Result should be 50 or less
- #Clamp value to the bounds 0-100
- max rAngle rAngle 0 #Otherwise, <0 near dawn/dusk.
- min rAngle rAngle 100 #This "shouldn't" happen...
- #Write vertical to solar panels
- sb hashDoublePanel Vertical rAngle
- sb hashSinglePanel Vertical rAngle
- yield
- #Checking DS "Activate" state is unnecessary, since
- #we've determined if sun is up from vertical angle.
- #At night, don't care what H angle it would report.
- #Pre-load horizontal angle for East for simplicity.
- move rAngle -90
- #If it's night, skip to panel offset.
- bnez rNightMode SkipHereAtNight
- #Get Horizontal from sensor
- l rAngle dDaylightSensor Horizontal
- #Virtually rotate readings so 0 occurs at noon
- #and the jump between - and + is at midnight.
- add rAngle rAngle rSensorAngle
- #Keep rAngle between -180 and +180
- add rAngle rAngle 180
- mod rAngle rAngle 360
- sub rAngle rAngle 180
- SkipHereAtNight:
- snez rNightModeSet rNightMode
- #Add panel placement offset
- #Combined value ranges -360 to 360
- add rAngle rAngle rPanelAngle
- #Write horizontal angle to solar panels
- sb hashDoublePanel Horizontal rAngle
- sb hashSinglePanel Horizontal rAngle
- yield
- #Repeat forever
- j Loop
- SensorError:
- #Daylight sensor not assigned, fix and reset IC
- s db Setting 9001
- s db Error 1 #Writing to this is not allowed, LOL.
- ConfigError:
- #Did Not Read The Instructions
- s db Setting 8001
- s db Error 1 #Which includes a line number. Bonus!
Advertisement
Add Comment
Please, Sign In to add comment