Advertisement
Ubidibity

turbine.lua

May 21st, 2025 (edited)
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.30 KB | Gaming | 0 0
  1. -- Groks sixth revision for a simple reactor/turbine control program for my unique ATM10 setup.
  2. -- we're getting close!  Asked for some monitor tweaks for my 3x4 (WxH) monitor and better energy reporting
  3. -- since I have a reinforced reactor but a basic turbine I'm trying to work around that at this state by using
  4. -- flux storage and controlling the reactor based upon demand (which is determined by a surplus or deficit in the
  5. -- storage network)
  6. -- Neither the rftools power cell, nor the flux stuff will accept the modem connection and so won't function as a peripheral.
  7. -- I'm going to use the more expensive Mek quantum block for tracking power demand.  you could avoid all this by just
  8. -- making a reinforced turbine but I just spent a week getting the mats for this stupid basic one so damnit I'm going to make it work.
  9. -- I've had to supply an updated method list for Grok, and now this one should be closer to the mark.
  10. -- sixth update we're integrating a BigReactors energizer for storage so the reactors can power down when I get that filled up.
  11.  
  12. -- Connect to the Reactor peripheral (using "back")
  13. local reactor = peripheral.wrap("back") -- Reactor Computer Port
  14. if not reactor then
  15.     error("Reactor not found on back side!")
  16. end
  17.  
  18. -- Connect to the Energizer peripheral
  19. local energizer = peripheral.wrap("BigReactors-Energizer_0") -- Energizer
  20. if not energizer then
  21.     error("Energizer not found!")
  22. end
  23.  
  24. -- Connect to the monitor
  25. local monitor = peripheral.wrap("monitor_4") -- Monitor
  26. if not monitor then
  27.     error("Monitor not found on monitor_4!")
  28. end
  29.  
  30. -- Store the current terminal device
  31. local console = term.current()
  32.  
  33. -- Redirect output to the monitor
  34. term.redirect(monitor)
  35.  
  36. -- Configuration
  37. local highThreshold = 0.9 -- 90% energy capacity (614.7 TFE)
  38. local lowThreshold = 0.35 -- 35% energy capacity (239.05 TFE)
  39. local TargetSteamOutput = 300 -- Target steam output (mB/t), set to 300 for safety
  40. local maxTemp = 1200 -- Max safe casing temperature (°C)
  41. local minTemp = 800 -- Min casing temperature for efficient steam production
  42. local waterThreshold = 1000 -- Min water (mB)
  43. local lowPowerRodLevel = 90 -- Rod level for low-power mode (minimal steam)
  44.  
  45. local isLowPower = false -- Track reactor state
  46. local previousEnergy = 0 -- Track previous energy for trend calculation
  47.  
  48. -- Initialize monitor
  49. monitor.setTextScale(1) -- Default scale (39 chars wide, 13 lines tall for 3x4 monitor)
  50. monitor.setBackgroundColor(colors.black)
  51. monitor.setTextColor(colors.white)
  52.  
  53. while true do
  54.     -- Clear monitor and reset cursor
  55.     monitor.clear()
  56.     monitor.setCursorPos(1, 1)
  57.  
  58.     -- Get energy stats from Energizer
  59.     local energyStored = energizer.getEnergyStored() -- In FE
  60.     local maxEnergy = energizer.getEnergyCapacity() -- In FE (683 TFE)
  61.     local energyPercent = energyStored / maxEnergy
  62.     local energyTFE = energyStored / 1000000000000 -- Convert FE to TFE
  63.     local previousTFE = previousEnergy / 1000000000000 -- Convert previous FE to TFE
  64.     local trend = " - " -- Default to stable
  65.     if energyStored > previousEnergy then
  66.         trend = " ^ "
  67.     elseif energyStored < previousEnergy then
  68.         trend = " v "
  69.     end
  70.     previousEnergy = energyStored -- Update previous energy for next iteration
  71.  
  72.     -- Get reactor stats
  73.     local casingTemp = reactor.getCasingTemperature() -- Casing temperature (°C)
  74.     local fuelTemp = reactor.getFuelTemperature() -- Fuel temperature (°C)
  75.     local water = reactor.getCoolantAmount()
  76.     local steam = reactor.getHotFluidAmount() -- Current steam amount (mB)
  77.     local steamRate = reactor.getHotFluidProducedLastTick() -- Steam production rate (mB/t)
  78.     local rods = reactor.getControlRodLevel(0) -- Assuming uniform rods
  79.  
  80.     -- Write header
  81.     monitor.write(" Reactor Status ")
  82.     monitor.setCursorPos(1, 2)
  83.     monitor.write("----------------")
  84.  
  85.     -- Energy management
  86.     if energyPercent > highThreshold and not isLowPower then
  87.         reactor.setAllControlRodLevels(lowPowerRodLevel) -- Minimal steam (~50 mB/t)
  88.         isLowPower = true
  89.         monitor.setCursorPos(1, 3)
  90.         monitor.write("Mode: Low Power")
  91.         monitor.setCursorPos(1, 4)
  92.         monitor.write("Rods: " .. lowPowerRodLevel .. "%")
  93.     elseif energyPercent < lowThreshold and isLowPower then
  94.         reactor.setAllControlRodLevels(80) -- Start at 80% insertion for gradual ramp-up
  95.         isLowPower = false
  96.         monitor.setCursorPos(1, 3)
  97.         monitor.write("Mode: Restarting")
  98.         monitor.setCursorPos(1, 4)
  99.         monitor.write("Rods: 80%")
  100.     end
  101.  
  102.     -- Reactor control (only if not in low-power mode)
  103.     if not isLowPower then
  104.         if water < waterThreshold then
  105.             monitor.setCursorPos(1, 3)
  106.             monitor.write("Low Water: " .. water .. " mB")
  107.             monitor.setCursorPos(1, 4)
  108.             monitor.write("Mode: Stopped")
  109.             reactor.setAllControlRodLevels(100) -- Stop fuel burn
  110.         else
  111.             if steamRate < TargetSteamOutput - 10 then
  112.                 if casingTemp < maxTemp then
  113.                     local newRods = math.max(0, rods - 1) -- Lower rods by 1%
  114.                     reactor.setAllControlRodLevels(newRods)
  115.                     monitor.setCursorPos(1, 3)
  116.                     monitor.write("Mode: Adjusting")
  117.                     monitor.setCursorPos(1, 4)
  118.                     monitor.write("Rods: " .. newRods .. "%")
  119.                 else
  120.                     monitor.setCursorPos(1, 3)
  121.                     monitor.write("Casing Temp High")
  122.                     monitor.setCursorPos(1, 4)
  123.                     monitor.write("Rods: " .. rods .. "%")
  124.                 end
  125.             elseif steamRate > TargetSteamOutput + 10 then
  126.                 local newRods = math.min(100, rods + 1) -- Raise rods by 1%
  127.                 reactor.setAllControlRodLevels(newRods)
  128.                 monitor.setCursorPos(1, 3)
  129.                 monitor.write("Mode: Adjusting")
  130.                 monitor.setCursorPos(1, 4)
  131.                 monitor.write("Rods: " .. newRods .. "%")
  132.             else
  133.                 monitor.setCursorPos(1, 3)
  134.                 monitor.write("Mode: Stable")
  135.                 monitor.setCursorPos(1, 4)
  136.                 monitor.write("Rods: " .. rods .. "%")
  137.             end
  138.  
  139.             if casingTemp > maxTemp then
  140.                 reactor.setAllControlRodLevels(100) -- Emergency shutdown
  141.                 monitor.setCursorPos(1, 3)
  142.                 monitor.write("Overheating!")
  143.                 monitor.setCursorPos(1, 4)
  144.                 monitor.write("Rods: 100%")
  145.             elseif casingTemp < minTemp and steamRate < TargetSteamOutput then
  146.                 local newRods = math.max(0, rods - 1) -- Lower rods to heat up
  147.                 reactor.setAllControlRodLevels(newRods)
  148.                 monitor.setCursorPos(1, 3)
  149.                 monitor.write("Casing Temp Low")
  150.                 monitor.setCursorPos(1, 4)
  151.                 monitor.write("Rods: " .. newRods .. "%")
  152.             end
  153.         end
  154.     elseif isLowPower then
  155.         monitor.setCursorPos(1, 3)
  156.         monitor.write("Mode: Low Power")
  157.         monitor.setCursorPos(1, 4)
  158.         monitor.write("Rods: " .. lowPowerRodLevel .. "%")
  159.     end
  160.  
  161.     -- Additional stats (spread vertically across the monitor)
  162.     monitor.setCursorPos(1, 5)
  163.     monitor.write("Steam: " .. string.format("%.1f", steamRate) .. " mB/t")
  164.     monitor.setCursorPos(1, 6)
  165.     monitor.write("Target: " .. TargetSteamOutput .. " mB/t")
  166.     monitor.setCursorPos(1, 7)
  167.     monitor.write("Steam Buffer: " .. string.format("%.1f", steam) .. " mB")
  168.     monitor.setCursorPos(1, 8)
  169.     monitor.write("Casing Temp: " .. string.format("%.1f", casingTemp) .. " C")
  170.     monitor.setCursorPos(1, 9)
  171.     monitor.write("Fuel Temp: " .. string.format("%.1f", fuelTemp) .. " C")
  172.     monitor.setCursorPos(1, 10)
  173.     monitor.write("Water: " .. string.format("%.1f", water) .. " mB")
  174.     monitor.setCursorPos(1, 11)
  175.     monitor.write("Energy: " .. string.format("%.1f", energyPercent * 100) .. "%")
  176.     monitor.setCursorPos(1, 12)
  177.     monitor.write("Current: " .. string.format("%.1f", energyTFE) .. " TFE")
  178.     monitor.setCursorPos(1, 13)
  179.     monitor.write("Previous: " .. string.format("%.1f", previousTFE) .. " TFE" .. trend)
  180.  
  181.     os.sleep(5) -- Update every 5 seconds
  182. end
  183.  
  184. -- Restore terminal (though the loop won't exit unless interrupted)
  185. term.redirect(console)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement