none
Raspberry - Windows IoT Core - HDMI ausgang abschalten RRS feed

  • Frage

  • Hallo zusammen,

    ich arbeite derzeit an einer App, die dauerhaft zum Einsatz kommt. Entsprechend läuft der HDMI ununterbrochen. Das Display (dieses hier), das ansonsten einwandfrei und auf Anhieb unter Windows IoT mit dem Raspberry funktioniert, lässt sich laut Herstellerangaben nicht dimmen, was es (oder ein anderes) irgendwann mal tun soll. Ganz abgesehen davon suche nach einer Lösung, den HDMI-Ausgang komplett abzuschalten (bspw. bei Abwesenheit, wenn ich nicht im Haus/Raum bin). Das verwendete Display verfügt über keine separate Stromversorgung, sodass es dann Spannungsfrei sein sollte.

    Ich habe bei meinen Recherchen noch keine Lösung gefunden, die funktioniert wie bspw. mit Linux/Rasbian wie diese: pi-buch-info.

    Gruß René

    Samstag, 22. April 2017 16:13

Antworten

  • [EDIT] Ich hoffe auch all die, die ein dimmbares Display finden, finden diesen Thread! Ursprügnlich ging es nur um das ausschalten, das Dimmen impliziert logischerweise quasi das ausschalten des Displays. Es hat noch viele viele weitere Vorteile für Anwendungen, bei dem das Display immer laufen soll, oder je nach Sensorwerten abschalten oder dimmen soll. Im Schlafzimmer bspw. ist es nicht ganz so hell doch etwas angenehmer. [/EDIT]

    Hi Community, hi Marco,

    vielen Dank für deinen Hinweis! Ich hatte schon zuvor darüber gelesen. Allerdings wollte ich nicht glauben, dass das Dimmen mit dem Waveshare-Display nicht geht (ich hatte es recht günstig erstanden, daher wollte ich damit erst mal loslegen). Ich hatte auch mit dem Kundenservice, der das bestätigte, Kontakt.

    Wenn auch etwas wehmütig, da die Auflösung des Waveshares doch einfach besser war, habe ich mir schließlich das „offizielle Raspberry Pi 7“ Tochscreen Display“ besorgt (ein solches: LINK, die Preise schwanken ab und zu… Zwischen 60€ und teilweise über 80€). Ich habe irgendwo aufgeschnappt, es sei wichtig für Win IoT Core V1.1 des Displays und nicht das „alte“ V1.0 zu verwenden. HIER auch ein paar Infos dazu, wenn auch bezogen auf Rasbian.

     

    Im Vergleich zum Waveshare (das über HDMI das Bild wiedergibt und über USB die Touchfunktion zur Verfügung stellt), wird das „offizielle Raspberry Pi 7“ Tochscreen Display“ über DSI (Display Serial Interface, ein Flachbandkabel) angeschlossen. Ich habe den Hardwareaufbau so gewählt, dass die Spannungsversorgung über das Display-Board erfolgt und über Jumperwire zum Raspberry durchgeschleift wird (siehe auch Bilder unten). Damit funktionieren Display und Touch seit einem Bestimmten Windows Build (ich verwende derzeit Build 15063) auf Anhieb, ohne Änderungen an Config.txt oder ähnlichem (der Vollständigkeit halber: Ich nutze den Pi3).

    Um nun das Display dimmen zu können, müssen (wie Marco oben schreibt) die beiden I2C Ports verbunden werden. Jeweils Display-Board (ist darauf beschriftet) zum Raspberry: SDA zu Pin3 und SCL zu Pin5. Den INT auf dem Display-Board brauchen wir für diesen Zweck nicht.

    Hier auch ein recht unspannendes, aber informatives Video (im Video wird auf einen Fehler hingewiesen: GND kommt nicht an Pin8, sondern an Pin6): VIDEO

     

    Nun zum Code. Vorab, gut zu wissen!!! Ich schreibe es mal so: Der „Helligkeitswert“ wird fest ins System geschrieben. D.h. wenn die App abstürzt oder das Display „aus“ gedimmt wurde, dann sieht man erst mal nichts. Der Touch funktioniert aber noch. Wer sich also erinnert wo der „Heller-Button“ war, kann dort mal drücken. Alternativ kann man die App erneut debuggen/starten und mit dem Anfangswert wird die Helligkeit festgelegt.

    Ich habe vermutlich den von Marco genannten Beitrag gefunden: LINK

    Darin wird auf die eigentliche Diskussion verwiesen: LINK

     

    Ich fasse zusammen: (Bei mir, wie offensichtlich derzeit auch bei anderen) läuft der Code in der Tat nicht 100%ig zuverlässig. Ist aber nicht schlimm, wir fangen die Exception einfach mit einem try-catch Block auf. Das wirkt sich nur so aus, dass für ca. eine halbe Sekunde lang nichts passiert, der Raspberry sich daraufhin wieder fängt und man den Befehl (heller/dunkler dimmen) einfach wiederholen kann. Da es eben noch nicht zuverlässig läuft, habe ich auf den anfänglich favorisierten Slider verzichtet. Denn das läuft dann doch sehr unflüssig. Etwas besser geht es mit Plus/Minus Buttons. Das bleibt aber jedem selbst überlassen.

     

    Ohne sie weiter untersucht zu haben, hier eine kleine Liste von Fehlern, die bei mir unregelmäßig auftraten:

    „Der Thread 0xc60 hat mit Code 0 (0x0) geendet.“

    „Ausnahme ausgelöst: "System.Runtime.InteropServices.COMException" in DiyplayBrightnessControl.exe“

    „Ausnahme ausgelöst: "System.IO.FileNotFoundException" in DiyplayBrightnessControl.exe

    WinRT-Informationen: Slave address was not acknowledged.“

     

    Die Skala zum Einstellen der Helligkeit sollte von 0-255 reichen.

    Ich habe bei einem Wert von 7 gerade noch so etwas auf dem Display erkannt (bei Tageslicht) bei einem Wert von 6 ist nichts mehr zu sehen, aber der Touch funktioniert noch. Die Helligkeint scheint der Empfindung nach nicht linear mit den entsprechenden Werten anzusteigen, daher habe ich entsprechend größere Schritte bei höherer Helligkeit gewählt. Eigenheit: Bei werten um 170 herum (sagen wir irgendwo zwischen 160 und 180 hat das Display geflimmert, daher wollte ich diese Werte ohnehin überspringen).  Ab einem Wert von 180 tut sich der Empfindung nach quasi nichts mehr an der Helligkeit, weshalb ich 180 als Maximum festgelegt habe.

     

    Unter den Bildern der komplette MainPage.xaml Code und darunter der komplette MainPage.xaml.cs Code. Ich habe ein paar Primärfarben und Kontrastbilder eingebaut, damit man mit der Helligkeit etwas spielen und auch etwas erkennen kann.

    Der Hardwareaufbau:

    So sieht die Test-App aus:

    Der Code:

    <Page
        x:Class="DiyplayBrightnessControl.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:DiyplayBrightnessControl"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <StackPanel Margin="10">
                        <Rectangle Fill="Red" Width="200" Height="100"/>
                        <Rectangle Fill="Blue" Width="200" Height="100"/>
                        <Rectangle Fill="Green" Width="200" Height="100"/>
                        <Rectangle Fill="Yellow" Width="200" Height="100"/>
                    </StackPanel>
                    <Grid Margin="10">
                        <Rectangle Fill="Black" Width="200" Height="300" Stroke="Black" StrokeThickness="3"/>
                        <Rectangle Width="150" Height="250" Stroke="White" StrokeThickness="3"/>
                        <Rectangle Width="100" Height="200" Stroke="White" StrokeThickness="3"/>
                        <Rectangle Width="50" Height="150" Stroke="White" StrokeThickness="3"/>
                    </Grid>
                    <Grid Margin="10">
                        <Rectangle Fill="White" Width="200" Height="300" Stroke="Black" StrokeThickness="3"/>
                        <Rectangle Width="150" Height="250" Stroke="Black" StrokeThickness="3"/>
                        <Rectangle Width="100" Height="200" Stroke="Black" StrokeThickness="3"/>
                        <Rectangle Width="50" Height="150" Stroke="Black" StrokeThickness="3"/>
                    </Grid>
                </StackPanel>
                
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <TextBlock Text="Brightness Value:"/>
                    <TextBlock Name="StatusTextBlock" Text="Display Helligkeit Status" Margin="10,0,0,0" />
                </StackPanel>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" >
                    <Button Name="MinusButton" Content="Minus" Width="120" Margin="10" Click="ButtonPlusMinusClick"/>
                    <Button Name="PlusButton" Content="Plus" Width="120" Margin="10" Click="ButtonPlusMinusClick"/>
                </StackPanel>
            </StackPanel>
        </Grid>
    </Page>

    using System;
    using System.Collections.Generic;
    using Windows.Devices.Enumeration;
    using Windows.Devices.I2c;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    // Die Vorlage "Leere Seite" ist unter http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 dokumentiert.
    
    namespace DiyplayBrightnessControl
    {
        public sealed partial class MainPage : Page
        {
            private static I2cDevice I2CAccel;
            double brightness = 60; // Gibt den Startwert für die Helligkeit vor (theoretisch zwischen 0 und 255).
    
            public MainPage()
            {
                InitializeComponent();
                InitI2C();
                StatusTextBlock.Text = string.Format("{0}", brightness.ToString()); // Zeigt aktuellen Helligkeitswert an
            }
    
            public async void InitI2C()
            {
                string i2cDeviceSelector = I2cDevice.GetDeviceSelector();
                var settings = new I2cConnectionSettings(0x45);
                IReadOnlyList<DeviceInformation> devices = await DeviceInformation.FindAllAsync(i2cDeviceSelector);
                var screen = await I2cDevice.FromIdAsync(devices[0].Id, settings);
                I2CAccel = screen;
    
                ChangeBrightness(brightness);
            }
    
            private void ChangeBrightness(double brightness)
            {
                byte[] writeBuff = new byte[] { 0x86, (byte)(brightness) };
    
                try
                {
                    I2CAccel.Write(writeBuff); // Hier wird die Helligkeit effektiv geändert.
                    StatusTextBlock.Text = string.Format("{0}", brightness.ToString());
                }
                catch (Exception ex)
                {
                    StatusTextBlock.Text = "error";
                    return;
                }
            }
    
            private void ButtonPlusMinusClick(object sender, RoutedEventArgs e)
            {
                // Ich habe bei einem Wert von 7 gerade noch so etwas auf dem Display erkannt (bei Tageslicht)
                // Bei einem Wert von 6 ist nichts mehr zu sehen, aber der Touch funktioniert noch.
                // Die Helligkeint scheint der Empfindung nach nicht linear mit den entsprechenden Werten anzusteigen,
                // daher habe ich entsprechend größere Schritte bei höherer Helligkeit gewählt.
                // Eigenheit: Bei werten um 170 herum (sagen wir irgendwo zwischen 160 und 180 hat das Display geflimmert,
                // daher wollte ich diese Werte ohnehin überspringen).
                // Ab einem Wert von 180 tut sich der Empfindung nach quasi nichts mehr an der Helligkeit, weshalb ich 180
                // als Maximum festgelegt habe.
                int step = 1;                           // Im Bereich unter 20 soll die Helligkeit um jeweils "einen Schritt" verringert werden. Der Typ kann double sein, aber so genau wollen wir nicht regeln.
                if (brightness >= 20) { step = 5; }     // Im Bereich größer/gleich 20 ist die Schrittweite 5
                if (brightness >= 50) { step = 10; }    // Im Bereich größer/gleich 50 ist die Schrittweite 10
                if (brightness >= 160) { step = 20; }   // Im Bereich größer/gleich 160 ist die Schrittweite 20
    
                // Da ich mit beiden Buttons (plus/minus) auf dieselbe Funktion zugreife, muss erst erkannt werden welcher gedrückt wurde.
                var button = (Button)sender;
                var buttonName = button.Name.ToString();
                if (buttonName == "MinusButton") // Abfrage ob der "MinusButton" gedrückt wurde
                {
                    if (brightness > 7) // Minimum 7, unter 7 ist das Display quasi aus
                    {
                        // Entsprechend der Logik funktioniert die gewollte Schrittweite nur mit dem PlusButton richtig.
                        // Damit bei einem Wert von genau 20 aber nicht 5 Schritte, sondern nur 1 Schritt gemacht wird,
                        // lege ich hier die Schrittweiten für die entsprechenden Schwellwerte erneut fest.
                        if (brightness == 20) { step = 1; }
                        if (brightness == 50) { step = 5; }
                        if (brightness == 160) { step = 10; }
                        brightness = brightness - step; // Da MinusButton gedrückt wurde, wird der Helligkeitswert um "step" verringert
                        ChangeBrightness(brightness); // Helligkeitswert wird an die Funktion übergeben, die die Helligkeit aktiv anpasst.
                    }
                    else return;
                }
                else if (buttonName == "PlusButton") // Abfrage ob der "PlusButton" gedrückt wurde
                {
                    if (brightness < 180) // Maximum 180
                    {
                        brightness = brightness + step; // Da PlusButton gedrückt wurde, wird der Helligkeitswert um "step" erhöht
                        ChangeBrightness(brightness); // Helligkeitswert wird an die Funktion übergeben, die die Helligkeit aktiv anpasst.
                    }
                    else return;
                }
                else return;
            }
        }
    }




    • Als Antwort markiert _Queequack_ Donnerstag, 25. Mai 2017 13:36
    • Bearbeitet _Queequack_ Donnerstag, 25. Mai 2017 13:40
    Donnerstag, 25. Mai 2017 13:35

Alle Antworten

  • Hallo René,

    hast Du dir den Thread im englischen Forum schon angeschaut Link


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Samstag, 22. April 2017 18:59
  • Hallo René

    mit diesem Display habe ich auch angefangen. Ich hatte aber dann das Problem, das nach einem Windows Update die Touch-Funktion nicht mehr richtig funktionierte. Ein weiteres Problem waren die USB-Buchsen, die im eingebauten Zustand etwas Druck durch das USB Kabel bekamen und dann abgerissen sind.

    Ich habe dann auf das offizielle 7" Display gewechselt, welches über das Flachbandkabel angeschlossen wird. Bei diesem Display kann man die Hintergrundbeleuchtung über I2C Bus steuern und dunkel schalten. Ich habe es selbst noch nicht probiert, aber es gibt einen Beitrag dazu hier im Forum.

    Viele Grüße
    Marco

    Freitag, 28. April 2017 20:36
  • [EDIT] Ich hoffe auch all die, die ein dimmbares Display finden, finden diesen Thread! Ursprügnlich ging es nur um das ausschalten, das Dimmen impliziert logischerweise quasi das ausschalten des Displays. Es hat noch viele viele weitere Vorteile für Anwendungen, bei dem das Display immer laufen soll, oder je nach Sensorwerten abschalten oder dimmen soll. Im Schlafzimmer bspw. ist es nicht ganz so hell doch etwas angenehmer. [/EDIT]

    Hi Community, hi Marco,

    vielen Dank für deinen Hinweis! Ich hatte schon zuvor darüber gelesen. Allerdings wollte ich nicht glauben, dass das Dimmen mit dem Waveshare-Display nicht geht (ich hatte es recht günstig erstanden, daher wollte ich damit erst mal loslegen). Ich hatte auch mit dem Kundenservice, der das bestätigte, Kontakt.

    Wenn auch etwas wehmütig, da die Auflösung des Waveshares doch einfach besser war, habe ich mir schließlich das „offizielle Raspberry Pi 7“ Tochscreen Display“ besorgt (ein solches: LINK, die Preise schwanken ab und zu… Zwischen 60€ und teilweise über 80€). Ich habe irgendwo aufgeschnappt, es sei wichtig für Win IoT Core V1.1 des Displays und nicht das „alte“ V1.0 zu verwenden. HIER auch ein paar Infos dazu, wenn auch bezogen auf Rasbian.

     

    Im Vergleich zum Waveshare (das über HDMI das Bild wiedergibt und über USB die Touchfunktion zur Verfügung stellt), wird das „offizielle Raspberry Pi 7“ Tochscreen Display“ über DSI (Display Serial Interface, ein Flachbandkabel) angeschlossen. Ich habe den Hardwareaufbau so gewählt, dass die Spannungsversorgung über das Display-Board erfolgt und über Jumperwire zum Raspberry durchgeschleift wird (siehe auch Bilder unten). Damit funktionieren Display und Touch seit einem Bestimmten Windows Build (ich verwende derzeit Build 15063) auf Anhieb, ohne Änderungen an Config.txt oder ähnlichem (der Vollständigkeit halber: Ich nutze den Pi3).

    Um nun das Display dimmen zu können, müssen (wie Marco oben schreibt) die beiden I2C Ports verbunden werden. Jeweils Display-Board (ist darauf beschriftet) zum Raspberry: SDA zu Pin3 und SCL zu Pin5. Den INT auf dem Display-Board brauchen wir für diesen Zweck nicht.

    Hier auch ein recht unspannendes, aber informatives Video (im Video wird auf einen Fehler hingewiesen: GND kommt nicht an Pin8, sondern an Pin6): VIDEO

     

    Nun zum Code. Vorab, gut zu wissen!!! Ich schreibe es mal so: Der „Helligkeitswert“ wird fest ins System geschrieben. D.h. wenn die App abstürzt oder das Display „aus“ gedimmt wurde, dann sieht man erst mal nichts. Der Touch funktioniert aber noch. Wer sich also erinnert wo der „Heller-Button“ war, kann dort mal drücken. Alternativ kann man die App erneut debuggen/starten und mit dem Anfangswert wird die Helligkeit festgelegt.

    Ich habe vermutlich den von Marco genannten Beitrag gefunden: LINK

    Darin wird auf die eigentliche Diskussion verwiesen: LINK

     

    Ich fasse zusammen: (Bei mir, wie offensichtlich derzeit auch bei anderen) läuft der Code in der Tat nicht 100%ig zuverlässig. Ist aber nicht schlimm, wir fangen die Exception einfach mit einem try-catch Block auf. Das wirkt sich nur so aus, dass für ca. eine halbe Sekunde lang nichts passiert, der Raspberry sich daraufhin wieder fängt und man den Befehl (heller/dunkler dimmen) einfach wiederholen kann. Da es eben noch nicht zuverlässig läuft, habe ich auf den anfänglich favorisierten Slider verzichtet. Denn das läuft dann doch sehr unflüssig. Etwas besser geht es mit Plus/Minus Buttons. Das bleibt aber jedem selbst überlassen.

     

    Ohne sie weiter untersucht zu haben, hier eine kleine Liste von Fehlern, die bei mir unregelmäßig auftraten:

    „Der Thread 0xc60 hat mit Code 0 (0x0) geendet.“

    „Ausnahme ausgelöst: "System.Runtime.InteropServices.COMException" in DiyplayBrightnessControl.exe“

    „Ausnahme ausgelöst: "System.IO.FileNotFoundException" in DiyplayBrightnessControl.exe

    WinRT-Informationen: Slave address was not acknowledged.“

     

    Die Skala zum Einstellen der Helligkeit sollte von 0-255 reichen.

    Ich habe bei einem Wert von 7 gerade noch so etwas auf dem Display erkannt (bei Tageslicht) bei einem Wert von 6 ist nichts mehr zu sehen, aber der Touch funktioniert noch. Die Helligkeint scheint der Empfindung nach nicht linear mit den entsprechenden Werten anzusteigen, daher habe ich entsprechend größere Schritte bei höherer Helligkeit gewählt. Eigenheit: Bei werten um 170 herum (sagen wir irgendwo zwischen 160 und 180 hat das Display geflimmert, daher wollte ich diese Werte ohnehin überspringen).  Ab einem Wert von 180 tut sich der Empfindung nach quasi nichts mehr an der Helligkeit, weshalb ich 180 als Maximum festgelegt habe.

     

    Unter den Bildern der komplette MainPage.xaml Code und darunter der komplette MainPage.xaml.cs Code. Ich habe ein paar Primärfarben und Kontrastbilder eingebaut, damit man mit der Helligkeit etwas spielen und auch etwas erkennen kann.

    Der Hardwareaufbau:

    So sieht die Test-App aus:

    Der Code:

    <Page
        x:Class="DiyplayBrightnessControl.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:DiyplayBrightnessControl"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <StackPanel Margin="10">
                        <Rectangle Fill="Red" Width="200" Height="100"/>
                        <Rectangle Fill="Blue" Width="200" Height="100"/>
                        <Rectangle Fill="Green" Width="200" Height="100"/>
                        <Rectangle Fill="Yellow" Width="200" Height="100"/>
                    </StackPanel>
                    <Grid Margin="10">
                        <Rectangle Fill="Black" Width="200" Height="300" Stroke="Black" StrokeThickness="3"/>
                        <Rectangle Width="150" Height="250" Stroke="White" StrokeThickness="3"/>
                        <Rectangle Width="100" Height="200" Stroke="White" StrokeThickness="3"/>
                        <Rectangle Width="50" Height="150" Stroke="White" StrokeThickness="3"/>
                    </Grid>
                    <Grid Margin="10">
                        <Rectangle Fill="White" Width="200" Height="300" Stroke="Black" StrokeThickness="3"/>
                        <Rectangle Width="150" Height="250" Stroke="Black" StrokeThickness="3"/>
                        <Rectangle Width="100" Height="200" Stroke="Black" StrokeThickness="3"/>
                        <Rectangle Width="50" Height="150" Stroke="Black" StrokeThickness="3"/>
                    </Grid>
                </StackPanel>
                
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                    <TextBlock Text="Brightness Value:"/>
                    <TextBlock Name="StatusTextBlock" Text="Display Helligkeit Status" Margin="10,0,0,0" />
                </StackPanel>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" >
                    <Button Name="MinusButton" Content="Minus" Width="120" Margin="10" Click="ButtonPlusMinusClick"/>
                    <Button Name="PlusButton" Content="Plus" Width="120" Margin="10" Click="ButtonPlusMinusClick"/>
                </StackPanel>
            </StackPanel>
        </Grid>
    </Page>

    using System;
    using System.Collections.Generic;
    using Windows.Devices.Enumeration;
    using Windows.Devices.I2c;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    // Die Vorlage "Leere Seite" ist unter http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409 dokumentiert.
    
    namespace DiyplayBrightnessControl
    {
        public sealed partial class MainPage : Page
        {
            private static I2cDevice I2CAccel;
            double brightness = 60; // Gibt den Startwert für die Helligkeit vor (theoretisch zwischen 0 und 255).
    
            public MainPage()
            {
                InitializeComponent();
                InitI2C();
                StatusTextBlock.Text = string.Format("{0}", brightness.ToString()); // Zeigt aktuellen Helligkeitswert an
            }
    
            public async void InitI2C()
            {
                string i2cDeviceSelector = I2cDevice.GetDeviceSelector();
                var settings = new I2cConnectionSettings(0x45);
                IReadOnlyList<DeviceInformation> devices = await DeviceInformation.FindAllAsync(i2cDeviceSelector);
                var screen = await I2cDevice.FromIdAsync(devices[0].Id, settings);
                I2CAccel = screen;
    
                ChangeBrightness(brightness);
            }
    
            private void ChangeBrightness(double brightness)
            {
                byte[] writeBuff = new byte[] { 0x86, (byte)(brightness) };
    
                try
                {
                    I2CAccel.Write(writeBuff); // Hier wird die Helligkeit effektiv geändert.
                    StatusTextBlock.Text = string.Format("{0}", brightness.ToString());
                }
                catch (Exception ex)
                {
                    StatusTextBlock.Text = "error";
                    return;
                }
            }
    
            private void ButtonPlusMinusClick(object sender, RoutedEventArgs e)
            {
                // Ich habe bei einem Wert von 7 gerade noch so etwas auf dem Display erkannt (bei Tageslicht)
                // Bei einem Wert von 6 ist nichts mehr zu sehen, aber der Touch funktioniert noch.
                // Die Helligkeint scheint der Empfindung nach nicht linear mit den entsprechenden Werten anzusteigen,
                // daher habe ich entsprechend größere Schritte bei höherer Helligkeit gewählt.
                // Eigenheit: Bei werten um 170 herum (sagen wir irgendwo zwischen 160 und 180 hat das Display geflimmert,
                // daher wollte ich diese Werte ohnehin überspringen).
                // Ab einem Wert von 180 tut sich der Empfindung nach quasi nichts mehr an der Helligkeit, weshalb ich 180
                // als Maximum festgelegt habe.
                int step = 1;                           // Im Bereich unter 20 soll die Helligkeit um jeweils "einen Schritt" verringert werden. Der Typ kann double sein, aber so genau wollen wir nicht regeln.
                if (brightness >= 20) { step = 5; }     // Im Bereich größer/gleich 20 ist die Schrittweite 5
                if (brightness >= 50) { step = 10; }    // Im Bereich größer/gleich 50 ist die Schrittweite 10
                if (brightness >= 160) { step = 20; }   // Im Bereich größer/gleich 160 ist die Schrittweite 20
    
                // Da ich mit beiden Buttons (plus/minus) auf dieselbe Funktion zugreife, muss erst erkannt werden welcher gedrückt wurde.
                var button = (Button)sender;
                var buttonName = button.Name.ToString();
                if (buttonName == "MinusButton") // Abfrage ob der "MinusButton" gedrückt wurde
                {
                    if (brightness > 7) // Minimum 7, unter 7 ist das Display quasi aus
                    {
                        // Entsprechend der Logik funktioniert die gewollte Schrittweite nur mit dem PlusButton richtig.
                        // Damit bei einem Wert von genau 20 aber nicht 5 Schritte, sondern nur 1 Schritt gemacht wird,
                        // lege ich hier die Schrittweiten für die entsprechenden Schwellwerte erneut fest.
                        if (brightness == 20) { step = 1; }
                        if (brightness == 50) { step = 5; }
                        if (brightness == 160) { step = 10; }
                        brightness = brightness - step; // Da MinusButton gedrückt wurde, wird der Helligkeitswert um "step" verringert
                        ChangeBrightness(brightness); // Helligkeitswert wird an die Funktion übergeben, die die Helligkeit aktiv anpasst.
                    }
                    else return;
                }
                else if (buttonName == "PlusButton") // Abfrage ob der "PlusButton" gedrückt wurde
                {
                    if (brightness < 180) // Maximum 180
                    {
                        brightness = brightness + step; // Da PlusButton gedrückt wurde, wird der Helligkeitswert um "step" erhöht
                        ChangeBrightness(brightness); // Helligkeitswert wird an die Funktion übergeben, die die Helligkeit aktiv anpasst.
                    }
                    else return;
                }
                else return;
            }
        }
    }




    • Als Antwort markiert _Queequack_ Donnerstag, 25. Mai 2017 13:36
    • Bearbeitet _Queequack_ Donnerstag, 25. Mai 2017 13:40
    Donnerstag, 25. Mai 2017 13:35