Romanok2805
-
Публикации
4 -
Зарегистрирован
-
Посещение
-
Победитель дней
5
Сообщения, опубликованные пользователем Romanok2805
-
-
За пару часов написал вот такую программу. Позволяет подключить любое количество мфэх и табличек. Возможность горячего добавления или убирания мфэх или табличек во время работы программы. Вывод в процентах. Программа сама находит сторону, где находится табличка. Работает в фоне. Также если мфэх больше 4 штук, то на табличке идёт прокрутка по очереди всех мфэх.
Обычная версия:
Скрытый текстlocal component = require("component") local event = require("event") local mfsu local sign local count = 0 --с какой строки начинается отсчёт для расчёта строки на таблички local arg = {...} local isStarted local MfsuSpeed = 1 --частота обновения энергии мфэх в сек local SignSpeed = 0.5 --табличек в сек local function init() --поиск всех мфэх mfsu = {} for i, k in pairs(component.list("mfsu")) do table.insert(mfsu, {address = i, stored = 0}) --добавляем все адреса мфэх end if mfsu == {} then print("MFSU not found.") os.exit() end --поиск табличек sign = {} for i, k in pairs(component.list("sign")) do local side for ii = 0, 5 do if component.proxy(i).getValue(ii) then --получаем сторону где есть табличка side = ii break end end if side then table.insert(sign, {address = i, side = side}) --добавляем все адреса табличек end end if #sign == 0 then print("Sign not found.") os.exit() end end local function updateMFSU() for i, k in pairs(mfsu) do --Проверяем и записываем все значения в массив local buffer = math.floor(component.proxy(mfsu[i].address).getStored()) --для оптимизации if buffer ~= 0 then mfsu[i].stored = i..":"..buffer.."eu "..math.floor(buffer/40000000*100).."%" if string.len(mfsu[i].stored) > 15 then mfsu[i].stored = i..":"..buffer.." "..math.floor(buffer/40000000*100).."%" --если не влазиет строка в табличку можно укоротить end else mfsu[i].stored = i..":0eu 0%" end end end local function updateSigns() local strInt = {} if #mfsu > 4 then --если меньше 4 мфэх то прокрутка не нужна for i = 1 + count, 4 + count do --получаем нужные строки для обновления if i > #mfsu then strInt[i - count] = i - #mfsu else strInt[i - count] = i end end count = count + 1 if count > #mfsu - 1 then count = 0 end else strInt = {1, 2, 3, 4} end local str = "" for i = 1, math.min(4, #mfsu) do str = str..mfsu[strInt[i]].stored.."\n" end for i = 1, #sign do component.proxy(sign[i].address).setValue(sign[i].side, str) end end local function start() init() updateMFSU() updateSigns() idTimerMfsu = event.timer(MfsuSpeed, updateMFSU, math.huge) idTimerSigns = event.timer(SignSpeed, updateSigns, math.huge) event.listen("component_removed", init) event.listen("component_added", init) started = true end local function stop() event.ignore("component_removed", init) event.ignore("component_added", init) event.cancel(idTimerMfsu) event.cancel(idTimerSigns) started = false end if isStarted then if arg[1] == "setSpeed" then stop() arg[2] = string.lower(arg[2]) arg[3] = tonumber(arg[3]) if arg[2] == "mfsu" then MfsuSpeed = arg[3] elseif arg[2] == "sign" then SignSpeed = arg[3] else io.stderr:write("Error in the parameters") end start() elseif arg[1] == "stop" then if not isStarted then stop() end else io.stderr:write("Error in the parameters") end else start() print("Found:") print(#sign.." sign") print(#mfsu.." MFSU") end
Скачать:
pastebin get mjF0Qw4x mfsu.lua
Команды:
mfsu - Запустить программу
mfsu setSpeed mfsu/sign [количество] - Указать скорость
Пример: mfsu setSpeed sign 2 - Данные на табличках будут обновляться каждые 2 секунды
mfsu stop - Остановить обновление
Версия для rc:
Скрытый текстlocal component = require("component") local event = require("event") local mfsu local sign local count = 0 --с какой строки начинается отсчёт для расчёта строки на таблички local arg = {...} local isStarted local MfsuSpeed = 1 --частота обновения энергии мфэх в сек local SignSpeed = 0.5 --табличек в сек local isRestart = false local function init() --поиск всех мфэх mfsu = {} for i, k in pairs(component.list("mfsu")) do table.insert(mfsu, {address = i, stored = 0}) --добавляем все адреса мфэх end if mfsu == {} then print("MFSU not found.") os.exit() end --поиск табличек sign = {} for i, k in pairs(component.list("sign")) do local side for ii = 0, 5 do if component.proxy(i).getValue(ii) then --получаем сторону где есть табличка side = ii break end end if side then table.insert(sign, {address = i, side = side}) --добавляем все адреса табличек end end if #sign == 0 then print("Sign not found.") os.exit() end end local function updateMFSU() for i, k in pairs(mfsu) do --Проверяем и записываем все значения в массив local buffer = math.floor(component.proxy(mfsu[i].address).getStored()) --для оптимизации if buffer ~= 0 then mfsu[i].stored = i..":"..buffer.."eu "..math.floor(buffer/40000000*100).."%" if string.len(mfsu[i].stored) > 15 then mfsu[i].stored = i..":"..buffer.." "..math.floor(buffer/40000000*100).."%" --если не влазиет строка в табличку можно укоротить end else mfsu[i].stored = i..":0eu 0%" end end end local function updateSigns() local strInt = {} if #mfsu > 4 then --если меньше 4 мфэх то прокрутка не нужна for i = 1 + count, 4 + count do --получаем нужные строки для обновления if i > #mfsu then strInt[i - count] = i - #mfsu else strInt[i - count] = i end end count = count + 1 if count > #mfsu - 1 then count = 0 end else strInt = {1, 2, 3, 4} end local str = "" for i = 1, math.min(4, #mfsu) do str = str..mfsu[strInt[i]].stored.."\n" end for i = 1, #sign do component.proxy(sign[i].address).setValue(sign[i].side, str) end end function start() if isStarted then io.stderr:write("MFSU is now running") end init() updateMFSU() updateSigns() if not isRestart then print("Found:") print(#sign.." sign") print(#mfsu.." MFSU") end idTimerMfsu = event.timer(MfsuSpeed, updateMFSU, math.huge) idTimerSigns = event.timer(SignSpeed, updateSigns, math.huge) event.listen("component_removed", init) event.listen("component_added", init) started = true end function stop() if not isStarted then io.stderr:write("MFSU is now stop") end event.ignore("component_removed", init) event.ignore("component_added", init) event.cancel(idTimerMfsu) event.cancel(idTimerSigns) started = false end function setSpeed(from, num) isRestart = true stop() from = string.lower(from) if from == "mfsu" then MfsuSpeed = num elseif from == "sign" then SignSpeed = num else io.stderr:write("Error in the parameters") end start() isRestart = false end
Скачать:
pastebin get mcvBWAfH /etc/rc.d/mfsu.lua
Команды:
rc mfsu start - Запустить программу
rc mfsu setSpeed mfsu/sign [количество] - Указать скорость
Пример: rc mfsu setSpeed sign 2 - Данные на табличках будут обновляться каждые 2 секунды
rc mfsu stop - Остановить обновление и закрыть программу
-
6
-
1
-
-
-
Решил как-то раз сделать программу для варки пива. И у меня это получилось.
Возможности
Выбирать сорт
Выбирать густоту
Выбирать время выдержки
По истечению времени автоматически собирать бочки с пивом (Разливать в кружки он не может)
Подсчёт всех ресурсов, необходимых для варки
Выбор количества бочек
Защита от "Дурака"Инструкция:
Необходимо поставить конструкцию, как на картинке.


Далее просто запускаете программу и ждёте.
Принцип работы:
1. Робот берёт ресурсы на обслуживание четырёх бочек (или меньше, в зависимости от указанного общего количества).
2. Обслуживает (закладывает хмель, пшеницу, капсулы в бочку) бочки.
3. Возвращается на начальную точку, если остались не обслуженные бочки, то пункт 1.
4. Ждёт указанное время.
5. Собирает (ломает) бочки, пока не заполнится инвентарь, если заполнился, то возвращается на базу и опустошает место.
6. Возвращается на место, складывает в сундук оставшиеся бочки.
7. Программа завершена.
Чтобы скачать, введите команду:
pastebin get G0Jnvg0A beer.lua
Ссылка на pastebin: http://pastebin.com/G0Jnvg0A
Минимальная комплектация:
Особых условий нет, есть обязательные улучшения:
Улучшение "Инвентарь"
Улучшение "Контроллер инвентаря
-
8
-

Робот-пивовар
в Роботы
Опубликовано:
Демонстрация работы
https://yadi.sk/i/mmhxb20imk9M2A
Код рабочий, как минимум для загрузки в бочки работал. Тут была проблема в направлении робота, он должен смотреть передом на бочки.
А еще оказалось, что сбор бочек не работал. Уже пофиксил.