Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Groks fifth attempt at a simple reactor/turbine control program for my unique ATM10 setup.
- -- we're getting close! Asked for some monitor tweaks for my 3x4 (WxH) monitor and better energy reporting
- -- since I have a reinforced reactor but a basic turbine I'm trying to work around that at this state by using
- -- flux storage and controlling the reactor based upon demand (which is determined by a surplus or deficit in the
- -- storage network)
- -- Neither the rftools power cell, nor the flux stuff will accept the modem connection and so won't function as a peripheral.
- -- I'm going to use the more expensive Mek quantum block for tracking power demand. you could avoid all this by just
- -- 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.
- -- I've had to supply an updated method list for Grok, and now this one should be closer to the mark.
- local reactor = peripheral.wrap("back") -- Reactor Computer Port
- local entangloporter = peripheral.wrap("quantumEntangloporter_0") -- Quantum Entangloporter
- local monitor = peripheral.wrap("monitor_4") -- Monitor
- local highThreshold = 0.9 -- 90% energy capacity (92.16 MFE)
- local lowThreshold = 0.35 -- 35% energy capacity (35.84 MFE)
- local TargetSteamOutput = 300 -- Target steam output (mB/t), set to 300 for safety (or 360 if preferred)
- local maxTemp = 1200 -- Max safe casing temperature (°C)
- local minTemp = 800 -- Min casing temperature for efficient steam production
- local waterThreshold = 1000 -- Min water (mB)
- local lowPowerRodLevel = 90 -- Rod level for low-power mode (minimal steam)
- local isLowPower = false -- Track reactor state
- local previousEnergy = 0 -- Track previous energy for trend calculation
- -- Initialize monitor
- monitor.setTextScale(1) -- Default scale (39 chars wide, 13 lines tall for 3x4 monitor)
- monitor.setBackgroundColor(colors.black)
- monitor.setTextColor(colors.white)
- while true do
- -- Clear monitor and reset cursor
- monitor.clear()
- monitor.setCursorPos(1, 1)
- -- Get energy stats from Quantum Entangloporter
- local energyStored = entangloporter.getEnergy()
- local maxEnergy = entangloporter.getMaxEnergy()
- local energyPercent = energyStored / maxEnergy
- local energyMFE = energyStored / 1000000 -- Convert FE to MFE
- local previousMFE = previousEnergy / 1000000 -- Convert previous FE to MFE
- local trend = " - " -- Default to stable
- if energyStored > previousEnergy then
- trend = " ^ "
- elseif energyStored < previousEnergy then
- trend = " v "
- end
- previousEnergy = energyStored -- Update previous energy for next iteration
- -- Get reactor stats
- local casingTemp = reactor.getCasingTemperature() -- Casing temperature (°C)
- local fuelTemp = reactor.getFuelTemperature() -- Fuel temperature (°C)
- local water = reactor.getCoolantAmount()
- local steam = reactor.getHotFluidAmount() -- Current steam amount (mB)
- local steamRate = reactor.getHotFluidProducedLastTick() -- Steam production rate (mB/t)
- local rods = reactor.getControlRodLevel(0) -- Assuming uniform rods
- -- Write header
- monitor.write(" Reactor Status ")
- monitor.setCursorPos(1, 2)
- monitor.write("----------------")
- -- Energy management
- if energyPercent > highThreshold and not isLowPower then
- reactor.setAllControlRodLevels(lowPowerRodLevel) -- Minimal steam (~50 mB/t)
- isLowPower = true
- monitor.setCursorPos(1, 3)
- monitor.write("Mode: Low Power")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: " .. lowPowerRodLevel .. "%")
- elseif energyPercent < lowThreshold and isLowPower then
- reactor.setAllControlRodLevels(80) -- Start at 80% insertion for gradual ramp-up
- isLowPower = false
- monitor.setCursorPos(1, 3)
- monitor.write("Mode: Restarting")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: 80%")
- end
- -- Reactor control (only if not in low-power mode)
- if not isLowPower then
- if water < waterThreshold then
- monitor.setCursorPos(1, 3)
- monitor.write("Low Water: " .. water .. " mB")
- monitor.setCursorPos(1, 4)
- monitor.write("Mode: Stopped")
- reactor.setAllControlRodLevels(100) -- Stop fuel burn
- else
- if steamRate < TargetSteamOutput - 10 then
- if casingTemp < maxTemp then
- local newRods = math.max(0, rods - 5) -- Lower rods by 5%
- reactor.setAllControlRodLevels(newRods)
- monitor.setCursorPos(1, 3)
- monitor.write("Mode: Adjusting")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: " .. newRods .. "%")
- else
- monitor.setCursorPos(1, 3)
- monitor.write("Casing Temp High")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: " .. rods .. "%")
- end
- elseif steamRate > TargetSteamOutput + 10 then
- local newRods = math.min(100, rods + 5) -- Raise rods by 5%
- reactor.setAllControlRodLevels(newRods)
- monitor.setCursorPos(1, 3)
- monitor.write("Mode: Adjusting")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: " .. newRods .. "%")
- else
- monitor.setCursorPos(1, 3)
- monitor.write("Mode: Stable")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: " .. rods .. "%")
- end
- if casingTemp > maxTemp then
- reactor.setAllControlRodLevels(100) -- Emergency shutdown
- monitor.setCursorPos(1, 3)
- monitor.write("Overheating!")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: 100%")
- elseif casingTemp < minTemp and steamRate < TargetSteamOutput then
- local newRods = math.max(0, rods - 10) -- Lower rods to heat up
- reactor.setAllControlRodLevels(newRods)
- monitor.setCursorPos(1, 3)
- monitor.write("Casing Temp Low")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: " .. newRods .. "%")
- end
- end
- elseif isLowPower then
- monitor.setCursorPos(1, 3)
- monitor.write("Mode: Low Power")
- monitor.setCursorPos(1, 4)
- monitor.write("Rods: " .. lowPowerRodLevel .. "%")
- end
- -- Additional stats (spread vertically across the monitor)
- monitor.setCursorPos(1, 5)
- monitor.write("Steam: " .. string.format("%.1f", steamRate) .. " mB/t")
- monitor.setCursorPos(1, 6)
- monitor.write("Target: " .. TargetSteamOutput .. " mB/t")
- monitor.setCursorPos(1, 7)
- monitor.write("Steam Buffer: " .. string.format("%.1f", steam) .. " mB")
- monitor.setCursorPos(1, 8)
- monitor.write("Casing Temp: " .. string.format("%.1f", casingTemp) .. " C")
- monitor.setCursorPos(1, 9)
- monitor.write("Fuel Temp: " .. string.format("%.1f", fuelTemp) .. " C")
- monitor.setCursorPos(1, 10)
- monitor.write("Water: " .. string.format("%.1f", water) .. " mB")
- monitor.setCursorPos(1, 11)
- monitor.write("Energy: " .. string.format("%.1f", energyPercent * 100) .. "%")
- monitor.setCursorPos(1, 12)
- monitor.write("Current: " .. string.format("%.1f", energyMFE) .. " MFE")
- monitor.setCursorPos(1, 13)
- monitor.write("Previous: " .. string.format("%.1f", previousMFE) .. " MFE" .. trend)
- os.sleep(1) -- Update every second
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement