Видел я на хабре пост четырёхлетней давности о включении лампы(в реальном мире) из майнкрафта.
Вот он, если что: https://habr.com/ru/post/271527/
Тут я подумал - "А чем я собственно хуже? Почему нельзя контроллировать температуру реактора/дроноферму/дом датчиками движением?"
Переходим к практике.
Я имею вот такой дисплей купленный в поднебесной(За всеми ссылками и подробной помощью если заинтересуетесь обращаться в личку)
Так же, я обладаю платой NodeMcu Lolin V3(Если грубо - это ардуинка с вай-файкой, но нет, это самостоятельный чип esp8266)
В общем это всё, что нам сейчас понадобится(Еще понадобится роутер (и белый айпи, если вы играете на сервере))
Я хочу контролировать температуру своего реактора из IC2(но пристроить можно всё что угодно), поэтому берём его.
Как это выглядит в игре:
Схема реактора(Хотя ничего особо интересного тут нет):
Переходим к реальному миру.
Нам нужно открыть порт, в моём случае это 4536, к тому же нам нужен постоянный адрес в интернете. Для этого я использую DDNS. Об этом и остальном можно узнать в гугле.
Теперь, всё готово чтобы наконец-то смотреть температуру реактора из реально мира!
Есть такой простой код(Сейчас говорим про реальный мир):
--Если кому будет интересно, вот полная документация по прошивке NodeMcu: https://nodemcu.readthedocs.io/en/master/
wifi.sta.config({ssid = "Xiaomi_2.4G", pwd = "xBfYHR33Le"}) --Мой SSID и пароль моего wi-fi =D
wifi.sta.autoconnect(1) --Автоподключение Wi-Fi
wifi.setmode(wifi.STATION) --Сейчас ESP8266 Будет работать в режиме клиента)
spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8) --Настройка дисплея
oled = u8g2.ssd1309_128x64_noname0(1, 8, 4, 0)
oled:setFont(u8g2.font_haxrcorp4089_t_cyrillic) --Выставляем шрифт
oled:setContrast(255) --Контрастность дисплея)
server = net.createServer(net.TCP, 30) --Создаём сервер с тайм-аутом в 30 секунд по TCP протоколу
function receiver(socket, temp) --Функция, которая вызывается при подключении
oled:clearBuffer() --Очищаем буфер
oled:drawUTF8(1, 7, "Темп. Реактора: " .. temp .. "%") --Пишем
oled:sendBuffer() --Уже рисуем
socket:close() --Разрываем подключение
end
server:listen(4536 , function(conn) --Выставляем на прослушку порт 4536
conn:on("receive", receiver)
end)
wifi_check = tmr.create() --Создаём динамический объект таймера
wifi_check:alarm(1000, 1, function() --Эта функция - аналог event.timer в OpenComputers, которая так же вызывает функцию. В данном случае мы каждую секунду проверяем Wi-Fi.
if not wifi.sta.getip() then --Если мы не имеем айпи, тогда
wifi_connect = false
oled:clearBuffer() --Очищаем буфер
oled:drawUTF8(1, 7, "Подключение к Wi-Fi...") --Пишем
oled:sendBuffer() --Рисуем
elseif not wifi_connect then --Если мы только что подключились и не получили температуру реактора, тогда рисуем просто текст без температуры
wifi_connect = true
oled:clearBuffer() --Очищаем буфер
oled:drawUTF8(1, 7, "Темп. Реактора: ожидание...") --Пишем
oled:sendBuffer() --Рисуем
end
end)
Код в майнкрафте(Очень простой):
local component = require("component")
local internet = require("internet")
local reactor = component.reactor
while true do
local connection = internet.open("ip", 4536)
connection:write(string.sub(reactor.getHeat(), 1, 2))
connection:close()
os.sleep(5)
end
Теперь посмотрим что получилось!
Подключение к Wi-Fi:
Ожидание температуры:
Итог:
В общем то тут довольно всё криво сделано, тут надо много чего доделать, на самом деле. Но в целом, работает же=)
Мне кажется, что это очень круто(Жаль что всё это без чанклодеров так себе работает).
Такие дела.
P. s @cyber01 Я сидел в редакторе долго, появилась ошибка "Произошла ошибка конфигурации или сервера". Пришлось вручную редактировать всё=(