DS18B20 měření záporných hodnot

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#16 Příspěvek od FHonza »

Máš to nějaké celé zmatené. Nerozumím tomu, proč předáváš přes GET parametr s názvem "username" s hodnotou tvořenou velikostí napájecího napětí a sílou WiFi signálu.
To url bude vypadat nějak takhle:

Kód: Vybrat vše

neco.php?username=3032-67
Rozhodně nevidím žádnou souvislost se změřenou teplotou.

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#17 Příspěvek od markoni »

Proměnná temp která je získána výše v kódu díky
Přílohy
teplota.jpg

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#18 Příspěvek od FHonza »

OK. Ale stejně pořád script PHP dostane v $_GET["username"] hodnotu, jejíž význam mně uniká. V jedné proměnné máš string, který je složen z velikosti teploty, napájecího napětí a síly WiFi signálu. Bez žádného dalšího oddělovače. Nerozumím tomu, jak to chceš v PHP scriptu dekódovat. Proč každou hodnotu nepředáváš v samostatné proměnné ?

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#19 Příspěvek od markoni »

Protože jsem to okopíroval tu část kódu který je nad červeným rámečkem a php skript co mám na webovce je takový to
  • <?php
    $username = $_GET['username']; //make sure you filter these values, before showing them
    echo $username; //$username == "john"

    $sez = $username;
    preg_match('/(\d+\.\d{2})(\d+\.\d{2})(-\d+)/', $sez, $matches);
    $tep=$matches[1];
    $volt=$matches[2];
    $db=$matches[3];
    //if (strlen($tep)< 5) {$tep="0".$tep;}
    /*$tep=substr($sez,0,6);
    //if (strlen($tep)== 5) {$tep="0".$tep;}
    $volt=substr($sez,7,4);
    $db=substr($sez,10,3); */
    $dev=$tep."C, ".$volt."Volt, ".$db."dB ";
    $datum = date("H:i:s d/m/y");
    //if (time() - filemtime("./IP/zap.txt") > 1200){
    $relace = fopen("./IP/zap.txt", "a+"); // Otevřeme soubor
    fwrite($relace,$dev );
    //fwrite($relace," C ");
    fwrite($relace,$datum);
    fwrite($relace,"\r\n"); // Zapíšeme text do souboru
    fclose($relace);
    //*****************************************
    /*$relac = fopen("./IP/pomocna.txt", "a+");
    fwrite($relac , $sez);
    //fwrite($relac,$datum);
    fwrite($relac,"\r\n");
    fclose($relac);
    //}
    */
    ?>

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#20 Příspěvek od FHonza »

Proč to dělat jednoduše, když to jde udělat hodně složitě. Ten regulární výraz fakt louskat nebudu. Pošli to do skriptu PHP jako tři parametry. To se dělá takhle:

příklad url:

Kód: Vybrat vše

server/moje.php?parametr1=nazdar&parametr2=bazar&parametr3=lazar
V php pak:

Kód: Vybrat vše

...
par1 = $_GET["parametr1"];
par2 = $_GET["parametr2"];
par3 = $_GET["parametr3"];
...

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#21 Příspěvek od markoni »

Mě se jedná o jak to napsat do ESP8266
server/moje.php?parametr1=nazdar&parametr2=bazar&parametr3=lazar to nevím, jinak na seriáku mě to
dává /somepage.php?username=-127.003.38-47
což je v pořádku (nemám tam připojené teplotní čidlo ) ale ve výpisu mě ten znak mínus chybí 127.00C, 3.38Volt, -47dB 14:12:14 14/01/21 a když upravím dtostrf(temp, 4,2, charVal); dám tam místo 4 tak 8 tak se ten php skript neprovede :oops: díky

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#22 Příspěvek od FHonza »

No jasně že ze na sériový port to jde včetně znaku '-'. Mínus ti vyhodí až php funkce preg_match. V tom vzoru regulárního výrazu nemáš mínus jako povolený znak. Nejmíň práce je ten vzor opravit. Vzor patří mezi ty jednodušší. Tady je popis. Ale s přidáním dalšího parametru nebo změnou formátování na vstupu ho budeš muset opravovat znovu.

dtostrf(temp, 4,2, charVal); to se stačí podívat do nějaké dokumentace, co ten druhý parametr znamená. Ten skript se "neprovede", protože v proměnné $matches bude prázdný seznam. Nenajde se žádná shoda se vzorem (protože jsi přidal další znaky do proměnné charVal). A to tam nemáš ošetřené, předpokládáš že má vždy alespoň tři pole.

Fakt neumíš spojovat řetězce do jednoho ? Vždyť to v té ukázce máš. Stačí tam dopsat něco takového:

Kód: Vybrat vše

String username = "teplota=" + charVal;
username += "&vcc=" + String(getVcc);
username += "&rssi=" + String(WiFi.RSSI());

String url = "neco.php?" + username;
Promiň, ale přijde mi že absolutně netušíš o čem to je.

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#23 Příspěvek od markoni »

Po částečné úpravě v projektu je takový stav, co se týká
preg_match('/(\d+\.\d{2})(\d+\.\d{2})(-\d+)/', $sez, $matches);
je tam zahrnuto i "-" ? díky
Přílohy
chyba v projektu.jpg

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#24 Příspěvek od FHonza »

Není, neboť ten regulární výraz máš stále úplně stejný. Na testování použij třeba následující skript, který budeš spouštět na svém lokálním serveru:

Kód: Vybrat vše

<?php
$s='-127.003.38-47';
$r='/(\d+\.\d{2})(\d+\.\d{2})(-\d+)/';
preg_match($r, $s, $vysledek);
var_dump($s);
var_dump($r);
var_dump($vysledek);
?>

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#25 Příspěvek od markoni »

Já jsem zkoušel ten druhý způsob a to přiřadit v do volání php skriptu parametry

Kód: Vybrat vše

                 String username = "temp=" + String(temp);
                 
                 username += "&vcc=" + String(getVcc); 
                 username += "&rssi=" + String(WiFi.RSSI()); 
               
                 Serial.println(username);
                 
                 Serial.println(getVcc);
                 String urli = "/somepage.php?username=" + username;
                 //**
                 Serial.println(urli);
na sériáku mi to dá
/somepage.php?username=temp=-127.00&vcc=3.39&rssi=-44

ale na serveru v surových datech jen je
temp=-127.00
Já na tom trávím už hodně dlouho a zapomínám dělat práci kolem domu odhazovat sníh a tak dále :D díky
edit

Kód: Vybrat vše

String username =  String(temp);
                 String Volt = String(getVcc);
                 String DB = String(WiFi.RSSI()); 
                
                 username = username+Volt+DB;
                 Serial.println(username);
                 
                 Serial.println(getVcc);
                 String urli = "/somepage.php?username=" + username;
tak mě to funguje ale snahu to nějak rozdělit dát tam nějaké markanty tak okamžitě to přestane vykonávat php skript na serveru :oops:

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#26 Příspěvek od FHonza »

máš tam navíc username=

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#27 Příspěvek od markoni »

FHonza píše:máš tam navíc username=
username = username+Volt+DB; to tam musím mít jinak to bere jen první parametr poraď jak do toho řetězce přidat pojmenování parametrů ? já když tam přidám username = username+"C"+Volt+"V"+DB+ "dB";tak se na seriáku vypíše celá řetězec ale neprovede se php sript na serveru :oops: díky

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#28 Příspěvek od FHonza »

Vždyť ti to píšu. Máš v url navíc /somepage.php?username=temp=-127.00&vcc=3.39&rssi=-44

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#29 Příspěvek od markoni »

Nedaří se :pc:
Přílohy
pokračovaní problému.jpg

Uživatelský avatar
markoni
Příspěvky: 2310
Registrován: 30 říj 2006, 01:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#30 Příspěvek od markoni »

Už se za dařilo

Kód: Vybrat vše

                   String username =  String(temp);
                
                  username += "%=Temp,"+ String(getVcc);
                 
                 username += "%=Volt," + String(WiFi.RSSI()); 
                 username +=  "%=dB";
                 
                 Serial.println(username);
                 
                 Serial.println(getVcc);
                 String urli = "/somepage.php?username=" + username;
                 //**
                 Serial.println(urli);
v prohlížeči je
23.31%=Temp,3.46%=Volt,-51%=dB
díky

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“