nielda
Vytvořené odpovědi
-
AutorPříspěvky
-
Zbyšek Voda
ÚčastníkJsem rád, že se zadařilo 🙂
K tomu zápisu:
const char* json = “{\”TaskName\”:\”Voda\”,\”Temp-voda\”:21.81}”;
V C/C++ se řetězce zapisují třeba takto:
char *s = "Ahoj Karle!";
Kdybyste ale chtěl v rámci řetězce mít znak uvozovek, nemůžete to zapsat takto:
char *s = "Ahoj "Karle!"";
kompilátor by totiž měl při analýze problém a v kódy by se nevyznal.Musíte mu proto pomoct, a to právě napsáním zpětného lomítka před znak uvozovek. Tomuto se říká escapování a je díky němu možné zpasat znaky, které normálně zapsat nelze – třeba i znak s hodnotou 0 zapíšete \0. Dále jsou to třeba znak tabulátor -\t, nový řádek – \n a další – viz https://en.wikipedia.org/wiki/Escape_sequences_in_C.
bebeno28
ÚčastníkTak pani, podarilo sa . Huraaaa.
Tak nakoniec bol fakt problem s tou hlavickou.
Takto som to napisal a ide to
while (client.available()) { c[i] = client.read(); if (c[i] == '{') { pokracuj = 1; } if (pokracuj == 1) { i++; } } client.stop(); //stop client pokracuj = 0; c[i] = '\0'; i = 0; StaticJsonBuffer<1024> json_buf; JsonObject &root = json_buf.parseObject(c); if (!root.success()) { Serial.println("parseObject() failed"); } float Temp = root["Temp-voda"];
Dakujeeeem. Potom cely projek ked bude hotovy sen dam ako priklad.
Attachments:
bebeno28
ÚčastníkAhojte. Ale predsa sa este opytam. Cely den som nad tym rozmyslal a teraz mam troska casu tak skusam.
V prilohe je foto vystupu z terminalu.
Samozrejme moze byt ze mi hodi parse faild preto lebo je tam tam hlavicka aj ked si nemyslim pretoze priklad ktory som nasiel vcera , co som tu uz spomynal to mal tiez a v kode sa to neriesilo.Ked som pouzil ArduinoJson assistant tak tam mi vyhodilo ze ak ako priklad pouzijem tento rad zankov tak parsing prejde a aj tak bolo. Chybu nedalo.
const char* json = „{\“TaskName\“:\“Voda\“,\“Temp-voda\“:21.81}“;
Prosim Vas co znamenaju tie opacne lomitka ?
A ked to porovnate z vystupem co dostavam, co tam chyba alebo prevysuje ?
Inak v kode mam zapisane aj to aby pridalo na koniec znak 0 ale dako ho tam v tom vystupe nevidim. Alebo som to zle pochopil?
Dakujem
Attachments:
posjirka
Účastníkobecně to napsat nelze.
Posrím popiš co by opravdu mělo být funkcí celého zapojeni.Podel toho co píšeš tak budeš mít 2 talčítka.
– program bude blikat v nějákém intervalu třeba 1s/1s.
– po stisku tl 1 se změní na 1s/2s a pak bude už dál v tomto režimu dokud nepřepnu talčítko 2 nevrátím defaultní režim 1s/1aChápu to správně?
Jak dlouho chceš to tlačítko držet aby přeplo režim (pohrávám si s myšelnkou 1 symčky, která jde jednoduše pochopit, nebo pomocí přerušení kdy to není na první pohled hned pochopitelné).posjirka
Účastníkjá bych použil pro spínání NPN tranzistor:
http://www.electroschematics.com/wp-content/uploads/2013/07/arduino-control-relay-schematic.pngcip9sek
ÚčastníkAno, pro tento případ má jít o spínání relé s cívkou na 12V, nicméně tato aplikace se dá použít i pro jiné ovládání…
Relé modlu používám teď. Pokud používám napájení 12V, tak arduino utáhne maximálně 4 relé s cívkou na 5V. Potom musím používat externě silnější stabilizátor napětí. Těch modulů je víc, tak je chci sloučit do jednoho vlastního modulu.
Dreamer
ÚčastníkMá jít o ovládání relé s cívkou na 12V? Nebylo by lepší použít reléový modul přímo k Arduinu? Pokud ne jaké proudy u těch 12V a jakou frekvenci je třeba spínat?
Zbyšek Voda
ÚčastníkNení zač, kdyžtak se ozvěte 🙂
K té knihovně je dokumentace zde: https://bblanchon.github.io/ArduinoJson/doc/index.html
popřípadě kdybyste chtěl zabrousit i do kódu, tak mrkněte sem:
https://github.com/bblanchon/ArduinoJson/tree/master/src/ArduinoJson
ale to už je celkem zběsilé.bebeno28
ÚčastníkZbysku Dakujem.
Vcera som sa s tym zaoberal a prisiel som presne na to ako pisete.
Presne rovnakym sposobol nacitavam retazec. Takze to som uz pochopil.
Na nete som nasiel jeden projekt kde sa tiez nacitava json tak som si ten kod krok po kroku lustil a snazil sa prist na to co to robi.Teraz nie som pri pc kde mam ten kod ale je tam este jedna vec ktorej som neporozumen. Pripadne sa dodatocne opytam ak to nebude robit problem.
a co sa tika velkosti pola tak toho sa neobavam. ten vystup nema ani 20 znakov vratane hlavicky.
Skor ma zaujima ci samotny json string mze obsahovat entery . je ich tam pozehnane. Najlepsie by bolo vediet presne ako ta json kniznica pracuje len nie je k tomu popis.Ale sna sa mi to podari spojazdnit.
Teraz nebudem mat par dni moc casu ale ja sa potom ozvem a dam vediet ako som pokrocil.
Kazdopadne Dakujem za rady a pomoc.
Pomohlo
Zbyšek Voda
ÚčastníkJeště bych doplnil Vojtu.
Funkce client.read() vrátí jeden byte (tedy i znak), který přečte z dat, které klientovi přicházejí. Vy chcete dosáhnout toho, že budete tyto přečtené znaky postupně načítat a někam ukládat.
K tomu se hodí právě pole – to je vyhrazené místo v paměti, ve kterém je možné se pohybovat pomocí indexu, tedy čísla v hranatých závorkách.
Definici pole v kódu máte:
char c[1024];
říká – v paměti bude pole složené z datového typu char a bude mít 1024 položek.Když chcete nastavit hodnotu počátečního znaku pole, provedete to následovně:
c[0] = 30;
popřípadě
c[0] = 'A';
– tímto do pole uložíte znak A (ve skutečnosti jeho číselnou hodnotu v ASCII tabulcePozor, pole v jazyce C jsou indexované od 0, tedy první prvek pole má index 0, druhý 1 a v tomto případě poslední znak má index 1023.
Pomocí cyklu while tedy budete číst znaky přicházející klientu a ukládat je do pole c. Podmínka client.available() platí, dokud jsou nějaké znaky k přečtení. Po každém průchodu navýšíte počitadlo i o jedna, tedy v dalším průchodu budete zapisovat na následující pozici v poli. Dovolil jsem si rozšířit Vojtův návrh:
int i = 0; while (client.available()) { c[i] = client.read(); i++; } c[i] = '\0' Serial.println(c); i = 0;
Na konec načtených dat jsem ještě přidal znak nula. Tímto jsem z načteného pole znaků vytvořil řetězec, tedy text. Řetězce jsou způsob, jak se dá uložit v kódu text. V jazyku C/C++ jsou uložené jako pole znaků, která jsou ukončená znakem nula. Potom funkce jako Serial.println() ví, kdy přestat s vypisováním (vypisují znak po znaku, dokud nenarazí na 0). Je možné, že i ten JSON parser, který používáte vyžaduje na vstupu validní řetězec a ten musí být ukončený nulou.
Také by možná bylo dobré do cyklu přidat podmínku, aby došlo k načtení maximálně 1023 znaků – více by se nevešlo do pole (poslední znak je právě 0). Také by bylo rozumné zvětšit velikost pole.
Napadlo mě, že budete mít ještě asi problém s HTTP hlavičkou. Přijatá data totiž neobsahují pouze JSON, který chcete parsovat, ale také HTTP hlavičku. Ta vypadá třeba takto:
HTTP/1.x 200 OK Transfer-Encoding: chunked Date: Sat, 28 Nov 2009 04:36:25 GMT Server: LiteSpeed Connection: close
Po hlavičce následují dva znaky zalomení řádku a až poté obsah web stránky – ve vašem případě pravděpodobně právě JSON. S tím se taky budete muset vypořádat 🙂
Vojtěch Vosáhlo
ÚčastníkPokud 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]); }
bebeno28
ÚčastníkAha 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
Zbyšek Voda
ÚčastníkVy 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? 🙂
bebeno28
ÚčastníkTak 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
bebeno28
Účastníkjeee 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 😀 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.
Vojtěch Vosáhlo
ÚčastníkAsi 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>
bebeno28
ÚčastníkVojtech 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.
Vojtěch Vosáhlo
ÚčastníkNo jo, taky máme meteostanici na thingspeaku 🙂
Pro získání jsonu s poslední hodnotou stačí totohttps://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.
bebeno28
ÚčastníkVidim 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
bebeno28
ÚčastníkTo 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
Zbyšek Voda
ÚčastníkVojta 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.
bebeno28
Účastníkzdravim 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
Vojtěch Vosáhlo
ÚčastníkJen 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čí ?
Zbyšek Voda
ÚčastníkPodle 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? 🙂
Dreamer
ÚčastníkPodělíš se o zkušenosti? Board mám taky ale zkoumání jsem zatím odložil až bude víc času. Jde integrovat do Arduino IDE? Jaké ovladače použít?
Luke_CZ
ÚčastníkMám 🙂
L.
4.6.2017 v 21:43 odpověď na: ARDUINO Mega2560 – přepínání analogReference() za chodu programu #11669posjirka
Účastníkmoje poslední reakce na toto vlákno :
komu není rady tomu není pomoci.4.6.2017 v 13:03 odpověď na: ARDUINO Mega2560 – přepínání analogReference() za chodu programu #11667mpcz
ÚčastníkZdravím,
ty bláboly se nedají ani poslouchat. Ještě navíc historka o konektoru ze střední…
Někomu asi nestačí, že problém sběrnice je vyřešen již léta a a chodí to bez „únavy“ a bez problému s napěťovou úrovní, který ostatně ani neexistuje. Pokud to léta chodí bez „odpálení“ a navíc je to podepřeno i teoretickou úvahou, je to pro mě dostatěčně jasné.
Pokud to někomu ještě nestačí, připojuji záznam z paměťového osciloskopu.
Vidí někdo někde datový provoz nad 3,3V? A pokud ho vidí pouze teoreticky, aby nějak tu svou teorii obhájil, ať ji trošku rozvede do podrobností, kde se tam těch 5V nabere.
Ale pěkně prosím, žádné historky o konektorech ze střední anebo o „unavení něčeho“.
Ostatně, zajímalo by mě, jestli autor těch tvrzení někdy na stole DUE/LCD2004 měl nebo jen sbírá na fórech a v datasch. rozumy a dále je bezmyšlenkovitě tranzituje.
Děkuji, mpcz, 04.06.2017
p.s. ocením, pokud na tento problém někdo jiný v budoucnu narazí a poděli se o zkušenosti a hlavně výsledekAttachments:
3.6.2017 v 22:34 odpověď na: ARDUINO Mega2560 – přepínání analogReference() za chodu programu #11666posjirka
Účastníkjen taková vsuvka: když jsem chodil ještě na střední tak mi připadali všeci ti HIFI šílenci jako magoři. Co si to dovolujou tvrdit, že zlacené konektory za 200kč hrajou líp než ty nikovaný za 10 kč. Vždyť to nemá na funkci zesilovače žádný vliv. Časem jsem pochopil, že nešlo o to co je teď, ale jak to bude fungovat za 5 let. Myslím, že tě čeká podobné prozření jako u mě před 20 lety … nikdo není neomylný, ale měl by dřív naslouchat než se hádat.
3.6.2017 v 22:28 odpověď na: ARDUINO Mega2560 – přepínání analogReference() za chodu programu #11665posjirka
Účastníkto mpcz: chlape, útočíš na mě sice hezky, ale možná by nebylo špatné zamyslet se sám na desbou. Obávám se, že nesmysly tu zavádíš pouze ty. Vcelku jasně ukazuješ, že nedokážeš správně technicky myslet a všechny parametry ženeš za datasheetem povolenou mez. Pokud si myslíš, že se svět ohne podle tebe … .
Já jsem ti slušně napsal řešení:
1, externí ADC převodník s nižší referencí
2, smířit se s nižším rozlišení LBA
Cokoliv jiného dříve nebo později bude znamenat zničení AT Megy. Správné řešení předučuje i dlouhou a spolehlivou funkci zařízení bez hledání duchů. Takové přímočaré řešení co navrhuješ ty bude fungovat na třeba 3 Arduin z 10 a i ty 3 časem odejdou, nebo se budou chovat podivně.
Dělej jak uznáš za vhodné, jen k tomu PROSÍM NESTRHUJ I OSTATNÍ, co nemají takovou hloubku znalostí a snaží se něco se naučit a porozumět tomu. -
AutorPříspěvky