Pomoc s voľbou ukladania nameraných údajov

Odpovědět
romanm
Příspěvky: 45
Registrován: 11 pro 2018, 23:17

Pomoc s voľbou ukladania nameraných údajov

Příspěvek od romanm » 20 pro 2018, 19:59

Jedno arduina uno používam na snímanie teplôt a druhé na snímanie impulzov z elektromerov. Zatiaľ teploty ukladám na domáci NAS server do mySQL každých 5 minút, podobne impulzy z elektromerov taktiež ukladám na NAS. Okamžité hodnoty budem vyčítavať priamo z arduina a zobrazovať ich na domácej "Home automation" web stránke. Nepáči sa mi však to, že NAS musí týmto pádom bežať celých 24h. Rozmýšľam nad riešením, že by som namerané údaje ukladal na SD kartu do txt súboru. Tento súbor by som povedzme 2x za deň "vyparsoval" do mySQL. Je tu však viacero otázok. Obávam sa o životnosť SD karty, vzhľadom na obmedzený počet zápisov. A druhý problém, že údaje by som vedel na stránke zobraziť až s 12h oneskorením. Možno toto by šlo vyriešiť tým, že by som chýbajúce údaje vyčítal cez web priamo z SD karty. Ako by sa to však správalo, keďže arduino pre elektromery musí obsluhovať viacero prerušení a takisto by som musel vyriešiť paralelný beh servera a clienta? Paralelný beh budem musieť vyriešiť aj v prípade, keď zostanem pri zápise údajov na NAS. Zápis na NAS riešim cez clienta a čítanie okamžitých údajov budem riešiť cez web server. Momentálne testujem parsovanie dát z web stránky arduina.
Myslíte, že je táto idea úplne blbosť a ísť radšej iným smerom? Máte nejaké iné nápady?

Uživatelský avatar
gilhad
Příspěvky: 826
Registrován: 07 bře 2018, 11:22

Re: Pomoc s voľbou ukladania nameraných údajov

Příspěvek od gilhad » 21 pro 2018, 00:24

Otazkou je, kolik namerenych dat vlastne mas. Zvlast pokud je budes drzet ulozene v binarni podobe, nikoli jako retezce, natoz cele stranky a konvertovat je az pri vypisu. Pak by se dalo udrzet v RAM docela dlouhou historii.

Co se zapisu na SD tyce - pouzivam je v Rapsberry, (ale to je celkem jedno), bezi mi tam databaze, zapisuji se logy, provoz 24/7 a bezi tak uz nekolik let. Zvlast pokud si je vyhradis jako "externi pamet" pro ukladani tech namerenych dat, tak s trochou pece by mely vydrzet takrka neomezene dlouho (tedy, ze neodejdou kvuli zapisum, ale kvuli necemu jinemu, nebo to cele zastara). Vyjdeme-li z predpokladu, ze zapis na SD ji nici vyrazne vic nez cteni z ni a ze vlastne ji mame pro potrebu toho Arduina a ze to Arduino zvladneme udrzet v provozu "furt", nebo mu pred vypnutim dat vedet, ze ma data ulozit, nebo nam nevadi ztrata tosledniho sektoru, tak bych postupoval nasledne:
- na Arduinu bych ukladal data v RAM, dokud by jich nebylo za cely sektor (256B tusim), nebo jejich nasobek (idealne mocninu dvou), pak bych to zapsal cele naraz (a vyhnul se tim prepisovani sektoru)
- nepouzival bych filesystem, ale bral to jako ploche uloziste, tedy zacal ukladat data od sektoru nula, linearne, pri "preteceni" karty zase dokola. Nez se takto cela karta jednou zapise, tak to bude trvat docela dlouho.
- pro detekci, kde jsem skoncil, bych v datech mel "magickou hlavicku" a poradove cislo, napr. prvni 4 byty bloku (sektor, nebo ten zvoleny nasobek) by byly "DATA" a pak by nasledovalo 4bytove (nebo 8bytove, pokud bych to chtel mit na vecnost) poradove binarni cislo bloku, nacez by nasledovaly ty hodnoty.
- pokud jsou hodnoty mereny pravidelne, tak bych do bloku jen ulozil pocatecni cas, dal uz se to dopocte z periody mereni
- pokud zapisu na posledni blok SD, budu pokracovat zase tim nultym
- v RAM si budu drzet, na kolikaty blok ted budu psat, takze pocet uz zapsanych bloku se zjisti jen jednou pri startu (zacne se cist SD od zacatku, pokud blok nezacina DATAxxxx, tak je to prvni volny blok, pokud to xxxx je mensi, nez predchozi, tak je to taky prvni blok, kam budu psat a prepisuju "ocas" - klasicka fronta FIFO)

(jojo, vhodnou optimalizaci se da hodne usetrit. Obdobny wear-leveling se taky da pouzivat pro zapis do EEPROM, ktera taky vydrzi jen omezeny pocet zapisu a neomezeny pocet cteni)

Aktualni hodnoty z Arduina vypises celkem snadno, pokud budes mit v RAM misto na jeden sektor navic, tak jsi schopny vypsat i celou znamou historii na pozadani, pripadne i jako webovou stranku (a nebo - samozrejme - jen libovolnou cast historie - kterou ti NAS zrovna neposkotne, protoze nebezi), jen to zpracovani bude mozna slozitejsi (a nebo znacne zjednodusene).

Parsovani ulozenych dat do NASu pro tebe vlastne znamena jen cteni SD, takze tim ji neopotrebovavas.

Pokud mas nekde webserver, na kterem ti bezi i nejake skripty, tak muzes ta historicka data (za dobu, co nebezi NAS) klidne vycist z toho arduina a zpracovat v tom skriptu a zobrazit vysledek (takze Arduino proste nasype hodnoty a velky a mocny webserver si je sam spocte a zpracuje - a protoze pro ty hodnoty Arduino tu SD jen cte, tak ji neopotrebovava)

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56

Re: Pomoc s voľbou ukladania nameraných údajov

Příspěvek od ohruska » 21 pro 2018, 09:15

Nejsem moc zběhlý v používání mySQL. Proto všechna data ukládám na thingspeak.com.
Tato služba je zadarmo.
A pokud chci zobrazit graf nebo poslední data tak si je načtu do html stránky pomocí java scriptu přímo z tohoto serveru.
Jdou zpětně načíst i do arduina.
Na tomto serveru je možné uložit až 8219 údajů za jedem den, 3000000 údajů za rok.
Ota

martinius96
Příspěvky: 580
Registrován: 01 srp 2017, 19:29
Bydliště: Poprad
Kontaktovat uživatele:

Re: Pomoc s voľbou ukladania nameraných údajov

Příspěvek od martinius96 » 21 pro 2018, 09:34

Využi trebars freehosting na php5.cz, prípadne endora ak chceš nato vlastnú aplikáciu.
Ja používam klienta Arduino na zápis i na čítanie

romanm
Příspěvky: 45
Registrován: 11 pro 2018, 23:17

Re: Pomoc s voľbou ukladania nameraných údajov

Příspěvek od romanm » 21 pro 2018, 11:33

martinius96 píše:
21 pro 2018, 09:34
Využi trebars freehosting na php5.cz, prípadne endora ak chceš nato vlastnú aplikáciu.
Ja používam klienta Arduino na zápis i na čítanie
Nechcem dáta ukladať kade-tade po nete, chcem , aby zostali v mojej sieti. V tomto prípade, keď mi bežístránka na NAS sa klient na čítanie aj zápis využiť nedá. U teba to je iné. Predpokladám, že dáta ukladáš na freehosting a potom arduinom čítaš GET response z tej istej stránky.

romanm
Příspěvky: 45
Registrován: 11 pro 2018, 23:17

Re: Pomoc s voľbou ukladania nameraných údajov

Příspěvek od romanm » 21 pro 2018, 11:40

gilhad píše:
21 pro 2018, 00:24
Otazkou je, kolik namerenych dat vlastne mas. Zvlast pokud je budes drzet ulozene v binarni podobe, nikoli jako retezce, natoz cele stranky a konvertovat je az pri vypisu. Pak by se dalo udrzet v RAM docela dlouhou historii.

Co se zapisu na SD tyce - pouzivam je v Rapsberry, (ale to je celkem jedno), bezi mi tam databaze, zapisuji se logy, provoz 24/7 a bezi tak uz nekolik let. Zvlast pokud si je vyhradis jako "externi pamet" pro ukladani tech namerenych dat, tak s trochou pece by mely vydrzet takrka neomezene dlouho (tedy, ze neodejdou kvuli zapisum, ale kvuli necemu jinemu, nebo to cele zastara). Vyjdeme-li z predpokladu, ze zapis na SD ji nici vyrazne vic nez cteni z ni a ze vlastne ji mame pro potrebu toho Arduina a ze to Arduino zvladneme udrzet v provozu "furt", nebo mu pred vypnutim dat vedet, ze ma data ulozit, nebo nam nevadi ztrata tosledniho sektoru, tak bych postupoval nasledne:
- na Arduinu bych ukladal data v RAM, dokud by jich nebylo za cely sektor (256B tusim), nebo jejich nasobek (idealne mocninu dvou), pak bych to zapsal cele naraz (a vyhnul se tim prepisovani sektoru)
- nepouzival bych filesystem, ale bral to jako ploche uloziste, tedy zacal ukladat data od sektoru nula, linearne, pri "preteceni" karty zase dokola. Nez se takto cela karta jednou zapise, tak to bude trvat docela dlouho.
- pro detekci, kde jsem skoncil, bych v datech mel "magickou hlavicku" a poradove cislo, napr. prvni 4 byty bloku (sektor, nebo ten zvoleny nasobek) by byly "DATA" a pak by nasledovalo 4bytove (nebo 8bytove, pokud bych to chtel mit na vecnost) poradove binarni cislo bloku, nacez by nasledovaly ty hodnoty.
- pokud jsou hodnoty mereny pravidelne, tak bych do bloku jen ulozil pocatecni cas, dal uz se to dopocte z periody mereni
- pokud zapisu na posledni blok SD, budu pokracovat zase tim nultym
- v RAM si budu drzet, na kolikaty blok ted budu psat, takze pocet uz zapsanych bloku se zjisti jen jednou pri startu (zacne se cist SD od zacatku, pokud blok nezacina DATAxxxx, tak je to prvni volny blok, pokud to xxxx je mensi, nez predchozi, tak je to taky prvni blok, kam budu psat a prepisuju "ocas" - klasicka fronta FIFO)
Práveže tých údajov je relatívne dosť, približne 12000 za deň. Nechcem si tie údaje držať v pamäti,kvôli výpadku napájania a pod. Priznám sa, že zápis na SD kartu som s arduinom ešte neskúšal. Myslel som, že to ide ibe cez file. So zápisom surových dát na kartu teda tiež nemám skúsenosti. Sú na to nejaké knižnice, ktoré dokážu pristupovať priamo k sektorom SD karty? Aká je tam rýchlosť vyhľadávania? Ako funguje seek dát nad takto zapísanými údajmi? Tiež je otázkou, ako vyriešiť to, aby som vedel, ktoré dáta už boli prenesené na NAS a ktoré nie.

Uživatelský avatar
gilhad
Příspěvky: 826
Registrován: 07 bře 2018, 11:22

Re: Pomoc s voľbou ukladania nameraných údajov

Příspěvek od gilhad » 21 pro 2018, 13:28

12 000/den znamena 500/hod, blok na SD karte je 512B. Otazka je, kolik je jedno dato v tvem pripade - pokud zaznamenavas jednu teplou, tak to snadno das do 1B s presnosti treba na 0.5 stupne ( v rozsahu -50 .. +70 stupnu pokud meris ve stinu a ne na rozpalene cerne desce, tak se v pohode vejdes - do bytu ulozis pocet pulstupnu od -50). V takovem pripade bys zapisoval na SD kartu 1x za hodinu a neriskoval ztratu vetsiho bloku dat, kvuli vypadku napajeni. Pokud bys mel takovych meridel treba 4 , tak budes zapisovat kazdych 15 minut a neriskujes delsi ztratu ...

Co jsem rychle probehnul zdroje, tak
https://www.arduino.cc/en/Reference/SD rika, ze je zalozeno na sdfatlib by William Greiman.
https://github.com/greiman/SdFat ta se prestehovala sem a pouziva
https://github.com/greiman/SdFat/blob/m ... ckDriver.h pro zapis na kartu, jsou tam funkce
virtual bool readBlock(uint32_t block, uint8_t* dst) = 0; pro cteni libovolneho bloku z karty
virtual bool writeBlock(uint32_t block, const uint8_t* src) = 0; pro zapis na libovoln misto

FAT je nadstavba nad blokovou strukturou disku https://cs.wikipedia.org/wiki/File_Allocation_Table a pokud ji nepotrebujes (tedy nepotrebujes soubory), tak muzes psat na disk bez ni a rezii si spravovat sam (coz ti v takto jednoduchem pripade usetri strasnou spoustu RAM a taky strasnou spoustu kodu (FLASH), ktere muzes vyuzit lepe - ten nastineny zpusob ukladani je na zdroje radove mene narocny)

Seek se dela tak, ze si proste prectes sektor dle libosti, uvidis, jestli ma spravne poradove cislo a pokud ne, tak ho muzes dopocitat a na druhy pokus se trefit, nebo konstatovat, ze takovy zaznam uz nemas (hmm 4GB to je asi 3.800.000 kB, 12kB/den je historie asi tak 300.000 dni, tedy kolem tisice let - pokud je jeden zaznam teploty 1B - to by mohlo stacit na to, aby se ta SD ani nestihla prepsat jednou dokola a drzela data za celou dobu zpet)

NASu se muzes zeptat, ktera data dostal jako posledni a poslat mu vse od toho mista dal. (Samozrejme pokud si ulozis cislo, co jsi uz poslal, tak dokud to Arduino nekdo nevypne, tak se ani ptat nemusis, posles od toho mista dal a prislusne si to cislo v pameti zvetsis.)

Pripadne muzes naivne predpokladat pri startu, ze NAS nebyl nedostupny vic jak jeden den a poslat mu data za den (nebo dva) zpatky, s tim, ze holt budou duplicity a NAS si s nima nejak poradi a snad to nebude vypnute tak dlouho, aby tam neco chybelo.

A samozrejme muzes to Arduino ciste vypnout (tedy rict mu, at ulozi vse co ma a da vedet a pak ho vypojit), vytahnout kartu a precist si to primo z ni kratkym programem na velkem pocitaci, kartu vratit, zapnout Arduino a pak v klidu desifrovat ulozeny obsah karty.

Rychlost vyhledavani ti nereknu, zalezi na parametrech te karty, ctecky a asi milionu jinych veci, ale pravdepodobne te zajimat nemusi - urcite je rychlejsi, nez prez souborovy system a pokud to ctes po jednotlivych sektorech, tak jeden sektor je precteny bleskove (seekovat nemusis, posles primo adresu). Teda, uvnitr interruptu bych to asi nedelal a pokud mam neco na interruptech zavisle, tak bych to s nima nejak vtipne synchronizoval, ale asi mluvime o milisekundach.

ten seek funguje tak, ze kdyz chci sektor 1234, tak zavolam neco jako readBlock(1234,&buffer), karta naadresuje bunku 1234 (pro ni je to jako pro tebe cist hodnotu z pole na prislusnem indexu) a posle prislusnych 512B, ktere skonci v tom bufferu. prenos tech 512B z karty do pameti na tom trva nejdele.

---

Samopzrejme jde pouzit i jine knihovny, urcite jich existuje asi tak milion a nebo si najit specifikace SD ctecky a napsat si to sam, ale tohle bylo, co se da najit strasne snano a rychle a zaroven to je zminovano oficialni dokumentaci.

A nejspis, pokud mas na disku uz tu SD knihovnu od Arduina, tak presne tyhle funkce obsahuje taky nekde, takze staci pohledat na lokalnim disku a pouzit to, co pouziva ofiko arduino primo z jehop ofiko knihovny - jen si to vytahnes ven samostatne, abys netahal veskery ten FAT balast okolo.

(A poznamka na zaver - Arduino je urceno pro humanitni umelce a tak jim co nejvic "usnadnuje zivot" i za cenu toho, ze pred nima schova vsechny ostre noze, aby se nemohli riznout, i za cenu, ze mekkou veku budou pizlat plastovou lzici deset minut - takze jejich zdrojaky podle toho vypadaji - na efektivitu se moc nehraje, na korektnost jen do te miry, aby to uzivatel nemel nahodou slozite a kdyz obcas neco sleti, tak to sleti, stejne je to urceno jen na hrani. Hlavne pred uzivatelem nejak zamaskovat vetsinu chyb a problemu, aby se nam nahodou neleknul - da se s tim zit, ale da se z toho HW ziskat i mnohem vic - staci se nebat a ucit. (Jo a pokud pri zkoumani zdrojaku narazis na neco, co ti prijde jako blbost, tak neni vylouceno, ze to doopravdy blbost je.))

Uživatelský avatar
pavel1tu
Příspěvky: 2057
Registrován: 26 říj 2017, 08:28
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Pomoc s voľbou ukladania nameraných údajov

Příspěvek od pavel1tu » 21 pro 2018, 16:18

Zdravím,
řešil jsem obdobné dilema, vůbec nový NAS který si vezme 35W :-)

Tak jak někteří mají problém s mySQL já mám problém s SD kartami, vždy po půl roce šla do kytek (ta u Arduina).
Data jsem zatisoval do TXT ve formátu XML který pak šlo jednoduše importovat do SQL databáze.

Druhý stupeň byl půjčené Rasbery a SD karta - opět problém s SD kartou (není stavěný na chod WWW serveru s mySQL - časté zápisy)

Teď jsem v další fázi, z německa mám bazarové BananaPi M1 (asi nejlevnější zařízení co lze sehnat se SATA portem) + starší SSD 16G - celkem za necelých 500Kč. Rozeběhl jsem na tom Armbian + LAMP. Zatím bojuji s mySQL - nějak jsem potratil heslo ROOTa, ale jinak vše běží a spotřeba je super.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host