Menu

Wir haben ersten Kontakt

25. September 2015 - Allgemein
Wir haben ersten Kontakt

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:

  1. Sonnenlicht (1) fällt auf den Lichtsensor (2)
  2. Der Arduino (3) liest den Analogwert aus und sendet ihn über eine
    Serielle Verbindung an den  Minecraft Server (4)
  3. Der Minecraft Server setzt durch das selbst geschriebene Light Plugin (5) die Tageszeit
  4. 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>

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *