Jump to content

CChris

Members
  • Gesamte Inhalte

    128
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von CChris

  1. Hallo Zusammen,

     

    Ich habe jetzt bereits ein paar mal gelesen, dass man Lampen nicht ohne weitere Schutzschaltungen über das DualRelayBricklet schalten sollte - um Fehlfunktionen bzw. schäden an der Hardware zu vermeiden.

     

    Ich habe jetzt noch eine etwas ältere Version des Relay Bricks, habe aber auch gesehen, dass die Version 1.2 mit entsprechender Schutzschaltung versehen ist.

     

    Ist es mit dem neueren DualRelay damit jetzt möglich, oder nach wie vor nicht empfehlenswert?

     

    Oder sollte ich für das Schalten von Lampen generell lieber auf solidstate relais setzen?

     

    Danke & Gruß,

    Christoph

  2. Nein.

     

    Wie gesagt, ich bin kein Anwendungsentwickler - und habe C# auch nie richtig gelernt...

    Ich habe es mir aber angewöhnt, so viel wie möglich in eine Variable zu schreiben - um dann damit ggf. später auch einfacher arbeiten zu können.

     

    z.B. Verwende ich mehrere Bricklets, die die Temperatur messen können.

    Alle arbeiten mit "temperature"...

     

    Nun wird aber jede Rückgabe in ihre eigene Variable geschrieben:

     

    TemperatureBricklet -> tmp1 = temperature

    TemperatureIRBricklet -> tmp2 = temperature

     

    usw.

    finde ich persönlich Einfacher... ^^

    Aber wie bereits gesagt: Keine Gewähr, ob das schöner - oder gar "korrekter" Code ist.

    Für mich funktioniert es zumindest...

  3. hm... Reicht im Grunde schon.

     

    Ursprünglich war da aber noch eine weitere Ausgabe als Text - und eventuell wollte ich noch ein bisschen mehr damit machen - daher habe ich mich für eine Variable entschieden.

     

    Ich glaube auch, dass das Sinnvoller ist, wenn ich z.B. die Werte wie zuvor beschrieben später in anderen Code-Teilen weiter verarbeiten möchte.

     

    @NIC:

    Ich bin kein Anwendungsentwickler... und meine Erfahrungen in C# sind... naja... sehr spärlich, zugegebener Maßen.

     

    Für kleinere Sachen reicht es sicherlich - aber naja.

    Ich versuche mich mal weiter in das Thema ein zu lesen ^^

     

    Danke.

  4. Hallo Zusammen,

     

    ich weiß - für die Profis hier vermutlich eine 'dumme Frage' ... aber im Moment komme ich um ehrlich zu sein nicht auf die Lösung... auch, wenn sie vermutlich recht simpel ist.

     

    Ich habe derzeit ein normales Temperature Bricklet, sowie ein TemperatureIR Bricklet an meinem Stapel angeschlossen.

     

    Angezeigt wird im Moment die Umgebungstemperatur vom Temp.Bricklet und die ObjektTemperatur vom TempIR Bricklet via CallBack:

     

    Aufruf der CallBacks

                
    BrickletTemperature tmp1 = new BrickletTemperature("dD5", ipcon);
    tmp1.Temperature += TemperatureCB;
    tmp1.SetTemperatureCallbackPeriod(1000);
    
    BrickletTemperatureIR tmp2 = new BrickletTemperatureIR("zY2", ipcon);
    tmp2.ObjectTemperature += TemperatureIRCB;
    tmp2.SetObjectTemperatureCallbackPeriod(1000);
    

     

    Callbacks:

    private void TemperatureCB(BrickletTemperature sender, short temperature)
    {
        short tmpValue = temperature;
        aGauge2.Invoke(new Action(() => aGauge2.Value = tmpValue / 100));          
    }
    
    private void TemperatureIRCB(BrickletTemperatureIR sender, short temperature)
    {
        short tmpIRValue = temperature;
        aGauge1.Invoke(new Action(() => aGauge1.Value = tmpIRValue / 10));
    }
    

     

    Ich möchte jetzt auch die Umgebungstemperatur vom IR Bricklet mit einbeziehen.

    Klar, dafür auch einen CallBack-Aufruf machen, usw...

     

    ABER: ich möchte bei:

    aGauge2 gerne folgendes machen:

     

    Value = ((Temperature/100)+(TemperatureIR/10)/2)

     

    um mir quasi aus beiden Bricklets die Durchschnittstemperatur zu ermitteln und diese anzuzeigen.

     

    Nur: mir fällt eben gerade absolut nicht ein, wie ich das aus den beiden Callbacks heraus bekomme... :-(

     

    Danke und Gruß,

    Chris

  5. Hi, ich hatte ein ähnliches Problem mit meinem "Master", nachdem ich die Tastenkombination für das Starten in den Bootloader gedrückt hatte

     

    Die Hardware Version 2.0 des Master Bricks hat eine Änderung im Leiterplattenlayout, die den Bootloader Modus stört, wenn eine Master Extension wie WIFI, RS485 oder Ethernet im Stack vorhanden ist. In diesem Fall muss die Master Extension aus dem Stack entfernt werden, damit der Bootloader Modus richtig funktioniert. Diese Problem wurde in Hardware Version 2.1 korrigiert.

    Zum Flashen einer neuen Firmware muss der Brick in den Bootloader Modus versetzt werden. Dazu folgende Schritte anwenden:

    Brick per USB an PC anschließen.

    Erase Knopf drücken und gedrückt halten.

    Reset Knopf drücken und wieder loslassen.

    Erase Knopf wieder loslassen.

    (http://www.tinkerforge.com/de/doc/Software/Brickv.html)

     

    Bei mir war das Problem, dass ich die Hardware über einen USB Hub angeschlossen hatte - was im "normalen" Betrieb zwar funktioniert hat, aber zum Flashen der Firmware offenbar nicht.

     

    Nachdem ich den Brick direkt an einem USB Port des Rechners angeschlossen hatte, wurde mir ein neuer COM Port angezeigt - und dieser war dann auch der Brick.

     

    Versuche also erst mal, alle möglichen externen Fehlerquellen aus zu schließen...

    ggf. kann es aber auch sein, dass du erst einen Treiber oder so installieren musst - ich hatte diesbezüglich auch noch was gelesen, weiß jetzt allerdings nicht mehr wo :-(

  6. Hi. Ja, Redundanz wäre nicht schlecht - aber ich glaube, dann auch wieder überdimensioniert ^^

     

    Ich denke im Moment eher an ein zusätzliches Monitoring & alerting, welches dann im Fehlerfall halt eine Benachrichtigung schickt.

    Sooo kritisch sind die Systeme auch wieder nicht.

     

    Hintergrund der 'eigenständigen' Systeme war ursprünglich die Situation, dass bei einer Änderung oder Wartung an einem Terrarium immer beide betroffen waren, da sie beide durch die gleiche Logo gesteuert werden.

     

    Allerdings bringt mich mein jetziger Ansatz zum nächsten Punkt, über welchen ich mir Gedanken mache...

     

    Die Software soll auf dem RED Brick im Hintergrund laufen. Eine GUI ist nicht notwendig - es reicht ggf. Ein paar Infos auf einem OLED o.ä. anzuzeigen.

     

    - das Monitoring sollte überwachen können, ob die Anwendung ausgeführt wird oder nicht (beendet, hängen geblieben, etc.)

     

    - die Software sollte Zusätzlich ein Webinterface bieten, über welches man in den 'automatischen' prozess eingreifen kann -> einzelne Komponenten ggf. ausschalten, obwohl die logik bestimmt hat, dass sie laufen sollten

     

    - ein Hardwareseitiges eingreifen sollte auch möglich sein, z.B. über einen zusätzlichen Schalter nach einem Relais...

     

    - Und hier wäre zu überlegen, ob es nicht ggf. Interessant sein könnte, wenn die SW dies wiederum mitbekommt und entsprechend loggt bzw. ein Signal gibt.

     

    Bsp. Lampe fällt aus und muss gewechselt werden. Per SW ist diese aber eingeschaltet - nun schalte ich sie per switch aus, es geht eine LED an oder ein piepton, damit ich das Einschalten nicht vergesse...

     

    Oder irgend ein ähnliches Szenario halt.

  7. Ja, genau das mache ich auch.

    if (IPConnection.CONNECTION_STATE_CONNECTED == 1)
                    {
                        try
                        {
    
                            ipcon.Disconnect();
                        }
                        catch (Exception exceptionMsg)
                        {
                            MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                        }
                    }
    

     

    Folgendes verhalten:

    Setze ich das ipcon.Disconnect nicht in eine try/catch block, beendet sich das programm wegen einer nicht behandelten eception. Der Tinkerforge.NotConnected (o.ä. Genauen Text hab ich jetzt nicht im Kopf).

     

    Ich kann also kein Disconnect machen, weil kein Connect abgesetzt wurde.

     

    Meine Lösung daher mit der if abfrage.

    Nur:

     

    Der Code springt IMMER in den if Block rein und gibt mir in einer msgbox, welche ich testweise mal mit rein gebaut habe den CONNECTION_STATE mit 1 aus. Springt dann aber in den catch block und wirft die exception, dass keine Verbindung besteht.

     

    Das verwirrt mich ;)

  8. Hallo Zusammen,

     

    ich habe gerade ein kleines Problemchen, bei welchem ich nicht wirklich durchblicke :-(

     

    Ich habe eine kleine Testanwendung geschrieben, welche mir ähnlich wie der BrickViewer erst einmal alle Bricks und Bricklets anzeigt, die angeschlossen sind.

     

    Dazu führe ich folgenden Code aus:

     

    public partial class Form1 : Form
        {
    
            private static string HOST = "localhost";
            private static int PORT = 4223;
    
            IPConnection ipcon = new IPConnection();
    
    public Form1()
            {
                InitializeComponent();
    
                // Register IP Connection callbacks
                ipcon.EnumerateCallback += EnumerateCB;
                //ipcon.Connected += ConnectedCB;
    
                this.FormClosing += Form1_FormClosing;
            }
    
    private void EnumerateCB(IPConnection sender, string UID, string connectedUID,
                                    char position, short[] hardwareVersion,
                                    short[] firmwareVersion, int deviceIdentifier,
                                    short enumerationType)
            {
                if (enumerationType == IPConnection.ENUMERATION_TYPE_CONNECTED ||
                   enumerationType == IPConnection.ENUMERATION_TYPE_AVAILABLE)
                {
                    string deviceName = "";
    
                    // DeviceIdentifier in lesbaren Text umwandeln
                    switch (deviceIdentifier.ToString())
                    {
                        case "11":
                            deviceName = "DC Brick";
                            break;
    ...
                    }
    if (connectedUID == "0")
                    {
                        connectedUID = "--";
                    }
    
                    //Baue ListenItems auf
                    string[] myItems = new string[5];
    
                    if (position == '\x0030')
                    {
                        myItems[3] = "--";
                    }
                    else
                    {
                        myItems[3] = position.ToString().ToUpper();
                    }
    
                    myItems[0] = deviceName;
                    myItems[1] = UID;
                    myItems[2] = connectedUID; 
    
                    ListViewItem LVItem = new ListViewItem(myItems);
    
                    try
                    {
                        listView2.Invoke(new Action(() => listView2.Items.Add(LVItem)));
                    }
                    catch (Exception exceptionMsg)
                    {
                        MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                    }
                }
    
    if (connectedUID == "0")
                    {
                        connectedUID = "--";
                    }
    
                    //Baue ListenItems auf
                    string[] myItems = new string[5];
    
                    if (position == '\x0030')
                    {
                        myItems[3] = "--";
                    }
                    else
                    {
                        myItems[3] = position.ToString().ToUpper();
                    }
    
                    myItems[0] = deviceName;
                    myItems[1] = UID;
                    myItems[2] = connectedUID;
    
                    ListViewItem LVItem = new ListViewItem(myItems);
    
                    try
                    {
                        listView2.Invoke(new Action(() => listView2.Items.Add(LVItem)));
                    }
                    catch (Exception exceptionMsg)
                    {
                        MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                    }
                }
            }
    
    private void button1_Click(object sender, EventArgs e)
            {
                // Connect to brickd, will trigger cb_connected
                try
                {
                    ipcon.Connect(HOST, PORT);
                    //MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(), "2");
                }
                catch (Exception exceptionMsg)
                {
                    MessageBox.Show(exceptionMsg.Message + "\n\nDas Programm wird beendet.", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    this.Close();
                }
    
                try
                {
                    ipcon.Enumerate();
                    //MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(),"3");
                }
                catch (Exception exceptionMsg)
                {
                    MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                }
            }
    
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (e.CloseReason == CloseReason.UserClosing)
                {
    
                    MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(), "4");
                    // Prompt user to save his data
    
                    // CONNECTION STATE = 1, obwohl noch keine Verbindung aufgebaut wurde... ?
                    if (IPConnection.CONNECTION_STATE_CONNECTED == 1)
                    {
                        try
                        {
    
                            ipcon.Disconnect();
                        }
                        catch (Exception exceptionMsg)
                        {
                            MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                        }
                    }
    
                    listView2.Clear();
    
                    MessageBox.Show("Tinkerforge Disconnected", "Anwendungsstop!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }
    }

     

    Das Phänomen:

    Obwohl das Connect erst nach klick auf den button1 stattfindet - erst dann baut er mir die Liste auf, welches im EnumerateCB mit drin steht, bekomme ich für die Abfrage im Form1_FormClosing bei IPConnection.CONNECTION_STATE_CONNECTED den Wert 1 zurück.

     

    Bezieht sich dies nur auf die reine USB-Verbindung?

    Ist also nur dann 0, wenn der USB Stecker gezogen ist?

     

    Wenn ja, wie sollte ich die Abfrage ändern, damit die "Verbindung" zu den Bricks getrennt wird?

     

    Danke schon mal und Gruß,

    Christoph

  9. Hi Zusammen,

     

    Als ich vor knapp 3 Jahren auf TinkerForge aufmerksam wurde, gab es glaube ich nur das Temperature und maximal das Temperature IR Bricklet.

     

    Inzwischen hast sich hier Ja einiges getan, wie ich feststellen konnte - das Thermocouple und das TPC Bricklet sind zumindest für mich neu, was die Möglichkeiten zur Temperaturüberwachung angeht.

     

    Da ich derzeit in meinen Terrarien TP1000 Fühler verbaut habe, klingt natürlich gerade das das TPC Bricklet besonders interessant.

     

    Jetzt bin ich natürlich am überlegen, mit welcher Hardware sich welche Anwendungsmöglichkeiten bieten...

     

    -TPC: Es ist egal, wo das Bricklet verbaut ist, gegessen wird die Temperatur am Fühler

     

    - Temperature: Es wird die Temperatur gemessen, wo das Bricklet verbaut würde... macht u.U. weniger Sinn, da das Bricklet ggf. schlecht im Terrarium platziert werden kann (Kabelanschlüsse).

     

    - Temperature IR: Könnte Sinn machen, um z.B. die Temperatur am Sonnenplatz zu messen, wenn dort kein Fühler verbaut werden kann...

     

    Thermocouple: Ist im prinzip das gleiche wie TPC, bloß für andere Fühler

     

    Sind meine Gedanken hierzu richtig?

  10. Hallo __LC__

     

    Ein k.o. Kriterium ist das natürlich nicht - die Idee, das alle Terrarien ausfallen gefällt mir allerdings auch nicht so wirklich.

     

    Im Moment ist das zwar weniger Tragisch, da die Tiere in den Terrarien einen Ausfall von X-Stunden denke ich ganz gut weg stecken könnten - dennoch möchte ich bei verschiedenen Terrarien das Risiko entsprechend gering halten.

     

    Zumal es durchaus sein kann, dass sich am Tierbestand und somit an den Terrarien in Zukunft auch noch das ein oder andere Ändern wird - und dann könnte ein Ausfall eventuell schon entsprechend Kritischer sein.

     

    Ich bin ja aber aktuell noch ganz am Anfang meiner Planungen - und gerade die Failure-Szenarien spielen hier eine nicht unerhebliche Rolle.

    Schließlich sollte die Heizanlage nicht unbedingt auf ON stehen bleiben, wenn ein System ausfällt... Das könnte im Schlimmsten Fall sonst böse enden.

     

    Für mich bedeutet das also auch, dass ich versuche, im Schlimmsten Fall nur ein "Problemkind" zu haben - sprich ein Terrarium, dessen Steuerung und Anlage ausgefallen ist.

     

    Wenn es eine längere Störung sein sollte, dann kann das Tier ggf. immer noch in eines der anderen Terrarien dazu gesetzt werden (zumindest in meiner jetzigen Situation).

     

    Ein nächster Punkt ist, dass die einzelnen Terrarien u.U. andere Parametrierungen und Anforderungen benötigen.

    Wenn ich also die Steuerung anpassen muss, etc.pp. dann kann ich bei einer Lösung, welche für jede Anlage autark läuft vorab entsprechend Testen - und die bestehenden Terrarien laufen ohne Probleme und ohne Risiko weiter...

     

    ... Naja, wie du siehst hüpfen mir die verschiedensten Gedanken diesbezüglich im Kopf umher... :)

     

    Zu einem Endgültigen Schluss bin ich aber noch nicht gekommen.

    Nur: Ich will am Ende nicht am falschen Ende sparen ;)

  11. Hast du ggf. einen USB-Hub in Verwendung?

    Wenn ja, versuche auf jeden Fall mal einen direkten USB Anschluss.

     

    Bei mir war das Problem ähnlich, während sich der MasterBrick im Bootloader (für FW Update) befand...

     

    Zuvor wurde er vom Viewer ohne Probleme erkannt, die FW ließ sich aber nicht updaten...

    Nach Erase+Reset Tastenkombination, schien erst einmal alles tot zu sein.

    Keinerlei Reaktion mehr, keine LEDs - nichts.

     

    Auch im Viewer wurde MB nicht gefunden.

     

    Erst nach testen eines anderen USB-Ports, welcher eben nicht an einem USB Hub war, wurde auch die neue COM-Schnittstelle im Gerätemanager angezeigt und die FW konnte aufgespielt werden...

    Ich könnte mir gut vorstellen, dass es bei dir etwas ähnliches sein dürfte - denn nach knapp 3 Jahren in der Bastelkiste - und etlichen "Experimenten" läuft mein MB nach wie vor... ;) Ist also ziemlich robust.

  12. Hallo Zusammen,

     

    ich habe heute mal meinen alten MasterBrick ausgegraben um mich wieder ein wenig in das Thema hinein zu arbeiten...

    Als erstes wollte ich daher mal ein FW Update machen.

     

    Für die angeschlossenen Bricklets hat dies zumindest lt. Anzeige im BrickViewer auch geklappt, aber mein Master lässt sich scheinbar nicht von FW 2.0.6 auf 2.4.1 updaten ?!

     

    Ich hab es jetzt mehrmals probiert... auch mit Reset, und Verbindung trennen und neu anschließen.

    Die FW bleibt auf 2.0.6

     

    Irgend eine Idee? Gibt es einen speziellen Trick?

     

    Edit:

    Habe gerade das hier gefunden und entsprechend Ausgeführt...

     

    Brick per USB an PC anschließen.

    Erase Knopf drücken und gedrückt halten.

    Reset Knopf drücken und wieder loslassen.

    Erase Knopf wieder loslassen.

     

    Allerdings tut sich jetzt gar nichts mehr und mein BrickViewer zeigt den Master nicht mal mehr an :-(

     

    Edit II:

    Ok. Lag am USB Hub :D

     

    FW erfolgreich aufgespielt.

    Thema geschlossen... sorry für den Unnötigen Beitrag :-(

  13. Hallo liebe Community,

     

    Ich habe bereits vor einigen Jahren mal ein klein wenig mit Tinkerforge herum experimentiert, um mir eine Steuerung für Terrarien zu bauen.

     

    Leider verliefen sich die experimente damals aus Zeitlichen Gründen relativ schnell im Sand - und es kam nie zu einem Abschluss.

     

    Jetzt will ich das ganze aber noch einmal versuchen... Und wende mich daher erst einmal mit ein paar Fragen an Euch, in der Hoffnung, ihr könnt mir vielleicht den ein oder anderen Tipp mitgeben.

     

    Dass ich für die Grundfunktionen der Steuerung Bricklets wie Temperatur, Humidity und co. benötige, ist soweit klar - und zum Teil aus meinen früheren versuchen auch noch vorhanden.

     

    Aber:

    Ich möchte gerne, dass jedes Terrarium eine eigene Steuerung bekommt, welche an und für sich autark läuft.

    Diese Steuerungen sollen aber über eine Serveranwendung konfiguriert werden. Sprich - über eine Anwendung möchte ich Zugriff auf mehrere, separat laufende Steuerungen.

     

    Wie sollte dies am besten gelöst werden, wenn ich an dieser Stelle komplett mit TF arbeiten will? Brauche ich einen RED brick für jedes Terrarium, oder reicht einer als Server, welcher sich dann quasi via wifi, rs485 oder ethernet,.... Mit den jeweiligen Steuerungen verbindet?

     

    Die einzelnen Stwuerungen sollen ihre Arbeit auch machen, wen der 'Server' einmal nicht erreichbar ist - Konkret müssen parameter wie max. temperatur, Uhrzeit und co. also auch auf der jeweiligen Steuerung gespeichert sein - und nicht nur über den Server.

     

    Daher gehe ich im Moment davon aus, dass jede Steuerung ihren eigenen Redbrick braucht & der Server nur eine SW Lösung sein kann...

     

    Helft mir doch nach Möglichkeit, eine Sinnvolle Einkaufsliste zu erstellen :)

     

    Vielen Dank schon mal und Grüße,

    Christoph

  14. dass das Programm davon nix mitbekommt macht nichts...

    wenn der Rechner hängen bleibt oder probleme macht, dann bekommt das Programm sowieso nix mehr mit.

     

    Mir ist nur aufgefallen, dass wenn ich den Status mit setState auf true setze, der Monoflop Counter eben nicht runterzählt und das Relay auf Off stellt, wenn z.B. das Programm beendet wird.

     

     

    Beispiel:

    Ich möchte im Programm das Relay einschalten.

    Wie lange usw. ist jetzt erstmal unwichtig.

     

    irgndwann soll das Relay wieder ausgeschaltet werden.

    "Normalerweise" mit SetState(true...) und anschließend mit SetState(false...)

     

    bricht jetzt die Verbindung ab, oder beendet sich die Software, sollte "in diesem Moment" der Monoflop-Counter beginnen und das Relay nach z.B. 20000ms auf false stellen (da ja die Kontrolle über das Programm fehlt).

     

    Dies funktioniert aber nicht, wenn ich z.B. im Callback den Monoflop setze und an anderer Stelle dann dem Bricklet sage: SetState(true...)

     

    bei der Simulation bleibt das Relay dann nach beenden der Software an.

    Der MonoflopCounter wird also in diesem Moment nicht mehr "aktiviert"

  15. Hi, nein.... (oder doch?)

     

    Ich hatte mir das ganze Ursprünglich wie folgt gedacht:

     

    Ich setze den Status des Relay vom Bricklet auf true... und lasse weiterhin meinen Code laufen...

     

    wird jetzt plötzlich die Verbindung getrennt (warum auch immer) setzt der Monoflop-Counter ein. und das Gerät schaltet das Relay auf false, wenn der MonoflopCounter abgelaufen ist.

×
×
  • Neu erstellen...