Jump to content

[Java] Doppelrelay einzeln schalten


Recommended Posts

Hi,

ich möchte das Doppelrelais als Hygrostat und Thermostat verwenden. Aber ich muss bei set.State beide Relais schalten. Da ich ja zwei Listener nutze kann ich dass nicht machen. Wie kann ich das vielleicht anders Schreiben.

 

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tinker;

import com.tinkerforge.*;



/**
*
* @author Adrian
*/

public class NewClass 
{
    public static final String host = "localhost";
    public static final int port = 4223;
    public static final String UID1 = "7Ys";   // Temperatursensor //
    public static final String UID2 = "7Vb";   // Luftfeuchtigkeitssensor //
    public static final String UID3 = "7Yo";   // LCD 20*4 //
    public static final String UID4 = "7FJ";   // Doppel Relay //
    
    public static void main (String args[])  throws Exception 
        {
        System.out.println("Start");
      
        NewClass.Temp();
        }
    public static void Temp()  throws Exception 
        {
        final IPConnection ipcon = new IPConnection(host, port); // Can throw IOException
        final BrickletTemperature temp = new BrickletTemperature(UID1); // Create device object
        final BrickletHumidity hum = new BrickletHumidity(UID2);
        final BrickletLCD20x4 lcd = new BrickletLCD20x4(UID3);
        final BrickletDualRelay dr = new BrickletDualRelay (UID4);
        
        // Add device to IP connection
        ipcon.addDevice(temp); // Can throw IPConnection.TimeoutException
        ipcon.addDevice(hum);
        ipcon.addDevice(lcd);
        ipcon.addDevice(dr);
        // Don't use device before it is added to a connection

        lcd.backlightOn();
        lcd.clearDisplay();
        
        // Get threshold callbacks with a debounce time of xx seconds (xx000ms)
        temp.setDebouncePeriod(1000);
        hum.setDebouncePeriod(1000);

        // Configure threshold for "greater than 30 °C" (unit is °C/100)
        temp.setTemperatureCallbackThreshold('>', (short)(-30*100), (short)0);
        hum.setHumidityCallbackThreshold('>', (short)(0), (short)(100));
        
        // Add and implement temperature reached listener 
        // (called if temperature is greater than 30 °C)
        temp.addListener(new BrickletTemperature.TemperatureReachedListener() {
            @Override
            public void temperatureReached(short temperature) {
                final java.util.Date now = new java.util.Date();
                final java.text.SimpleDateFormat sdf = new 
                        java.text.SimpleDateFormat("dd.MM.yyyy HH.mm.ss");
                lcd.writeLine((short)0, (short)0, "T: " + temperature/100.0 +
                        " " + (char)0b11011111 + "C  ");
                // wenn Temperatur unter 28° dann geht relay 1 an //
                if(temperature < 28*100) {
                    dr.setState(true,false);
                } else {
                    dr.setState(false,false);
                }
            }
        });
        hum.addListener(new BrickletHumidity.HumidityReachedListener() {
            @Override
            public void humidityReached(int humidity) {
                final java.util.Date now = new java.util.Date();
                final java.text.SimpleDateFormat sdf = new 
                        java.text.SimpleDateFormat("dd.MM.yyyy  HH.mm.ss");
                lcd.writeLine((short)1, (short)0, "rF: " + humidity/10.0 
                        + " %RH ");
                lcd.writeLine((short)3, (short)0, sdf.format(now));
               if(humidity < 500) {
                    dr.setState(false,true);
                } else {
                    dr.setState(false,false);
                }
            }});
      
}

}

Ich hab mal den Code gepostet wie er nicht funktionieren kann. Damit mein Problem deutlich wird.

Link to comment
Share on other sites

Hi,

 

Ne kurze Skizze:

Bau dir doch nen Wrapper Klasse mit der du beide Relais einzeln schalten kannst. Dann brauchst du nur eine Methode, die sich nur den alten Zustand merken müsste und dann setState aufruft etc.

 

 

Link to comment
Share on other sites

Da braucht man doch nur ein zusätzliches getState() mit dem man den aktuellen Relais-Zustand ausliest und dann das Ergebnis für das nicht zu verändernde Relais damit wieder setzt.

 

Danke soweit. Vielleicht hast du noch einen Tipp zur Umsetzung (bin Java Anfänger)

Also den Zustand kann ich so abfragen und bspw. auf dem LCD wiedergeben:

 

State state1 = null;
                try {
                    state1 = dr.getState();
                } catch (TimeoutException ex) {
                    Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
                }
lcd.writeLine((short)2, (short)0,"" + state1);

 

Nur wie kann den nun auswerten und für set.State() verwenden? Kann ja nur true oder false sein. Ich brauch irgendeinen Hinweis wo nach ich suchen muss, dann kann ich mir es auch anlesen.

Danke.

Link to comment
Share on other sites

Da steht es schon ^^

http://www.tinkerforge.com/doc/Software/Bricklets/DualRelay_Bricklet_Java.html#BrickletDualRelay::getState

 

(Im setState drüber steht sogar der Hinweis wie man nur eines von beiden schaltet ;))

 

Oder meinst du, dass nicht klar wird, dass man relay1 von getState() abfragen kann?

Letzteres. Ohne das wissen hatte ich probiert mit State dem ganzen Herr zu werden. Aber dass die Lösung so einfach ist. Naja Anfängerfehler.

Ich hab aber gerade selber nochmal nachgelesen. Aber Stand der Satz:

"The returned object has the public member variables boolean relay1 and boolean relay2." schon letzte Woche drin? Dann hab ich wohl einfach nicht genau gelesen.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...