fullbanner

Solar 2-Axis Tracking Fixed

Nov 17th, 2021 (edited)
610
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.11 KB | None | 1 0
  1. # Tallinu's Improved, Configurable, Spin-Glitchless
  2. # Two Axis Solar Tracking with Night Park
  3. # XHead changed only sensor required
  4. # -- Configure for your build before use! --
  5.  
  6. # Daylight sensor should face UP.
  7.  
  8. # Which side is each device's port on?
  9. # For 2-port solar panels, use the POWER port!
  10. # Replace 9 with 0=North, 1=West, 2=South, 3=East
  11. define SensorPortDirection 9 # Daylight Sensor
  12. define PanelPortDirection 9 # Solar Panels
  13.  
  14. # -- No configuration beyond this point. --
  15.  
  16. define hashDoublePanel -539224550
  17. define hashSinglePanel -2045627372
  18. alias dDaylightSensor d0
  19. alias rAngle r0
  20. alias rNightMode r1
  21. alias rNightModeSet r11
  22. alias rSensorAngle r14
  23. alias rPanelAngle r15
  24.  
  25. #Init H rotation offset for solar panel placement
  26. mul rPanelAngle PanelPortDirection 90
  27. #Solar panel V axis is perpendicular to port
  28. sub rPanelAngle rPanelAngle 90
  29. #Keep offset within -180 to 180
  30. add rPanelAngle rPanelAngle 180
  31. mod rPanelAngle rPanelAngle 360
  32. sub rPanelAngle rPanelAngle 180
  33. #Init daylight sensor rotation offset
  34. mul rSensorAngle SensorPortDirection 90
  35. #Config Check
  36. bltz SensorPortDirection ConfigError
  37. bgt SensorPortDirection 3 ConfigError
  38. bltz PanelPortDirection ConfigError
  39. bgt PanelPortDirection 3 ConfigError
  40. #Hardware check, DS required
  41. bdns dDaylightSensor SensorError
  42.  
  43. Loop:
  44. #Get Vertical angle from sensor
  45. l rAngle dDaylightSensor Vertical
  46. #If abs rAngle > 90, sun is below horizon. Unlike
  47. #"Activate," this test isn't fooled by mountains!
  48. abs rNightMode rAngle #Weak typing allows temp use
  49. sgt rNightMode rNightMode 90 #1=night, 0=day
  50. and rNightModeSet rNightMode rNightModeSet
  51. beq rNightModeSet 1 Loop
  52. #Convert to panel's 150 degree percent-based range
  53. sub rAngle 75 rAngle
  54. div rAngle rAngle 1.5 #Result should be 50 or less
  55. #Clamp value to the bounds 0-100
  56. max rAngle rAngle 0 #Otherwise, <0 near dawn/dusk.
  57. min rAngle rAngle 100 #This "shouldn't" happen...
  58. #Write vertical to solar panels
  59. sb hashDoublePanel Vertical rAngle
  60. sb hashSinglePanel Vertical rAngle
  61. yield
  62.  
  63. #Checking DS "Activate" state is unnecessary, since
  64. #we've determined if sun is up from vertical angle.
  65. #At night, don't care what H angle it would report.
  66. #Pre-load horizontal angle for East for simplicity.
  67. move rAngle -90
  68. #If it's night, skip to panel offset.
  69. bnez rNightMode SkipHereAtNight
  70. #Get Horizontal from sensor
  71. l rAngle dDaylightSensor Horizontal
  72. #Virtually rotate readings so 0 occurs at noon
  73. #and the jump between - and + is at midnight.
  74. add rAngle rAngle rSensorAngle
  75. #Keep rAngle between -180 and +180
  76. add rAngle rAngle 180
  77. mod rAngle rAngle 360
  78. sub rAngle rAngle 180
  79. SkipHereAtNight:
  80. snez rNightModeSet rNightMode
  81. #Add panel placement offset
  82. #Combined value ranges -360 to 360
  83. add rAngle rAngle rPanelAngle
  84. #Write horizontal angle to solar panels
  85. sb hashDoublePanel Horizontal rAngle
  86. sb hashSinglePanel Horizontal rAngle
  87. yield
  88.  
  89. #Repeat forever
  90. j Loop
  91.  
  92. SensorError:
  93. #Daylight sensor not assigned, fix and reset IC
  94. s db Setting 9001
  95. s db Error 1 #Writing to this is not allowed, LOL.
  96. ConfigError:
  97. #Did Not Read The Instructions
  98. s db Setting 8001
  99. s db Error 1 #Which includes a line number. Bonus!
Advertisement
Add Comment
Please, Sign In to add comment