adrianbernhard Posted May 28, 2012 at 06:25 PM Share Posted May 28, 2012 at 06:25 PM 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. Quote Link to comment Share on other sites More sharing options...
batti Posted May 28, 2012 at 08:09 PM Share Posted May 28, 2012 at 08:09 PM 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. Quote Link to comment Share on other sites More sharing options...
Wumpus Posted May 28, 2012 at 09:54 PM Share Posted May 28, 2012 at 09:54 PM 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. Quote Link to comment Share on other sites More sharing options...
adrianbernhard Posted May 29, 2012 at 12:03 PM Author Share Posted May 29, 2012 at 12:03 PM 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. Quote Link to comment Share on other sites More sharing options...
ThomasKl Posted May 29, 2012 at 01:16 PM Share Posted May 29, 2012 at 01:16 PM im englischen Forum hat da auch schon jemand eine Lösung zu http://www.tinkerunity.org/forum/index.php/topic,91.msg2822.html#msg2822 Quote Link to comment Share on other sites More sharing options...
adrianbernhard Posted May 31, 2012 at 01:18 PM Author Share Posted May 31, 2012 at 01:18 PM Ich hab meinen Fehler gefunden. ich wuste nicht dass mit getState().relay1 der Zustand des einzelnen Relais abgefragt werden kann. p.s. könnte vielleicht in die Dokumentation aufgenommen werden, für noobs wie mich Quote Link to comment Share on other sites More sharing options...
AuronX Posted May 31, 2012 at 02:36 PM Share Posted May 31, 2012 at 02:36 PM 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? Quote Link to comment Share on other sites More sharing options...
adrianbernhard Posted June 2, 2012 at 12:08 PM Author Share Posted June 2, 2012 at 12:08 PM 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.