Close

Arduino Json a analyza stringu

Úvodní stránka Fórum Vaše projekty Arduino Arduino Json a analyza stringu

  • Toto téma obsahuje celkem 21 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel Profilový obrázekbebeno28 a poslední změna proběhla před 3 roky a 4 měsíci.
Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 22)
  • Autor
    Příspěvky
  • #11680
    Profilový obrázekbebeno28
    Účastník

    Ahojte. rád by som Vás poprosil o radu.
    nažím sa už zopár dní dekódovat json string pomocou Arduina kniznice ale nedarí sa mi.
    Stále výsledná honota ktoá by mala byt aktuálna teplota je stále 0.
    Napadá Vás niekoho kde robím chybu?
    Prípadne iný nápad ako to dekódovať?
    ja som v tejto problematike začiatočník takže ak aj nápady tak také pre nováčika :-)
    Prikladám môj kód a aj json string .

    Dakujem vopred

    #11685
    Zbyšek VodaZbyšek Voda
    Správce

    Podle JSON je položka „Sensors“ pole, takže vám chybí ještě jedna indexace.
    root["Sensors"][0]["Temp-voda"]

    Ještě je otázkou, jestli bude pořadí senzorů v poli vždy takovéto, nebo se bude měnit. V tom případě byste musel nějakým způsobem projít celé pole a najít tu položku, která má atribut „Temp-voda“.

    Napadá mě jedno zlepšení – nemůžete změnit tvar toho JSON objektu? Takto je to trochu krkolomné. Mohl by vypadat třeba takto a práce s ním by byla jednodušší:

    {
    ...
    Sensors: {
        Temp-voda: 25,
        WiFi: -60,
        ...
    }
    }

    Potom už by přečtení položky Temp-voda vypadalo tak, jak to máte v kódu.

    Pokud by přidání indexu nepomohlo, máte ještě možnost projít JSON jen jako text, najít výskyt řetězce – například „Temp-voda“ a potom víte, že za dva znaky začíná hodnota.

    Také by možná byla možnost se JSONu úplně vyhnout. Pokud víte, kolik celkem bude senzorů a nepotřebujete jejich počet nějak dynamicky měnit, mohl byste postupovat tak, že si určíte přesné pořadí, v jakém budete hodnoty odesílat a oddělíte je třeba středníkem. Jakmile odešlete všechny hodnoty, tak je zakončíte znakem nového řádku.

    Tedy jedna sada měření může vypadat třeba následovně:

    25;-60;1.80
    

    a vy budete vědět (předem si určíte), že první hodnota odpovídá teplotě vody, druhá wifi, třetí spiral. Také budete vědět, že první dvě hodnoty jsou typu int, takže he vyčtete funkcí parseInt, třetí float, použijete tedy funkci parseFloat.

    Pravděpodobně vám ale JSON chodí někde z webu, takže si tvar vybírat.

    Jaký projekt stavíte? :)

    #11687
    Profilový obrázekVojtěch Vosáhlo
    Účastník

    Jen malinký dodatek z mojí zkušenosti. Většinou když dostávám něco z webu třetích stran vytvářím si webového „prostředníka.“ Nějaký malý skript v php nebo čemkoliv jiném který si vyžádá potřebná data a převede je na to co chci já. Rozhodně je to jednoduší než se snažit dělat podobná kouzla přes arduino. Samo sebou si neplatím hosting na každý projekt, stránka na webzdarma.cz bohatě postačí ?

    #11688
    Profilový obrázekbebeno28
    Účastník

    zdravim pani. dakujem za rekcie.
    Stavuam si len zobrazovaciu jednotku pre meteostanicu a ohrev vody. Bude to cisto esp8266a k tomu pripojenu tft 1.8 lcd display.
    Toto zariadenie by si malo podla toho co budem chcet zobrazovat pytat namerane hodnoty jak z meteostanice ktora je postavena na esp8266 s firmwerom espeasy a bme280 cidlom tak z ohrevu vody kde bude tiez esp easy .

    da sa este zjednodusit ten json a to tak ze sa budem dopytovat vzdy na kazdu polozku zvlast. myslim to tak ze pri ohreve vody si najskorej zistim teplotu a potom ci je spirala zapnuta a nasledne wifi signal. len toto riesenie mi pride zbytocne zlozite.

    takto by to vyzeralo z meteostanice.
    `{
    „TaskName“: „BME280“,
    „BME-temp“: 19.91,
    „BME-hum“: 34.24,
    „BME-press“: 1017.71
    }

    a z ohrevu by bola tiez kazda hodnota samostatna .

    ja neviem niako upravit ten tvar json stringu.

    ako by ste to robili vy?

    dakujem

    #11689
    Zbyšek VodaZbyšek Voda
    Správce

    Vojta má s tím prostředníkem dobrý postřeh. PHP se tu celkem nabízí.

    Mohlo by to fungovat třeba tak, že po připojení ESP ke stránce s PHP skriptem by se tento skript dotázal meteostanice a dostal by JSON s informacemi. Tento JSON by se vhodně přetransformoval (na čtení jsonu je v PHP myslím přímo utilita) a do ESP už by se odeslala data v daleko jednodušší podobě – například „25;-60;1.8“.

    Výhodou tohoto řešení je ulehčení zátěže procesoru. Na druhou stranu, pokud jste s PHP nikdy nedělal, asi bych se touto cestou nevydával. Můžou se totiž objevit další problémy.

    Na druhou stranu, když říkáte, že programujete ESP a navíc v této poměrně jednoduché aplikaci – asi by mi nevadilo použití té JSON knihovny, kterou využíváte. U Arduina bych váhal, ale ESP má o poznání více výkonu :)

    Měl jsem na mysli, že by JSON vypadal třeba následovně:

    {
      "System": {
        "Build": 145,
        "Unit": 2,
        "Uptime": 139,
        "Free Ram": 26472
      },
      "Sensors": {
        "Temp-voda": 50,
        "WiFi": -60,
        "spiral": 1.00
      }
    }

    Potom by získání jedné hodnoty ze senzoru bylo jednodušší, protože by odpadlo indexování v rámci pole.

    #11690
    Profilový obrázekbebeno28
    Účastník

    To php by som uplne vylucil. Sice mam webstranku pisanu na wordpress platforme ale to je len pisanie a nie programovanie takze co sa tika php to som uplne minoa druha vec je ta ze vsetky 3 esp moduly budu len v domacej sieti. Jsno kniznica bola predsa vytvorena na take veci ako ja potrebujem tak hy som to nerad komplikoval. Pripadne este by som volil variantu ze si sam vycitam ten retazek kde zacina hodnota ktoru potrebujem ale co sa tika c kodu zatial som novacik. Ja programujem v assemblery a toto je pre mna uplne nieco nove. Hlavne mi chyba pri vela knicniciach prsny zoznam prikazov s popisom co ktory prikaz robi a ako sa vyuziva. Nie vzdy je to popisane.

    posuvam sa pomaly dopredu len toto rozlozenie stringu by mi robilo zatial prblem.

    Ok takze aka je vysledna rada? ako by ste napisali ten kod pomocou json kniznice aby som ziskal data napriklad z toho vystupu meteostanice a bme cida.

    Vedel by niekto napisat celu cast toho json parse kodu?

    dakujem

    #11691
    Profilový obrázekbebeno28
    Účastník

    Vidim ze sa vyznate v pho kode tak sa este na inu vec ak mozem.

    Tie data z meteostanice odchadzaju na thingspeak server a potom grafy zobrazujem na mojej webstranke.

    Rad by som tam mal este zobrazene posledne namerane hodnoty bud formou cisla alebo pomocou google gauge ukazovatela.

    len toto je uz na mna moc. php ani java script ani html neovladam.

    Je to zlozite pridat to do ten mojej stranky?

    Dakujem

    #11692
    Profilový obrázekVojtěch Vosáhlo
    Účastník

    No jo, taky máme meteostanici na thingspeaku :)
    Pro získání jsonu s poslední hodnotou stačí toto https://api.thingspeak.com/channels/216038/fields/1/last.json?timezone=Europe%2FPrague

    Když to obalíme jednoduchým php dostanete takovýto kódík který vypíše poslední hodnoty.

    
    <?php
    
    $thingspeakAPItemp = file_get_contents('https://api.thingspeak.com/channels/216038/fields/1/last');
    
    $thingspeakAPIpress = file_get_contents('https://api.thingspeak.com/channels/216038/fields/3/last');
    
    $thingspeakAPIhumi = file_get_contents('https://api.thingspeak.com/channels/216038/fields/2/last');
    
    $tempLast = round($thingspeakAPItemp, 2) . "°C  "; 
    $pressLast = round($thingspeakAPIpress, 2) . "hPa  ";
    $humiLast = round($thingspeakAPIhumi, 2) . "%";
    
    ?>
    
    <!DOCTYPE html>
    <html>
    <body>
    <h1><?php echo $tempLast ?></h1>
    <h1><?php echo $pressLast ?></h1>
    <h1><?php echo $humiLast ?></h1>
    
    </body>
    </html>
    

    Pokud chcete vidět ukázku uploadnul jsem jí sem.

    #11693
    Profilový obrázekbebeno28
    Účastník

    Vojtech dakujem ti moc len ako to inplementovat do wordpressu. Este musim na to prist. Na to bude treba daky plugin. jeden som teraz skusal ale nefunguje mi to.

    Mas dake skusenosti s wordpressom ?

    Dakujem za cenne rady a pomoc.

    #11694
    Profilový obrázekVojtěch Vosáhlo
    Účastník

    Asi tento plugin, stáhněte si ho a nainstalujte.

    Poté kamkoliv na svou stránku vložte toto:

    
    [insert_php]
    $thingspeakAPItemp = file_get_contents('https://api.thingspeak.com/channels/216038/fields/1/last');
    
    $thingspeakAPIpress = file_get_contents('https://api.thingspeak.com/channels/216038/fields/3/last');
    
    $thingspeakAPIhumi = file_get_contents('https://api.thingspeak.com/channels/216038/fields/2/last');
    
    $tempLast = round($thingspeakAPItemp, 2) . " °C  "; 
    $pressLast = round($thingspeakAPIpress, 2) . " hPa  ";
    $humiLast = round($thingspeakAPIhumi, 2) . "%";
    
    [/insert_php]
    
    <h1>[insert_php] echo $tempLast; [/insert_php]</h1>
    <h1>[insert_php] echo $pressLast; [/insert_php]</h1>
    <h1>[insert_php] echo $humiLast; [/insert_php]</h1>
    
    
    #11695
    Profilový obrázekbebeno28
    Účastník

    jeee ide to. A ja som aj skusal tento plugin pred chvilkou ale daco som mal asi zle pretoze to nefungovalo.

    Dakujem, fakt ste mi spravil radost :-D Ešte to musim upravit vizuálne aby to bolo pekné .

    A idem skusit potom ten Jsom este raz.

    Snad s tym zapisom co mi chybal to pojde.

    Dam vediet.

    #11696
    Profilový obrázekbebeno28
    Účastník

    Tak páni ja budem mat problém asi niekde inde.
    Do kodu pre ESP8266 a parse json string som pridal este kontrolu ci analyzovalo string a stále dostávam faild.

    delay(500);
      char c[1024];
      // Read all the lines of the reply from server and print them to Serial
      while (client.available()) {
        c[0] = client.read();
    
        //Serial.print(c);
    
        Serial.print(c);
      }
      DynamicJsonBuffer jsonBuffer(4000);
      JsonObject& root = jsonBuffer.parseObject(c);
    
      if (!root.success()) {      //Check for errors in parsing
     
        Serial.println("Parsing failed");
        delay(5000);
        return;
     
      }
    

    Prečo mi to robí?

    riečim variantu stringu tútok
    `{
    „TaskName“: „Voda“,
    „Temp-voda“: 20.50
    }

    Dakujem

    #11698
    Zbyšek VodaZbyšek Voda
    Správce

    Vy přečtete znak pomocí client.read() a uložíte ho na nultý index pole c. Takto ale zapisujete všechny přečtené znaky na index 0. Nechcete spíše ten index posouvat? :)

    #11702
    Profilový obrázekbebeno28
    Účastník

    Aha no to som si nevsimol.

    Prosim Vás co si mám nastudovať aby som pochopil ako nacítať tú hodnotu a ako to správne zapísať a následne opať vycítať pre analyzovanie.

    Ja som v C zaciatočník.

    Dakujem

    #11710
    Profilový obrázekVojtěch Vosáhlo
    Účastník

    Pokud chcete samostudium tak stačí vědět co vlastně dělá client.read() a pak mít základní povědomí o smyčkách for a while.

    Ve vašem případě by stačilo přidat do smyčky proměnnou ke které se při každém cyklu přičte 1. O tolik se pak posuneme v poli.

    Zápis dat do pole by tedy vypadal asi takto:

    int i = 0;
    
     while (client.available()) {
        c[i] = client.read();
        i++;
      }
    
    i = 0;
    

    pokud byste pak chtěl data vyčítat a třeba vypisovat, použil byste smyčku for asi takto:

    for(int j = 0; i < sizeof(c); i++){
    
        Serial.print(c[i]);
    
    }
    
Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 22)
  • Pro reakci na toto téma se musíte přihlásit.