Advertisement
Ubidibity

turbine.lua

May 21st, 2025 (edited)
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.62 KB | Gaming | 0 0
  1. -- Groks fifth attempt at 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.  
  11. local reactor = peripheral.wrap("back") -- Reactor Computer Port
  12. local entangloporter = peripheral.wrap("quantumEntangloporter_0") -- Quantum Entangloporter
  13. local monitor = peripheral.wrap("monitor_4") -- Monitor
  14.  
  15. local highThreshold = 0.9 -- 90% energy capacity (92.16 MFE)
  16. local lowThreshold = 0.35 -- 35% energy capacity (35.84 MFE)
  17. local TargetSteamOutput = 300 -- Target steam output (mB/t), set to 300 for safety (or 360 if preferred)
  18. local maxTemp = 1200 -- Max safe casing temperature (°C)
  19. local minTemp = 800 -- Min casing temperature for efficient steam production
  20. local waterThreshold = 1000 -- Min water (mB)
  21. local lowPowerRodLevel = 90 -- Rod level for low-power mode (minimal steam)
  22.  
  23. local isLowPower = false -- Track reactor state
  24. local previousEnergy = 0 -- Track previous energy for trend calculation
  25.  
  26. -- Initialize monitor
  27. monitor.setTextScale(1) -- Default scale (39 chars wide, 13 lines tall for 3x4 monitor)
  28. monitor.setBackgroundColor(colors.black)
  29. monitor.setTextColor(colors.white)
  30.  
  31. while true do
  32.     -- Clear monitor and reset cursor
  33.     monitor.clear()
  34.     monitor.setCursorPos(1, 1)
  35.  
  36.     -- Get energy stats from Quantum Entangloporter
  37.     local energyStored = entangloporter.getEnergy()
  38.     local maxEnergy = entangloporter.getMaxEnergy()
  39.     local energyPercent = energyStored / maxEnergy
  40.     local energyMFE = energyStored / 1000000 -- Convert FE to MFE
  41.     local previousMFE = previousEnergy / 1000000 -- Convert previous FE to MFE
  42.     local trend = " - " -- Default to stable
  43.     if energyStored > previousEnergy then
  44.         trend = " ^ "
  45.     elseif energyStored < previousEnergy then
  46.         trend = " v "
  47.     end
  48.     previousEnergy = energyStored -- Update previous energy for next iteration
  49.  
  50.     -- Get reactor stats
  51.     local casingTemp = reactor.getCasingTemperature() -- Casing temperature (°C)
  52.     local fuelTemp = reactor.getFuelTemperature() -- Fuel temperature (°C)
  53.     local water = reactor.getCoolantAmount()
  54.     local steam = reactor.getHotFluidAmount() -- Current steam amount (mB)
  55.     local steamRate = reactor.getHotFluidProducedLastTick() -- Steam production rate (mB/t)
  56.     local rods = reactor.getControlRodLevel(0) -- Assuming uniform rods
  57.  
  58.     -- Write header
  59.     monitor.write(" Reactor Status ")
  60.     monitor.setCursorPos(1, 2)
  61.     monitor.write("----------------")
  62.  
  63.     -- Energy management
  64.     if energyPercent > highThreshold and not isLowPower then
  65.         reactor.setAllControlRodLevels(lowPowerRodLevel) -- Minimal steam (~50 mB/t)
  66.         isLowPower = true
  67.         monitor.setCursorPos(1, 3)
  68.         monitor.write("Mode: Low Power")
  69.         monitor.setCursorPos(1, 4)
  70.         monitor.write("Rods: " .. lowPowerRodLevel .. "%")
  71.     elseif energyPercent < lowThreshold and isLowPower then
  72.         reactor.setAllControlRodLevels(80) -- Start at 80% insertion for gradual ramp-up
  73.         isLowPower = false
  74.         monitor.setCursorPos(1, 3)
  75.         monitor.write("Mode: Restarting")
  76.         monitor.setCursorPos(1, 4)
  77.         monitor.write("Rods: 80%")
  78.     end
  79.  
  80.     -- Reactor control (only if not in low-power mode)
  81.     if not isLowPower then
  82.         if water < waterThreshold then
  83.             monitor.setCursorPos(1, 3)
  84.             monitor.write("Low Water: " .. water .. " mB")
  85.             monitor.setCursorPos(1, 4)
  86.             monitor.write("Mode: Stopped")
  87.             reactor.setAllControlRodLevels(100) -- Stop fuel burn
  88.         else
  89.             if steamRate < TargetSteamOutput - 10 then
  90.                 if casingTemp < maxTemp then
  91.                     local newRods = math.max(0, rods - 5) -- Lower rods by 5%
  92.                     reactor.setAllControlRodLevels(newRods)
  93.                     monitor.setCursorPos(1, 3)
  94.                     monitor.write("Mode: Adjusting")
  95.                     monitor.setCursorPos(1, 4)
  96.                     monitor.write("Rods: " .. newRods .. "%")
  97.                 else
  98.                     monitor.setCursorPos(1, 3)
  99.                     monitor.write("Casing Temp High")
  100.                     monitor.setCursorPos(1, 4)
  101.                     monitor.write("Rods: " .. rods .. "%")
  102.                 end
  103.             elseif steamRate > TargetSteamOutput + 10 then
  104.                 local newRods = math.min(100, rods + 5) -- Raise rods by 5%
  105.                 reactor.setAllControlRodLevels(newRods)
  106.                 monitor.setCursorPos(1, 3)
  107.                 monitor.write("Mode: Adjusting")
  108.                 monitor.setCursorPos(1, 4)
  109.                 monitor.write("Rods: " .. newRods .. "%")
  110.             else
  111.                 monitor.setCursorPos(1, 3)
  112.                 monitor.write("Mode: Stable")
  113.                 monitor.setCursorPos(1, 4)
  114.                 monitor.write("Rods: " .. rods .. "%")
  115.             end
  116.  
  117.             if casingTemp > maxTemp then
  118.                 reactor.setAllControlRodLevels(100) -- Emergency shutdown
  119.                 monitor.setCursorPos(1, 3)
  120.                 monitor.write("Overheating!")
  121.                 monitor.setCursorPos(1, 4)
  122.                 monitor.write("Rods: 100%")
  123.             elseif casingTemp < minTemp and steamRate < TargetSteamOutput then
  124.                 local newRods = math.max(0, rods - 10) -- Lower rods to heat up
  125.                 reactor.setAllControlRodLevels(newRods)
  126.                 monitor.setCursorPos(1, 3)
  127.                 monitor.write("Casing Temp Low")
  128.                 monitor.setCursorPos(1, 4)
  129.                 monitor.write("Rods: " .. newRods .. "%")
  130.             end
  131.         end
  132.     elseif isLowPower then
  133.         monitor.setCursorPos(1, 3)
  134.         monitor.write("Mode: Low Power")
  135.         monitor.setCursorPos(1, 4)
  136.         monitor.write("Rods: " .. lowPowerRodLevel .. "%")
  137.     end
  138.  
  139.     -- Additional stats (spread vertically across the monitor)
  140.     monitor.setCursorPos(1, 5)
  141.     monitor.write("Steam: " .. string.format("%.1f", steamRate) .. " mB/t")
  142.     monitor.setCursorPos(1, 6)
  143.     monitor.write("Target: " .. TargetSteamOutput .. " mB/t")
  144.     monitor.setCursorPos(1, 7)
  145.     monitor.write("Steam Buffer: " .. string.format("%.1f", steam) .. " mB")
  146.     monitor.setCursorPos(1, 8)
  147.     monitor.write("Casing Temp: " .. string.format("%.1f", casingTemp) .. " C")
  148.     monitor.setCursorPos(1, 9)
  149.     monitor.write("Fuel Temp: " .. string.format("%.1f", fuelTemp) .. " C")
  150.     monitor.setCursorPos(1, 10)
  151.     monitor.write("Water: " .. string.format("%.1f", water) .. " mB")
  152.     monitor.setCursorPos(1, 11)
  153.     monitor.write("Energy: " .. string.format("%.1f", energyPercent * 100) .. "%")
  154.     monitor.setCursorPos(1, 12)
  155.     monitor.write("Current: " .. string.format("%.1f", energyMFE) .. " MFE")
  156.     monitor.setCursorPos(1, 13)
  157.     monitor.write("Previous: " .. string.format("%.1f", previousMFE) .. " MFE" .. trend)
  158.  
  159.     os.sleep(1) -- Update every second
  160. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement