
Hier nun der seit langem fehlende Blogpost zu dem ersten Youtube Video (https://www.youtube.com/watch?v=0FDmBk_AVn8). Das Video ist vom 23.7, also mittlerweile schon 2 Monate alt. Im Video wurde der erste Meilenstein im DCH Projekt vorstellt. Wir hatten hier einen Arduino, der an einen Lichtsensor angeschlossen wurde und die Werte über Serielle Übertragung (UART) an den Minecraft Prozess gesendet hat. Diese wurden damals noch direkt mit Java im Code des selbst Programmierten Canary Mod Plugins gesetzt. Der Aufbau war also so, wie in dem Schema zu sehen.
Es gibt also einen Arduino, der ist direkt an den Rechner mit dem Canary Server angeschlossen
Der Weg ist der folgende:
- Sonnenlicht (1) fällt auf den Lichtsensor (2)
- Der Arduino (3) liest den Analogwert aus und sendet ihn über eine
Serielle Verbindung an den Minecraft Server (4) - Der Minecraft Server setzt durch das selbst geschriebene Light Plugin (5) die Tageszeit
- Die Aktuelle Tageszeit wird an den Minecraft Client weitergeleitet und es wird je nach Wert des Sensors Tag oder Nacht
Der Arduino Code hierfür ist gut überschaubar schnell gebaut :-).
int LDR = 1; //analog pin to which LDR is connected, here we set it to 0 so it means A0 int LDRValue = 0; //that’s a variable to store LDR values int light_sensitivity = 500; //This is the approx value of light surrounding your LDR void setup() { Serial.begin(9600); //start the serial monitor with 9600 buad pinMode(13, OUTPUT); //we mostly use 13 because there is already a built in yellow LED in arduino which shows output when 13 pin is enabled } void loop() { LDRValue = analogRead(LDR); //reads the ldr’s value through LDR Serial.println(LDRValue); //prints the LDR values to serial monitor delay(2000); //This is the speed by which LDR sends value to arduino }
Der Java Code sieht so aus. Er nutz das Eigens erzeugte Kommando „timeControl“ um die Funktion an und aus zu schalten.
package tutorial; import net.canarymod.Canary; import net.canarymod.api.entity.living.humanoid.Player; import net.canarymod.api.inventory.Item; import net.canarymod.api.inventory.ItemType; import net.canarymod.api.world.World; import net.canarymod.chat.MessageReceiver; import net.canarymod.commandsys.Command; import net.canarymod.commandsys.CommandDependencyException; import net.canarymod.commandsys.CommandListener; import net.canarymod.hook.HookHandler; import net.canarymod.hook.player.BlockDestroyHook; import net.canarymod.hook.player.DisconnectionHook; import net.canarymod.hook.player.EntityRightClickHook; import net.canarymod.logger.Logman; import net.canarymod.plugin.Plugin; import net.canarymod.plugin.PluginListener; import java.io.InputStream; import static net.canarymod.chat.Colors.*; public class HelloWorld extends Plugin implements CommandListener, PluginListener { public static final String PORT_NAME = "/dev/tty.usbmodem1411"; public static Logman logger; public static boolean timeControlRunning; InputStream inputStream; Thread t; TimeControl timeControl; public HelloWorld() { logger = getLogman(); } @Override public boolean enable() { logger.info("Starting up"); try { Canary.commands().registerCommands(this, this, false); // Register CommandHandler } catch (CommandDependencyException e) { logger.error("Duplicate command name"); } Canary.hooks().registerListener(this, this); // Register Hooks / Listener ArduinoConnection connection = new ArduinoConnection(); try { connection.connect(PORT_NAME); } catch (Exception e) { e.printStackTrace(); } inputStream = connection.in; return true; } @Override public void disable() { Canary.hooks().unregisterPluginListener(this); logger.info("Plugin disabled"); } @Command(aliases = {"timeControl"}, description = "start the TimeControl", permissions = {""}, min = 2, max = 2, toolTip = "/timecontrol ON|OFF") public void timeControlCommand(MessageReceiver caller, String[] parameters) { String msg; Player player = ((Player) caller); if (parameters[1].equalsIgnoreCase("on")) { msg = "Time Control via Arduino ENABLED"; if (!timeControlRunning) { timeControl = new TimeControl(player.getWorld(), inputStream); t = new Thread(timeControl); timeControlRunning = true; Canary.getServer().consoleCommand("gamerule doDaylightCycle false"); } try { t.start(); } catch (Exception e) { e.printStackTrace(); } } else { msg = "Time Control via Arduino DISABLED"; stopTimeControl(timeControl); } Canary.getServer().broadcastMessage(msg); } /** * Sets the inGame Time * * @param ticks WorldTicks * @param world Worldname */ public static void setTime(long ticks, World world) { world.setTime(ticks); } /** * Stop the automatic TimeChange from Arduino * * @param timeControl TimeControl-Object */ public static void stopTimeControl(TimeControl timeControl) { timeControl.running = false; timeControlRunning = false; logger.info("TimeControl stopped"); Canary.getServer().consoleCommand("gamerule doDaylightCycle true"); } }</pre> <pre>