adrianbernhard Geschrieben May 28, 2012 at 18:25 Geschrieben May 28, 2012 at 18:25 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. Zitieren
batti Geschrieben May 28, 2012 at 20:09 Geschrieben May 28, 2012 at 20:09 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. Zitieren
Wumpus Geschrieben May 28, 2012 at 21:54 Geschrieben May 28, 2012 at 21:54 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. Zitieren
adrianbernhard Geschrieben May 29, 2012 at 12:03 Autor Geschrieben May 29, 2012 at 12:03 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. Zitieren
ThomasKl Geschrieben May 29, 2012 at 13:16 Geschrieben May 29, 2012 at 13:16 im englischen Forum hat da auch schon jemand eine Lösung zu http://www.tinkerunity.org/forum/index.php/topic,91.msg2822.html#msg2822 Zitieren
adrianbernhard Geschrieben May 31, 2012 at 13:18 Autor Geschrieben May 31, 2012 at 13:18 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 Zitieren
AuronX Geschrieben May 31, 2012 at 14:36 Geschrieben May 31, 2012 at 14:36 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? Zitieren
adrianbernhard Geschrieben June 2, 2012 at 12:08 Autor Geschrieben June 2, 2012 at 12:08 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. Zitieren
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.