Jump to content




[LUA] computer controlled pistons


  • You cannot reply to this topic
15 replies to this topic

#1 Minithra

  • Members
  • 25 posts

Posted 11 March 2013 - 09:56 PM

I want to use a computer to control three different sets of pistons for a blaze farm, and to start a cycle at the push of a button.

I can't get it to work. I am not good at any sort of programming.

This is what I have so far, cobbled together from the net... and probably bad:

function gate()
rs.setBundledOutput("left", colors.yellow)
end
function wall()
rs.setBundledOutput("left", colors.black)
end

function crushers()
rs.setBundledOutput("left", colors.red)
sleep(14)
end
function listener()
   while true do
		  if rs.getInput("back") then
			    gate()
                sleep(0.2)
                wall()
                sleep(0.2)
                crushers()
		  end
		  sleep(0)
   end
end


#2 theoriginalbit

    Semi-Professional ComputerCrafter

  • Moderators
  • 7,332 posts
  • LocationAustralia

Posted 11 March 2013 - 10:02 PM

View PostMinithra, on 11 March 2013 - 09:56 PM, said:

I can't get it to work. I am not good at any sort of programming.
What exactly can't you get to work? Is there an error? If so what does it say? Is it not behaving how you would expect? If so what is it doing and what is it meant to do?

EDIT: Looked at the code again and saw it right away, idk how I missed it the first time... its because you have all your program in functions, and you never call that function listener to start the program

Here is some code I put together that accomplishes the task in less code and with less lag on your Minecraft world, please read the comments, and if you have any questions just ask:
Spoiler

Edited by TheOriginalBIT, 11 March 2013 - 10:10 PM.


#3 Minithra

  • Members
  • 25 posts

Posted 11 March 2013 - 10:14 PM

It wasn't doing anything at all :D

Thank you very much. I can understand what it does :)

One slight issue - I need slight different timings on the pistons. It's why I had them to different colors.

Where can I introduce delays? Ideally, I'd have gate a half-second before wall, and the crusher a half second after the wall, with the crushers on for a few seconds. Not sure how many yet. Between the outputs? Would that be okay?

    output(colors.yellow) -- gate
    sleep(0.5)
    output(colors.black) -- wall
    sleep(0.5)
    output(colors.red) -- crushers
    sleep(10)

Like that?

#4 theoriginalbit

    Semi-Professional ComputerCrafter

  • Moderators
  • 7,332 posts
  • LocationAustralia

Posted 11 March 2013 - 10:18 PM

View PostMinithra, on 11 March 2013 - 10:14 PM, said:

It wasn't doing anything at all :D
Yeh ok so it would be because you did not call the listener function

you could add another parameter to the output function and make changes like so
local function output(col, delay)
  rs.setBundledOutput('left', col)
  sleep(delay) -- wait
  rs.setBundledOutput('left', 0)
end
then you would use it like so
output(colors.yellow, 0.5)
output(colors.black, 0.5)
output(colors.red, 10)
[/code]

#5 Minithra

  • Members
  • 25 posts

Posted 11 March 2013 - 10:27 PM

Thank you. That looks good.

But it doesn't work. Still doesn't do anything.

I tried a red alloy wire to its back, connected to a lever or button, and I tried a lever right on the back of the computer. Nothing.

I have the bundled wires out of its left side, splitting into yellow/black/red a few blocks later, ending in play red alloy wire on the pistons. It should work...

#6 Kryptanyte

  • Members
  • 95 posts
  • LocationNew Zealand

Posted 11 March 2013 - 10:29 PM

Is it still throwing an error, and also whats your updated code?

#7 Minithra

  • Members
  • 25 posts

Posted 11 March 2013 - 10:33 PM

The code is what TheOriginalBIT posted, including the second post, with the delays.

I was probably doing something really dumb. I changed it to output to front, and it's working now. Left side of the computer is the side to to the left if I'm standing on it, facing the same direction the monitor is, right?

Just need to rework the timings, because now the gate and wall retracts instantly, which isn't what I wanted :)

Thank you very much for your help!

#8 immibis

    Lua God

  • Members
  • 1,033 posts
  • LocationWellington, New Zealand

Posted 11 March 2013 - 10:33 PM

Don't use sleep(0) and constantly check for something, unless you want to cause server lag.
Use something like this instead of sleep(0):
while not rs.getInput('back') do
os.pullEvent("redstone")
end


#9 theoriginalbit

    Semi-Professional ComputerCrafter

  • Moderators
  • 7,332 posts
  • LocationAustralia

Posted 11 March 2013 - 10:33 PM

View PostMinithra, on 11 March 2013 - 10:27 PM, said:

I have the bundled wires out of its left side, splitting into yellow/black/red a few blocks later, ending in play red alloy wire on the pistons. It should work...
Are you SURE you have it on the left?

EDIT: just saw your reply. the sides are when you are looking at the front of the computer, and its YOUR left is its left.

#10 Minithra

  • Members
  • 25 posts

Posted 11 March 2013 - 10:40 PM

Yeah, dumb mistake :D

#11 Minithra

  • Members
  • 25 posts

Posted 11 March 2013 - 11:09 PM

Hmm... problem.

How do I keep everything on for as long as I want to? At the moment, each different set of pistons is only on for their set time, then they stop. What I need is for everything to stop at the same time, after the last set is done.

I tried different times, nothing seems to be doing what I want.

#12 theoriginalbit

    Semi-Professional ComputerCrafter

  • Moderators
  • 7,332 posts
  • LocationAustralia

Posted 11 March 2013 - 11:17 PM

You can use rs.getBundledInput and colors.combine to do what is needed

local function output(col, delay)
  local curr = rs.getBundledInput('left') -- get the current output
  rs.setBundledOutput('left', colors.combine(curr, col)) -- combine the current with the new one
  sleep(delay) -- wait
  -- we dont want to clear it here
end

while true do
  os.pullEvent('redstone') -- wait here until the computer gets a redstone signal
  if rs.getInput('back') then -- if the redstone signal was the one we wanted
	output(colors.yellow, 0.5)
	output(colors.black, 0.5)
	output(colors.red, 10)
	rs.setBundledOutput('left', 0) -- now lets clear it
  end
end


#13 Minithra

  • Members
  • 25 posts

Posted 11 March 2013 - 11:36 PM

That does the same thing. When the next set of pistons is called, the previous one resets.

I think I'll just remove the output function and have outputs on three sides in the if clause. Maybe it doesn't like having to keep multiple colors going at the same time :/

#14 theoriginalbit

    Semi-Professional ComputerCrafter

  • Moderators
  • 7,332 posts
  • LocationAustralia

Posted 11 March 2013 - 11:40 PM

uhh did you copy paste it? or type it out? if you copy pasted that idk why it wouldn't work, it should only reset after it has finished each loop.

#15 Minithra

  • Members
  • 25 posts

Posted 12 March 2013 - 12:24 AM

Copied and pasted it.

This is what I'm using now, and it does what I want it to:

http://pastebin.com/bApjC7FB

#16 immibis

    Lua God

  • Members
  • 1,033 posts
  • LocationWellington, New Zealand

Posted 12 March 2013 - 01:23 AM

When you call rs.setBundledOutput you set all the colours at once. To use multiple colours add them together (with +, they're just numbers)





1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users