[HowTo] Temperatur und Feuchtigkeitssensor DHT11/DHT22 an SaS

Hier die Anzeige Lichtsensor. Die Glühbirne wird heller, je mehr Lux gemessen werden.
licht.jpg
 
Kennt irgendjemand eine Mathe-Formel für folgendes Problem?

Im vorangegangenen Post sieht man die Lichtsensoranzeige. Der Sensor liefert einen Lux-Wert. Dieser geht von 0 bis 65535 lx. Da am interessantesten der untere Bereich ist, wollte ich diesen strecken und ab 1000 lx bis Ende stauchen. Formeln für Zerfall, exponentielles Wachstum etc. brachten nicht den gewünschten Anzeigeeffekt. Von 0 bis 1000 lx soll wie gesagt etwa die Hälfte der Anzeigeskala genutzt werden, bis 65535 lx weiter exponentiell gestaucht der Rest der Skala.

Wer eine Idee für eine Formel hat, bitte posten. Die Skala hat eine Einteilung von 0 bis 500 (Punkte).
 
Moin

Also: 0-1000 = 0-50% und 1000-65535 = 50-100% :?:
....nee, so eine Formel kenne ich nicht.
:silly:
 
Die Idee mit der Parabel (Exponentialfunktion) war auch mein erster Gedanke, doch da gibt es das Problem mit dem Wert 0 und 1, wobei 1 dabei viel zu "hoch" ist.

Im Moment verwende ich folgende Formel:
PHP:
    $lx=pow($lx,0.1264)*32-32+2;
    if ($lx<0) {$lx=0;}
Den Lux-Wert hoch 0,1264 für die exponentielle Steigerung. Dann multipliziert mit 32, um in etwa bei einem Luxwert von 65535 (max.) auf 100 zu kommen. Um bei 1 lx jetzt nicht einen unverhältnixmäßig großen Balken zu bekommen, ziehe ich die 32 wieder ab und addiere 2 (für einen verhältnismäßigen Balken dazu. Bei 0 lx gäbe es jetzt allerdings negative Werte. Daher danach die Abfrage auf Negativ und das Setzen auf 0.

Irgendwie bin ich damit aber nach wie vor nicht wirklich zufrieden. :(

Im Prinzip hätte ich den Bereich zwischen 0 und 1000 noch etwas mehr gestreckt. Naja, vielleicht kommt ja noch die "Erleuchtung". ;)

- - - Aktualisiert - - -

licht0.jpg

licht1.jpg

licht10.jpg

licht100.jpg

licht1000.jpg

licht10000.jpg

licht65535.jpg
 
Zuletzt bearbeitet:
lichts12.jpg
zwei Slots für aktuelle Anzeige und Historie.
 
Welcher Sensor ist das genau?
 
Das ist dieser hier:
BH1750FVI

https://www.amazon.de/gp/product/B00EZI0E3Q/ref=oh_aui_detailpage_o03_s02?ie=UTF8&psc=1

Dieser hat bereits "Beinchen" angelötet und kann entweder mit 4 Female/Female-Kabeln an die I2C-Schnittstelle des Raspberry angeschlossen werden, oder man steckt es in ein Breadboard und verkabelt es dann.

  • VCC (3,3V)
  • SDA
  • SCL
  • GND

Meldet sich mit
Code:
i2cdetect -y 1
auf 0x23 (35)

Code:
lichti2c
(bei SaS dabei) liest die Lux-Zahl aus (0-65535 lx)

- - - Aktualisiert - - -

Nachtrag OT: So langsam wünscht man sich ein großes 42 Zoll Display hochkant an die Wand, auf dem SaS seine gesamten Sensordaten und Historien auf einen Blick anzeigt.
:habenwol: aber rentiert sich nicht :mrgreen:
 
sind 2 Stück bestellt ....
 
Können beide an den I2C angeschlossen werden. Man muss bei einem der beiden das 5. Beinchen zwecks Adressänderung noch an 3.3V klemmen. Müsste ich aber nochmal im Internet suchen, wo er dann landet. Ggf. mit i2cdetect -y 1 sehen, wo er auftaucht.
 
So können die info-Slots auch aussehen:
slotshgr.jpg
(mal mit ein paar Beispieldaten von meinem Versuchs-Pi)
Hintergründe sind mit einem einfachen
PHP:
    echo '<div  style="opacity:0.90;filter:alpha(opacity=90);left:-135px;top:0px;position:absolute;"><img  src="'.picdesign("hgr/wetter.png").'" border="0"></div>';
möglich.
 
kannst Du mir mal ein Beispielpsg für den Temperaturverlauf zeigen, ich würde gerne mal die Warmwassertemperatur im Speicher in den letzten 24 Stunden sehen
 
Ich vermute Temperatur 0-100°C-Skala?

- - - Aktualisiert - - -

Ich brauche das psg, welches den Wert ausliest. Dort muss die Historie eingebaut werden. Bitte mal das aktuelle mit Namen des psg posten.

- - - Aktualisiert - - -

Ich strlle dann das veränderte/erweiterte psg und das info-psg hier ein. Wird aber heute nichts mehr.
 
0-100 sollte passen; Drunter wäre schlecht und drüber auch ;)

psgTempDS18B20_s1.php
Code:
<?php


    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch        Warmwasser                    PSG-Script   |
        |                                                                     |
        +---------------------------------------------------------------------+
    */


    include __DIR__."/../include/psg.php";
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));








 if ($gerarray["Counter"]>=4) {
        $ver="V#V 1.00#";
        $dummy=sleep(2);
        $befehl='sudo cat /sys/bus/w1/devices/28-041661e0aeff/w1_slave | grep -E -o ".{0,0}t=.{0,5}" | cut -c 3-';
        $url=$helperurlpi2."?befehl=".encodiere($befehl,33455);
        $erg=web($url,$post);
        $erg=($erg+2000)/100;   #Korretur + 2 Grad
        if ($erg=="") {
            $echo=$ver."C##";
        }
        else {
            $erg=explode(" ",$erg);
            $temp4=$erg[0]/10;
            $feucht4=$erg[1]/10;
            $echo='';
            $echo.='P#';
            $echo.='<div style="font-size:16px;text-align:right;width:240px;position:absolute;top:-5px;">Luftfeuchte: '.str_replace(".",",",sprintf("%.1f",$feucht4)).' %%';
            $echo.='<br />Temperatur: '.str_replace(".",",",sprintf("%.1f",$temp4)).'°C</div>';
            $echo.='*HTML#';
            $echo.='V#'.$temp4.'*temp4#';
            $echo.=$ver;
        }
    }
    else {
        $echo=$ver."C##";
    }
    echo $echo;
    exit;
?>

alles easy ... eilt doch nicht, vielleicht verstehe ich das ja dann baue ich eine extra Info Seite.

SAS ist schon cool ... DANKE
 
Zuletzt bearbeitet:
psgTempDS18B20_s1.php
PHP:
<?php


    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch        Warmwasser                    PSG-Script   |
        |                                                                     |
        +---------------------------------------------------------------------+
    */


    include __DIR__."/../include/psg.php";
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));

    if ($gerarray["Counter"]>=4) {
        $ver="V#V 1.00#";
        $dummy=sleep(2);
        $befehl='sudo cat /sys/bus/w1/devices/28-041661e0aeff/w1_slave | grep -E -o ".{0,0}t=.{0,5}" | cut -c 3-';
        $url=$helperurlpi2."?befehl=".encodiere($befehl,33455);
        $erg=web($url,$post);
        $erg=($erg+2000)/100;   #Korretur + 2 Grad
        if ($erg=="") {
            $echo=$ver."C##";
        }
        else {
            $erg=explode(" ",$erg);
            $temp4=$erg[0]/10;
            $feucht4=$erg[1]/10;
            $zeitl=$gerarray["zeitl"];
            $zeith=date("G")*1;
            if ($zeith!=$zeitl) {
                $tempz[$zeith]=array();
                $zeitl=$zeith;
            }
            $temp=$temp4;
            if ($zeitl>23) {$zeitl=0;}
            if ($temp<$tempz[$zeith]["min"] or !isset($tempz[$zeith]["min"])) {
                $tempz[$zeith]["min"]=$temp;
            }
            if ($temp>$tempz[$zeith]["max"] or !isset($tempz[$zeith]["max"])) {
                $tempz[$zeith]["max"]=$temp;
            }
            $echo='';
            $echo.='P#';
            $echo.='<div style="font-size:16px;text-align:right;width:240px;position:absolute;top:-5px;">Luftfeuchte: '.str_replace(".",",",sprintf("%.1f",$feucht4)).' %%';
            $echo.='<br />Temperatur: '.str_replace(".",",",sprintf("%.1f",$temp4)).'°C</div>';
            $echo.='*HTML#';
            $echo.='V#'.$temp4.'*temp4#';
            $echo.='V#'.serialize($tempz).'*tempz#';
            $echo.='V#'.$zeith.'*zeith#';
            $echo.='V#'.$zeitl.'*zeitl#';
            $echo.=$ver;
        }
    }
    else {
        $echo=$ver."C##";
    }
    echo $echo;
    exit;
?>

psginfoWasserTemp.php
PHP:
<?php

    /*
        ╔═══╗ ╔═══╗ ╔═══╗ ┌───────────────────────────────────────────────────┐
        ║     ║   ║ ║     │  SensorAndSwitch (C)2014-16 Bluedragon            │
        ╚═══╗ ╠═══╣ ╚═══╗ ├──────────────────┬────────────────────────────────┤
            ║ ║   ║     ║ │  SAS-PsG (Info)  │  psginfoWasserTemp.php         │
        ╚═══╝ ╝   ╚ ╚═══╝ ├──────────────────┴────────────────────────────────┤
        ┌─────────────────┤  Infografik Temp                                  │
        │  Info:          ╘═══════════════════════════════════════════════════╡
        ├─────────────────────────────────────────────────────────────────────┤
        │  Infoslot                                                           │
        ╘═════════════════════════════════════════════════════════════════════╛
    */
 
    include_once __DIR__."/../include/psg.php";

    $ver="V#V 6.00#";
    $name="TempDS18B20_s1";
    $gerarray=getGerInfo($name);
    $tempz=unserialize($gerarray["tempz"]);
    $info ="";

    # 10°C-Linien
    
    for ($g=0;$g<=10;$g++) {
        $l=$g*10+1;
        $info.='<div id="tab" style="position:absolute;border:1px;top:'.$l.'px;background-color:rgb(80,80,80);border-style:solid;border-color:black;left:30px;width:485px;height:1px"></div>';
        $info.='<div id="tab" style="position:absolute;border:1px;top:'.($l-4).'px;left:0px;font-size:10px;width:30px;text-align:right">'.(100-$g*10).'°C</div>';
    }
    
    # 5°C-Linien
    
    for ($g=0;$g<=9;$g++) {
        $l=$g*10+6;
        $info.='<div id="tab" style="position:absolute;border:1px;top:'.$l.'px;background-color:rgb(60,60,60);border-style:solid;border-color:black;left:30px;width:485px;height:1px"></div>';
    }
    
    # Markierung akt. Stunde
    
    for ($z=0;$z<=23;$z++) {
        $h=113;
        $t=1;
        $p=$z*20+5+30;
        if ($z==$gerarray["zeith"]) {
            $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.($p-2).'px;background-color:rgb(80,80,80);border-style:solid;border-color:rgb(80,80,80);font-size:8px;width:19px;height:'.$h.'px"></div>';
        }
    }
    

    # Tempsäulen
    
    for ($z=0;$z<=23;$z++) {
        $h=$tempz[$z]["max"]-$tempz[$z]["min"];
        $h0=$tempz[$z]["max"];
        $t=100+1-$tempz[$z]["max"];
        $t0=$t;
        $p=$z*20+5+30;
        $f=120;if ($z<=$gerarray["zeith"]) {$f=200;}
        $f0=100;if ($z<=$gerarray["zeith"]) {$f0=140;}
        if ($h0<0) {$t=50+7; $h0=$h0*-1; $t0=50+7;}
        if (isset($tempz[$z]["max"])) {
            if ($tempz[$z]["max"]>=80) {
                $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.$p.'px;background-color:rgb('.$f0.',0,0);border-style:solid;border-color:rgb('.$f0.',0,0);font-size:8px;width:15px;height:'.$h0.'px"></div>';
            }
            else {
                if (isset($tempz[$z]["max"])) {
                    if ($tempz[$z]["max"]>=70) {
                        $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.$p.'px;background-color:rgb('.($f0/1).','.($f0/2).',0);border-style:solid;border-color:rgb('.($f0/1).','.($f0/2).',0);font-size:8px;width:15px;height:'.$h0.'px"></div>';
                    }
                    else {
                        if ($tempz[$z]["max"]>=60) {
                            $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.$p.'px;background-color:rgb('.($f0/1).','.($f0/1).',0);border-style:solid;border-color:rgb('.($f0/1).','.($f0/1).',0);font-size:8px;width:15px;height:'.$h0.'px"></div>';
                        }
                        else {
                            if ($tempz[$z]["max"]>=50) {
                                $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.$p.'px;background-color:rgb(0,'.$f0.',0);border-style:solid;border-color:rgb(0,'.$f0.',0);font-size:8px;width:15px;height:'.$h0.'px"></div>';
                            }
                            else {
                                if ($tempz[$z]["max"]>=40) {
                                    $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.$p.'px;background-color:rgb(0,'.($f0/1).','.($f0/2).');border-style:solid;border-color:rgb(0,'.($f0/1).','.($f0/2).');font-size:8px;width:15px;height:'.$h0.'px"></div>';
                                }
                                else {
                                    if ($tempz[$z]["max"]>=30) {
                                        $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.$p.'px;background-color:rgb(0,'.($f0/1).','.($f0/1).');border-style:solid;border-color:rgb(0,'.($f0/1).','.($f0/1).');font-size:8px;width:15px;height:'.$h0.'px"></div>';
                                    }
                                    else {
                                        if ($tempz[$z]["max"]>=20) {
                                            $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.$p.'px;background-color:rgb(0,'.($f0/2).','.($f0/1).');border-style:solid;border-color:rgb(0,'.($f0/2).','.($f0/1).');font-size:8px;width:15px;height:'.$h0.'px"></div>';
                                        }
                                        else {
                                            $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t.'px;left:'.$p.'px;background-color:rgb(0,0,'.($f0/1).');border-style:solid;border-color:rgb(0,0,'.($f0/1).');font-size:8px;width:15px;height:'.$h0.'px"></div>';                                            
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
        
    # Rest
    
    for ($z=0;$z<=23;$z++) {
        if ($z<=$gerarray["zeith"]) {
            if ($tempz[$z]["min"]<$tempz[24]["min"] or !isset($tempz[24]["min"])) {
                if (isset($tempz[$z]["min"])) {
                    $tempz[24]["min"]=$tempz[$z]["min"];
                    $tempz[24]["minh"]=$z;
                }
            }
            if ($tempz[$z]["max"]>$tempz[24]["max"] or !isset($tempz[24]["max"])) {
                if (isset($tempz[$z]["max"])) {
                    $tempz[24]["max"]=$tempz[$z]["max"];
                    $tempz[24]["maxh"]=$z;
                }
            }
        }
        $h=$tempz[$z]["max"]-$tempz[$z]["min"];
        $h0=$tempz[$z]["max"];
        $t=100+1-$tempz[$z]["max"];
        $t0=$t;
        $p=$z*20+5+30;
        $f=120;if ($z<=$gerarray["zeith"]) {$f=200;}
        $f0=100;if ($z<=$gerarray["zeith"]) {$f0=140;}
        if ($h0<0) {$t=50+7; $h0=$h0*-1; $t0=$tempz[$z]["max"]*-1+50+7;}
        
        # Zeitskala
        
        $info.='<div id="tab" style="position:absolute;border:1px;top:'.(103).'px;left:'.$p.'px;font-size:7px;width:15px;text-align:center">'.$z.'h</div>';
        
        # Werte
        
        if (isset($tempz[$z]["max"])) {
            $info.='<div id="tab" style="position:absolute;border:1px;top:'.$t0.'px;left:'.$p.'px;background-color:rgb(0,'.$f.','.$f.');border-style:solid;border-color:rgb(0,'.$f.','.$f.');font-size:8px;width:15px;height:'.$h.'px"></div>';
            if ($tempz[$z]["max"]>80) {
                $info.='<div id="tab" style="position:absolute;border:1px;top:'.(83).'px;left:'.$p.'px;width:15px;text-align:center;font-size:8px;text-shadow:0px 0px 1px black,0px 0px 1px black,0px 0px 1px black;">'.number_format(sprintf('%.1f',$tempz[$z]["max"]),1,",",".").'</div>';
                $info.='<div id="tab" style="position:absolute;border:1px;top:'.(92).'px;left:'.$p.'px;width:15px;text-align:center;font-size:8px;text-shadow:0px 0px 1px black,0px 0px 1px black,0px 0px 1px black;">'.number_format(sprintf('%.1f',$tempz[$z]["min"]),1,",",".").'</div>';
            }
            else {
                $info.='<div id="tab" style="position:absolute;border:1px;top:'.(3).'px;left:'.$p.'px;width:15px;text-align:center;font-size:8px;text-shadow:0px 0px 1px black,0px 0px 1px black,0px 0px 1px black;">'.number_format(sprintf('%.1f',$tempz[$z]["max"]),1,",",".").'</div>';
                $info.='<div id="tab" style="position:absolute;border:1px;top:'.(12).'px;left:'.$p.'px;width:15px;text-align:center;font-size:8px;text-shadow:0px 0px 1px black,0px 0px 1px black,0px 0px 1px black;">'.number_format(sprintf('%.1f',$tempz[$z]["min"]),1,",",".").'</div>';
            }
        }
    }

    $zh=$gerarray["zeith"];
    $zvh=$zh-1;
    if ($zvh<0) {$zvh=23;}
    $pfeil="&rArr;";
    $w=($tempz[$zh]["max"]+$tempz[$zh]["min"])/2;
    $wv=($tempz[$zvh]["max"]+$tempz[$zvh]["min"])/2;
    if ($wv>$w) {$pfeil='&dArr;';}
    if ($wv<$w) {$pfeil='&uArr;';}
    $info.='<div id="text" style="position:absolute;border:1px;top:0px;left:520px;text-align:left;width:90px;font-size:30px;">'.$pfeil.'</div>';
    $info.='<div id="text" style="position:absolute;border:1px;top:0px;left:520px;text-align:right;width:90px;font-size:12px;">Wasser-<br />Temp.</div>';
    $info.='<div id="text" style="position:absolute;border:1px;top:35px;left:520px;text-align:right;width:90px;font-size:20px;">'.number_format(sprintf('%.1f',$tempz[24]["max"]),1,",",".").'°C</div>';
    $info.='<div id="text" style="position:absolute;border:1px;top:55px;left:520px;text-align:right;width:90px;font-size:12px;">('.$tempz[24]["maxh"].'h) max.</div>';
    $info.='<div id="text" style="position:absolute;border:1px;top:70px;left:520px;text-align:right;width:90px;font-size:20px;">'.number_format(sprintf('%.1f',$tempz[24]["min"]),1,",",".").'°C</div>';
    $info.='<div id="text" style="position:absolute;border:1px;top:90px;left:520px;text-align:right;width:90px;font-size:12px;">('.$tempz[24]["minh"].'h) min.</div>';
    echo 'IB#<div style="position:absolute;left:85px;top:0px;">'.$info.'</div>#'.$ver;
    
?>
 
Ich hatte es gestern Nacht noch eingebaut, dort wurde die Stunde 0 angezeigt. Es muss noch ein kleiner Fehler drin sein, jetzt wird die Stunde 9 angezeigt, also wird immer nur die aktuelle Stunde angezeigt.
Unbenannt.PNG
 
Mein Lieblingsflüchtigkeitsfehler. Vergessen das Array tempz vorher zu laden...
psgTempDS18B20_s1.php
PHP:
<?php


    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch        Warmwasser                    PSG-Script   |
        |                                                                     |
        +---------------------------------------------------------------------+
    */


    include __DIR__."/../include/psg.php";
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));

    if ($gerarray["Counter"]>=4) {
        $ver="V#V 1.00#";
        $dummy=sleep(2);
        $befehl='sudo cat /sys/bus/w1/devices/28-041661e0aeff/w1_slave | grep -E -o ".{0,0}t=.{0,5}" | cut -c 3-';
        $url=$helperurlpi2."?befehl=".encodiere($befehl,33455);
        $erg=web($url,$post);
        $erg=($erg+2000)/100;   #Korretur + 2 Grad
        if ($erg=="") {
            $echo=$ver."C##";
        }
        else {
            $erg=explode(" ",$erg);
            $temp4=$erg[0]/10;
            $feucht4=$erg[1]/10;
            $tempz=unserialize($gerarray["tempz"]);
            $zeitl=$gerarray["zeitl"];
            $zeith=date("G")*1;
            if ($zeith!=$zeitl) {
                $tempz[$zeith]=array();
                $zeitl=$zeith;
            }
            $temp=$temp4;
            if ($zeitl>23) {$zeitl=0;}
            if ($temp<$tempz[$zeith]["min"] or !isset($tempz[$zeith]["min"])) {
                $tempz[$zeith]["min"]=$temp;
            }
            if ($temp>$tempz[$zeith]["max"] or !isset($tempz[$zeith]["max"])) {
                $tempz[$zeith]["max"]=$temp;
            }
            $echo='';
            $echo.='P#';
            $echo.='<div style="font-size:16px;text-align:right;width:240px;position:absolute;top:-5px;">Luftfeuchte: '.str_replace(".",",",sprintf("%.1f",$feucht4)).' %%';
            $echo.='<br />Temperatur: '.str_replace(".",",",sprintf("%.1f",$temp4)).'°C</div>';
            $echo.='*HTML#';
            $echo.='V#'.$temp4.'*temp4#';
            $echo.='V#'.serialize($tempz).'*tempz#';
            $echo.='V#'.$zeith.'*zeith#';
            $echo.='V#'.$zeitl.'*zeitl#';
            $echo.=$ver;
        }
    }
    else {
        $echo=$ver."C##";
    }
    echo $echo;
    exit;
?>

- - - Aktualisiert - - -

Funktioniert es damit?
 
Zuletzt bearbeitet:
so habe es heute morgen auf die Schnelle eingebaut ... Danke, läuft bin mal gespannt wie sich das an einem ganze Tag einwickelt ..

Unbenannt.PNG
 
Okay, scheint zu funktionieren. :)
 
ja läuft ...
Ich weiß nicht ob ich das bei Dir gesehen habe und ob es anschließend eine brauchbare Anzeige wird?
enn man mehrere Graphen/Temperaturen in einem Chart anzeigt
Unbenannt.PNG
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.