Перейти к содержимому

Romanok2805

Пользователи
  • Публикации

    4
  • Зарегистрирован

  • Посещение

  • Победитель дней

    5

Сообщения, опубликованные пользователем Romanok2805


  1. Демонстрация работы
    https://yadi.sk/i/mmhxb20imk9M2A

     

    Код рабочий, как минимум для загрузки в бочки работал. Тут была проблема в направлении робота, он должен смотреть передом на бочки.

     

    А еще оказалось, что сбор бочек не работал. Уже пофиксил.


  2. За пару часов написал вот такую программу. Позволяет подключить любое количество мфэх и табличек. Возможность горячего добавления или убирания мфэх или табличек во время работы программы. Вывод в процентах. Программа сама находит сторону, где находится табличка. Работает в фоне. Также если мфэх больше 4 штук, то на табличке идёт прокрутка по очереди всех мфэх.

     

    giphy.gif

     

    Обычная версия:

    Скрытый текст
    
    
    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

  3. Раньше видел заставку от DVD. Вот такую:

    dvd-logo-gif.gif

    И решил сделать такую в майне.

    pastebin get fDYaR4Zw screen_saver.lua

    Код не очень красивый, писал за пару минут чтобы было.

    Результат:

    1212.gif.47e8d5698d2caea630da2d9db50a3c93.gif

    Если нужно, могу переписать чтобы можно было делать в несколько строк или изображением.


  4. Решил как-то раз сделать программу для варки пива. И у меня это получилось.

     

    Возможности

    Выбирать сорт
    Выбирать густоту
    Выбирать время выдержки
    По истечению времени автоматически собирать бочки с пивом (Разливать в кружки он не может)
    Подсчёт всех ресурсов, необходимых для варки
    Выбор количества бочек
    Защита от "Дурака"

     

    Инструкция:

     

    Необходимо поставить конструкцию, как на картинке.

    2018-06-05_18.25.02.png

    2018-06-05_18.25.08.png

    Далее просто запускаете программу и ждёте.

     

     

    Принцип работы:

    1. Робот берёт ресурсы на обслуживание четырёх бочек (или меньше, в зависимости от указанного общего количества).

    2. Обслуживает (закладывает хмель, пшеницу, капсулы в бочку) бочки.

    3. Возвращается на начальную точку, если остались не обслуженные бочки, то пункт 1.

    4. Ждёт указанное время.

    5. Собирает (ломает) бочки, пока не заполнится инвентарь, если заполнился, то возвращается на базу и опустошает место.

    6. Возвращается на место, складывает в сундук оставшиеся бочки.

    7. Программа завершена. 

     

    Чтобы скачать, введите команду:

    pastebin get G0Jnvg0A beer.lua
    

    Ссылка на pastebin: http://pastebin.com/G0Jnvg0A

     

    Минимальная комплектация:

     

    Особых условий нет, есть обязательные улучшения:

    Улучшение "Инвентарь"

    Улучшение "Контроллер инвентаря

     

    • Нравится 8
×
×
  • Создать...