Frage

Ich habe etwas ziemlich nickend, um die Farbe einer RGB-LED zu fördern, und ich habe Probleme, die gewünschten Werte zu erhalten.

Ich habe dieses Beispiel aber auf ein Minimum beruht, aber Start, End und Steps wird alle variabel sein ...

Dies sollte linear inkrementiert R (Uint) von 0 bis 255 in 100 Schritten. Ich mache mir hier keine Sorge um Präzision, daher ist es mir egal, ob es richtig rundet oder einfach eine macht Floor/Ceiling

    Dim Start As UInteger = 0
    Dim [End] As UInteger = 255
    Dim Steps = 100

    For x = 1 To Steps
        Dim Temp = ([End] - Start) / Steps * x + Start
        Dim R = CUInt(Temp)

        Debug.Print(x.ToString & ": Temp: " & Temp.ToString & ", R:" & R.ToString)
        LedR.SetPulse(255, R)
        Threading.Thread.Sleep(20)
    Next

Dies gibt aus:

1: Temp: 2.5500, R:196608
2: Temp: 5.1000, R:327680
3: Temp: 7.6500, R:524288
4: Temp: 10.2000, R:655360
5: Temp: 12.7499, R:851968
...
95: Temp: 242.2488, R:15859712
96: Temp: 244.7988, R:16056320
97: Temp: 247.3488, R:16187392
98: Temp: 249.8988, R:16384000
99: Temp: 252.4488, R:16515072
100: Temp: 254.9988, R:16711680

Wie Sie sehen können, ist die TEMP-Variable ziemlich richtig richtig, was eine leichte Ungenauigkeit ermöglicht, aber ich kann nicht sehen, mit welcher Korrelation der Fall ist R.

Es ist möglich, dass Cuint einfach die Temps für Temperatur liest und die behandelt Double Als ein UInt - Aber wenn ja, wie kann ich es dazu bringen, es richtig zu konvertieren?

(Übrigens läuft dies auf einem Netduino), .NET Micro Framework 4.2

Bearbeiten: Nachfolgend angeforderte Tests:

    Dim Test As Integer = 2
    Debug.Print(Test.ToString)
    Debug.Print(CInt(Test).ToString)
    Debug.Print(CUInt(Test).ToString)

    2
    2
    2

    Dim Test As Double = 2.5
    Debug.Print(Test.ToString)
    Debug.Print(CInt(Test).ToString)
    Debug.Print(CUInt(Test).ToString)

    2.5000
    131072
    131072

Verwenden Sie den folgenden Code ...

    For x = 0 To Steps
        Dim Temp As Long = ([End] - Start) \ Steps * x + Start
        Dim R = CType(Temp, UInteger)

        Debug.Print(x.ToString & ": Temp: " & Temp.ToString & ", R:" & R.ToString)
        LedR.SetPulse(255, R)
        Threading.Thread.Sleep(20)
    Next

Ich bekomme (auf der Dim Temp Linie):

An unhandled exception of type 'System.Exception' occurred in Netduino_VBTest.exe

Es gibt keine innere Ausnahme, aber in der Ausgabe ist es eine Ausnahme der ersten Chance, die ich vermute, die Hauptursache ist:

A first chance exception of type 'System.NotImplementedException' occurred in Microsoft.SPOT.Native.dll
War es hilfreich?

Lösung

Versuchen Sie es mit Convert.touint32, hier beschrieben: http://msdn.microsoft.com/en-us/library/y3569ft9.aspx

Auf meinem .NET 4.0 (nicht Micro) unter Windows 7 64bit sehe ich nicht, was Sie mit Cint/Cuint sehen (meine konvertiert richtig). Dies kann ein Implementierungsfehler in Netduino/dem Micro -Framework sein ... wenn ich es hätte, würde ich das oben auf Sie testen.

Andere Tipps

Was auch immer passiert, ich würde Ihnen raten, Uints so viel wie möglich zu vermeiden (ich war dort). Ich würde den Code so schreiben:

Dim Start As Integer = 0
Dim [End] As Integer = 255
Dim Steps As Integer = 100

For x As Integer = 1 To Steps
    Dim Temp As Integer = ([End] - Start) \ Steps * x + Start
    LedR.SetPulse(255, CType(Temp,UInteger))
    Threading.Thread.Sleep(20)
Next

Ich kann es nicht versuchen, weil ich nicht den VB.NET -Compiler zur Verfügung habe und den Code direkt geschrieben habe. Bitte verzeihen Sie mir, wenn es Kompilierungsfehler gibt.

Ein anderer Ansatz völlig anders. Da das Problem mit Doppel und Konvertierungen zu sein scheint, könnten wir es vermeiden, dass Doppel nur Subtrahiere durchführen:

Dim Start As Integer = 0
Dim [End] As Integer = 255
Dim Increment As Integer = 3
Dim Current as Integer = Start

While Current < End
    Current = Current + Increment
    LedR.SetPulse(255, CType(Current ,UInteger))
    Threading.Thread.Sleep(20)
End While

Schnell und schmutzig, aber es funktioniert.

Wie wäre es mit

Debug.Print(Test.ToString().Split("."c)(0))

Ich habe keine Kantenwagen ausgearbeitet, aber dies hat an ein paar Beispielen gearbeitet, die ich ausprobiert habe. Ich würde diese Lösung nicht empfehlen, wenn dies in einer Schleife durchgeführt werden muss, da sie nicht gut funktioniert, aber es könnte ein Stopplücken sein, bis Sie etwas Besseres finden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top